神经网络中反向传播的验证集

我有一个神经网络模型,目前我正在运行训练集的前向传播,计算误差,并调整权重。

据我所知,在处理完每个训练集样本后,我需要运行一个来自验证集的样本进行前向传播并计算误差。当验证集的误差不再减少,而训练集的误差仍在减少时,就应该停止训练,因为此时开始出现过拟合现象。停止训练后,我们使用测试集来计算网络中的误差。

如果有任何错误,请纠正我。

我的问题是我们比较的是什么误差?我们只是比较输出层的误差吗?还是比较每个节点的误差?如果是后者,我们如何定义网络的总体误差,是简单地将所有误差相加吗?


回答:

我的问题是我们比较的是什么误差?

我们只比较输出层的误差。因此,如果你绘制误差与轮次的图表,你会看到两条曲线。训练误差的曲线会随着轮次的增加而下降。但验证误差的曲线会在某一点开始上升之前下降。这表明出现了过拟合,你需要找到验证误差最低的最后一个点。

请注意,你在谈论每个单独的样本,而我在谈论轮次。对于批处理方法,这些误差通常在一个数据集(训练或验证)迭代后绘制。因此,图表上的每个点是该轮次的平均误差或均方误差。


另外,如果我们有多个输出,我们只是简单地将输出层的误差相加,还是应该使用某种加权和?

对于多输出情况,这很有趣。我们基本上是在寻找提前停止训练权重的最佳点。在多输出网络的最后一层,权重是使用不同的误差导数进行训练的,可能有不同的最佳提前停止点。如果你认为情况如此,你可能需要分别绘制它们。否则,简单地将误差相加就足够了。加权和意味着你更关心优化某个输出而不是另一个,即使这会导致其他输出过度或不足训练。

如果你考虑实现单独的提前停止点,你可以使用均方误差的总和来获得所有依赖于所有误差导数的内部权重的停止点。对于最后一层的权重,使用它们对应的均方误差来获得它们的单独停止点。

假设我有60%的训练集,20%的验证集和20%的测试集。对于每个轮次,我运行60个训练集样本,同时调整每个样本的权重,并计算每个验证样本的误差。

另一种更新权重的方法是计算每个样本的更新,然后在轮次结束时应用所有更新的平均值。如果你的训练数据中有噪声/异常值/误分类样本,这很好。例如,几个异常值不会大幅扭曲权重,因为它们的“坏”更新会被其他“好的”更新平均掉。

由于验证样本的数量只有训练样本的三分之一,我是否需要在每个轮次中运行验证集三次?

我们为什么要迭代验证集?我们计算验证集的误差是为了获得权重更新吗?不是。我们所有的更新都只使用训练集进行。验证集只是用来查看我们的训练模型在训练数据之外的泛化能力。可以把它看作是在测试集测试之前的测试。现在,在每个轮次中运行验证集三次有意义吗?没有意义。

我在线学习时使用最后计算的权重,对吗?

是的。误差计算和权重更新是在新样本进来时进行的。

当我们使用测试集计算最终模型的误差时,我们使用均方误差还是使用哪种误差并不重要?

如果你的模型产生的是实数值输出,那么使用均方误差。如果你的系统试图解决分类问题,使用分类误差。即10%的分类误差,意味着在测试过程中,10%的测试集被你的模型误分类。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注