何时停止训练 - LOOV MLP
When to stop training - LOOV MLP
我是 运行 一个 MLP,用于将一组值分类为 10 个不同的 类。
简化下来,我有一个声纳,它能为我提供 400 "readings" 个物体。每个读数都是 1000 个浮点值的列表。
我总共扫描了 100 个对象,想对它们进行分类并基于留一法交叉验证评估模型。
对于每个对象,我将数据分成 99 个对象的训练集和剩余对象的测试集。我将训练集(99 个对象,99*400 "readings")输入 MLP,并使用测试集(1 个对象,1*400“读数”)进行验证。
我的问题是:我怎么知道要使用哪个训练时期作为最终 "best" 模型? 我在谷歌上搜索了一下,有些人说要使用哪个时期具有最佳的验证准确性,但这对我来说似乎是在作弊。我不应该只根据训练数据的统计数据来选择模型吗? (我的想法是,训练中的随机权重重组可能会人为地产生高验证精度,而实际上并不能为将来可以扫描的新对象提供有用的模型)
SO 回答说要使用提供最佳验证准确性的训练时期:
whats is the difference between train, validation and test set, in neural networks?
最好的,
甲板清洗机
您想优化您的 generalization/true-error(我对看不见的数据的预测有多好),通常包括(参见 here 的论文,包括这个概念;尽管在另一个上下文中 -> SGD + SVM):
- 近似误差:你的模型描述的数据有多好
- 估计误差:最小化经验风险而不是预期风险的影响
- optimization-error:衡量近似优化对预期风险的影响
- 优化
可以通过 运行 优化器更长的时间(这是您的变量)来减少错误
你看,true-error 仅部分由你的优化错误(决定何时停止)描述,但一个好的交叉验证方案可以更多关于真实错误的 description/evaluation 的精确度(这基本上是完成 CV 的原因;需要付出一定的代价)。因此,基于 CV 的时代选择非常普遍。
当然,让交叉验证方案更加合理也很重要。经常使用 k 不太小的基于 k 折的方案(至少在非 NN 应用中;对于 NN 来说可能成本太高)。
决定何时停止的一种方法是评估测试集(或验证集)的准确性并在每个时期后打印出来。一旦达到最大纪元,您就可以停止它。
另一种方法是 pickle(在 python 中)或序列化(在 Java 中)并将权重和偏差集存储在文件或磁盘中(如果当前权重和偏差的准确性)优于当前最大值
这叫做提前停止。
你需要的是验证集。
-在每个时期之后,计算您想要的验证集评估指标。
-始终将验证集上性能最佳的模型的参数保存在变量中。
-如果两次或 n 次迭代验证结果没有改善,则停止 epochs 并使用性能最佳的参数重置 MLP。
-然后使用您之前保存的验证集上表现最好的模型计算测试集的结果。
我是 运行 一个 MLP,用于将一组值分类为 10 个不同的 类。
简化下来,我有一个声纳,它能为我提供 400 "readings" 个物体。每个读数都是 1000 个浮点值的列表。
我总共扫描了 100 个对象,想对它们进行分类并基于留一法交叉验证评估模型。
对于每个对象,我将数据分成 99 个对象的训练集和剩余对象的测试集。我将训练集(99 个对象,99*400 "readings")输入 MLP,并使用测试集(1 个对象,1*400“读数”)进行验证。
我的问题是:我怎么知道要使用哪个训练时期作为最终 "best" 模型? 我在谷歌上搜索了一下,有些人说要使用哪个时期具有最佳的验证准确性,但这对我来说似乎是在作弊。我不应该只根据训练数据的统计数据来选择模型吗? (我的想法是,训练中的随机权重重组可能会人为地产生高验证精度,而实际上并不能为将来可以扫描的新对象提供有用的模型)
SO 回答说要使用提供最佳验证准确性的训练时期:
whats is the difference between train, validation and test set, in neural networks?
最好的, 甲板清洗机
您想优化您的 generalization/true-error(我对看不见的数据的预测有多好),通常包括(参见 here 的论文,包括这个概念;尽管在另一个上下文中 -> SGD + SVM):
- 近似误差:你的模型描述的数据有多好
- 估计误差:最小化经验风险而不是预期风险的影响
- optimization-error:衡量近似优化对预期风险的影响
- 优化 可以通过 运行 优化器更长的时间(这是您的变量)来减少错误
你看,true-error 仅部分由你的优化错误(决定何时停止)描述,但一个好的交叉验证方案可以更多关于真实错误的 description/evaluation 的精确度(这基本上是完成 CV 的原因;需要付出一定的代价)。因此,基于 CV 的时代选择非常普遍。
当然,让交叉验证方案更加合理也很重要。经常使用 k 不太小的基于 k 折的方案(至少在非 NN 应用中;对于 NN 来说可能成本太高)。
决定何时停止的一种方法是评估测试集(或验证集)的准确性并在每个时期后打印出来。一旦达到最大纪元,您就可以停止它。
另一种方法是 pickle(在 python 中)或序列化(在 Java 中)并将权重和偏差集存储在文件或磁盘中(如果当前权重和偏差的准确性)优于当前最大值
这叫做提前停止。
你需要的是验证集。
-在每个时期之后,计算您想要的验证集评估指标。
-始终将验证集上性能最佳的模型的参数保存在变量中。
-如果两次或 n 次迭代验证结果没有改善,则停止 epochs 并使用性能最佳的参数重置 MLP。
-然后使用您之前保存的验证集上表现最好的模型计算测试集的结果。