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

时间:2014-09-17 11:43:02

标签: validation machine-learning neural-network backpropagation

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

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

我们从演示幻灯片中摘录:

k-fold cross validation diagram

验证和测试集究竟是什么?

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

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

如果问题不是太多,那么将会赞赏一个子弹列表

2 个答案:

答案 0 :(得分:76)

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

示例神经网络方案

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

过度拟合解释

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

三套

这里有验证和测试部分的算法。让我们回到1000个样本的原始数据集。您所做的是将其分为三组 - 培训验证测试TrVaTe) - 使用精心挑选的比例。 (80-10-10)%通常是一个很好的比例,其中:

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

培训和验证

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

智能培训

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

测试

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

如上所述,再次根据分类误差测量性能。性能也可以(或者甚至应该)用precision and recall来衡量,以便知道错误发生的位置和方式,但这是另一个Q& A的主题。

交叉验证

在理解了这种训练验证测试机制之后,可以通过执行K-fold cross-validation来进一步加强网络防止过度拟合。这在某种程度上是我上面解释的智能诡计的演变。该技术涉及对不同的,非重叠的,同等比例的TrVaTe执行K轮训练验证测试。< / p>

给定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)

过度拟合

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

Overfitting reduced by validating neural network

参考

如需更多参考资料,this excellent book将为您提供机器学习以及多种偏头痛的良好知识。由您决定是否值得。 :)

答案 1 :(得分:3)

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

    1. 对于i in 1..k:

      • 指定折叠测试折叠
      • 指定剩余的k-1折叠中的一个验证折叠(这可以是随机的或者是i的函数,并不重要)
      • 指定训练折叠的所有剩余折叠
      • 对您的训练数据中的所有免费参数(例如学习率,隐藏层中的神经元数量)进行网格搜索,并计算验证数据的计算损失。选择最小化损失的参数
      • 使用带有获胜参数的分类器来评估测​​试损失。累积结果
  2. 您现在已经收集了所有折叠的汇总结果。这是你的最后表现。如果您打算在野外使用它,请使用网格搜索中的最佳参数来训练所有数据。