我们正在编写一个小型人工神经网络(ANN),该网络应根据10个输入变量将7000个产品分类为7个类别。
为了实现这一目标,我们必须使用k折交叉验证,但我们对此有些困惑。
我们从演示幻灯片中摘录了以下内容:
验证集和测试集到底是什么?
据我们所知,我们会遍历3个训练集并调整权重(单个周期)。然后我们该如何处理验证集呢?因为据我所知,测试集是用来获取网络错误的。
接下来发生的事情也让我感到困惑。交叉验证何时进行?
如果不麻烦的话,能否提供一个步骤列表?
回答:
你似乎有点困惑(我记得我当初也是这样),所以我会为你简化这些内容。;)
神经网络示例场景
每当你被赋予设计神经网络的任务时,通常也会提供一个用于训练的样本数据集。假设你正在训练一个简单的神经网络系统 Y = W · X
,其中 Y
是通过计算权重向量 W
与给定样本向量 X
的标量乘积(·)计算得出的输出。现在,简单的方法是使用整个数据集,例如1000个样本来训练神经网络。假设训练收敛并且你的权重稳定,你可以安全地说你的网络将正确分类训练数据。但是,如果网络遇到之前未见过的数据会怎样呢?显然,这类系统的目的是能够泛化并正确分类除训练数据之外的其他数据。
过拟合解释
然而,在任何现实世界的情况下,之前未见过的新数据只有在你的神经网络部署到我们称之为生产环境中时才可用。但由于你没有充分测试它,你可能会遇到麻烦。:) 任何学习系统几乎完美地匹配其训练集但在面对未见数据时不断失败的现象被称为过拟合。
三个数据集
此时,算法的验证和测试部分就派上用场了。让我们回到最初的1000个样本的数据集。你要做的就是将其分成三个数据集——训练、验证和测试(Tr
、Va
和Te
)——使用仔细选择的比例。(80-10-10)%通常是一个好的比例,其中:
Tr = 80%
Va = 10%
Te = 10%
训练和验证
现在发生的情况是,神经网络在 Tr
集上进行训练,其权重被正确更新。然后使用训练得到的权重在验证集 Va
上计算分类误差 E = M - Y
,其中 M
是从验证集中取出的预期输出向量,Y
是分类计算得出的输出(Y = W * X
)。如果误差高于用户定义的阈值,则整个训练-验证周期将被重复。当使用验证集计算的误差被认为足够低时,此训练阶段结束。
智能训练
现在,一个聪明的策略是在每次周期迭代时从总集 Tr + Va
中随机选择用于训练和验证的样本。这确保了网络不会过拟合训练集。
测试
然后使用测试集 Te
来测量网络的性能。这些数据非常适合此目的,因为它们在整个训练和验证阶段从未被使用过。这实际上是一小组之前未见过的数据,旨在模拟网络在生产环境中部署后会发生的情况。
性能再次以如上所述的分类误差来衡量。性能也可以(或者甚至应该)以精确度和召回率来衡量,以便了解错误发生的位置和方式,但这是另一个问答的主题。
交叉验证
理解了这个训练-验证-测试机制后,可以通过执行K折交叉验证进一步增强网络以对抗过拟合。这在某种程度上是我上面解释的智能策略的演变。这种技术涉及在不同的、不重叠的、比例相等的 Tr
、Va
和 Te
集上进行K轮训练-验证-测试。
给定 k = 10
,对于每个K值,你将把数据集分成 Tr+Va = 90%
和 Te = 10%
,并运行算法,记录测试性能。
k = 10for i in 1:k # 选择独特的训练和测试数据集 KFoldTraining <-- subset(Data) KFoldTesting <-- subset(Data) # 训练并记录性能 KFoldPerformance[i] <-- SmartTrain(KFoldTraining, KFoldTesting)# 计算总体性能TotalPerformance <-- ComputePerformance(KFoldPerformance)
展示过拟合
我从维基百科中引用了下面这个世界著名的图表,以展示验证集如何帮助防止过拟合。训练误差(蓝色)随着周期数的增加而趋于减少:因此,网络正在尝试完全匹配训练集。另一方面,验证误差(红色)遵循不同的U形曲线。曲线的最低点是理想的训练停止点,因为这是训练和验证误差最低的点。
参考资料
如需更多参考资料,这本优秀的书将为你提供关于机器学习的扎实知识以及几次头痛。由你决定是否值得。:)