如何在神经网络中使用k折交叉验证

Ort*_*ixx 32 validation machine-learning backpropagation neural-network

我们正在编写一个小型ANN,它应该根据10个输入变量将7000个产品分类为7个类.

为了做到这一点,我们必须使用k折交叉验证,但我们有点困惑.

我们从演示幻灯片中摘录了这些内容:

k折交叉验证图

什么是验证和测试集?

根据我们的理解,我们通过3个训练集并调整权重(单个纪元).然后我们如何处理验证?因为根据我的理解,测试集用于获取网络的错误.

接下来发生的事情也让我感到困惑.交叉是什么时候发生的?

如果要问的话不是太多,那么我们将不胜感激

JoE*_*anO 83

你似乎有点困惑(我记得我也是)所以我会为你简化一些事情.;)

示例神经网络场景

每当您获得诸如设计神经网络之类的任务时,您通常也会获得用于培训目的的样本数据集.让我们假设您正在训练一个简单的神经网络系统Y = W · X,其中Y通过计算W具有给定样本向量的权向量的标量积(·)来计算输出X.现在,解决这个问题的天真方法是使用1000个样本的整个数据集来训练神经网络.假设训练收敛并且您的权重稳定,则可以安全地说您的网络将正确地对训练数据进行分类.但是,如果出现以前看不见的数据,网络会发生什么?显然,这种系统的目的是能够概括和正确分类除用于训练的数据之外的数据.

过度拟合解释

然而,在任何现实世界的情况下,只有在您的神经网络被部署在生产环境中时,以前看不见的/新数据才可用.但是,由于你没有充分测试它,你可能会遇到不好的时间.:)任何学习系统几乎完美地匹配其训练集但不断发生故障的现象称为过度拟合.

三套

这里有算法的验证和测试部分.让我们回到1000个样本的原始数据集.你要做的就是把它分成三组- 培训,验证测试(Tr,VaTe) -采用精心挑选的比例.(80-10-10)%通常是一个很好的比例,其中:

  • Tr = 80%
  • Va = 10%
  • Te = 10%

培训和验证

现在发生的是神经网络在Tr集合上训练并且其权重被正确更新.Va然后使用验证集来E = M - Y使用训练产生的权重来计算分类误差,其中M是从验证集中获得的预期输出向量,并且Y是由分类(Y = W * X)得到的计算输出.如果误差高于用户定义的阈值,则重复整个训练验证时期.当使用验证集计算的误差被认为足够低时,该训练阶段结束.

智能培训

现在,这里的一个聪明的诡计是从每个时期迭代的总集合中随机选择用于训练和验证的样本Tr + Va.这可确保网络不会过度适应训练集.

测试

Te然后使用测试集来测量网络的性能.这些数据非常适用于此目的,因为它在整个培训和验证阶段从未使用过.它实际上是一小组先前看不见的数据,它们应该模仿在生产环境中部署网络后会发生什么.

如上所述,再次根据分类误差测量性能.性能也可以(或者甚至应该)在精度和召回方面进行测量,以便知道错误发生的位置和方式,但这是另一个问答的主题.

交叉验证

在理解了这种训练验证测试机制之后,可以通过执行K折叠交叉验证来进一步加强网络防止过度拟合.这在某种程度上是我上面解释的智能诡计的演变.该技术包括执行ķ轮训练验证-测试上的,不同的,非重叠的,同样匀称Tr,VaTe.

给定k = 10,对于K的每个值,您将数据集拆分为Tr+Va = 90%,Te = 10%并且您将运行算法,记录测试性能.

k = 10
for i in 1:k
     # Select unique training and testing datasets
     KFoldTraining <-- subset(Data)
     KFoldTesting <-- subset(Data)

     # Train and record performance
     KFoldPerformance[i] <-- SmartTrain(KFoldTraining, KFoldTesting)

# Compute overall performance
TotalPerformance <-- ComputePerformance(KFoldPerformance)
Run Code Online (Sandbox Code Playgroud)

过度拟合

我正在从维基百科上下面的世界着名的情节,以显示验证集如何帮助防止过度拟合.蓝色的训练误差随着时期数量的增加而趋于减少:因此网络试图精确匹配训练集.另一方面,验证错误(红色)遵循不同的U形轮廓.曲线的最小值是理想情况下应该停止训练,因为这是训练和验证误差最低的点.

通过验证神经网络减少过度拟合

参考

如需更多参考资料,这本优秀的书籍将为您提供机器学习以及几种偏头痛的良好知识.由您决定是否值得.:)

  • @JoErNanO使用这种方法,您将拥有具有相同架构但权重不同的k个网络。您在生产环境中使用哪个网络?如果是这些单个网络的组合,那么如何将它们组合? (3认同)

Ben*_*son 5

  1. 将您的数据划分为K个非重叠折叠。让每折K包含来自m个类的每一个的相等数量的项目(分层交叉验证;如果您有A类的100个项目和B类的50个项目,并且进行了2折验证,则每个折应随机包含50个项目来自A,来自B的25)。

    1. 对于1..k中的i:

      • 在测试折痕中指定折痕
      • 指定其余的k-1折中的一个验证折数(这可以是随机的,也可以是i的函数,并不重要)
      • 指定所有剩余的折叠次数
      • 对您的训练数据进行网格搜索以搜索所有自由参数(例如,学习率,隐藏层中的神经元数量)训练,并根据验证数据计算损失。选择参数使损失最小化
      • 使用带有获胜参数的分类器来评估测​​试损失。累积结果

现在,您已经收集了所有折叠的汇总结果。这是您的最终表演。如果您打算将其实际应用到野外,请使用网格搜索中的最佳参数来训练所有数据。