什么是早停?
在训练神经网络时,需要对使用的设置(超参数)作出许多决策,以便获得良好的性能。一旦这样的超参数是训练epochs的数目:也就是说,数据集(epochs)的完整传递应该有几次?如果我们使用太少的epochs,我们可能欠拟合(即,不能从训练数据中学习我们能学的所有);如果我们使用太多的epochs,我们可能过拟合(即,在训练数据中拟合“噪声”,而不是信号)。
早停尝试删除手动设置该值的需要。它也可以被认为是一种正则化方法(如L1/L2权重衰减和丢弃),因为它可以阻止网络过拟合。
早停的思想相对简单:
- 将数据分割成训练集和测试集
- 在每个epoch的末尾(或每N个epoch):
- 评估测试集上的网络性能
- 如果网络性能超过以前的最佳模型:在当前epoch保存网络的副本
- 作为最终模型,具有最佳测试集性能的模型
文章图片
Early Stopping
文章图片
image.gif ?
最好的模型是在垂直虚线时保存的模型,即在测试集上具有最高准确率的模型。
使用DL4J的早停功能需要你提供一些配置选项:
- 得分计算器,如多层网络的DataSetLossCalculator(JavaDoc, Source Code)或计算图的DataSetLossCalculatorCG (JavaDoc, Source Code)。用于在每个epoch进行计算(例如:测试集上的损失函数值或测试集上的准确率)
- 我们想要计算分数函数的频率(默认值:每个epoch)
- 一个或多个终止条件,它告诉训练过程何时停止。停止条件有两类:
- Epoch终止条件:每N个epoch评估
- 迭代终止条件: 每个小批量评估一次
- 一个模型保存器,它定义了如何保存模型。
MultiLayerConfiguration myNetworkConfiguration = ...;
DataSetIterator myTrainData = https://www.it610.com/article/...;
DataSetIterator myTestData = ...;
EarlyStoppingConfiguration esConf = new EarlyStoppingConfiguration.Builder()
.epochTerminationConditions(new MaxEpochsTerminationCondition(30))
.iterationTerminationConditions(new MaxTimeIterationTerminationCondition(20, TimeUnit.MINUTES))
.scoreCalculator(new DataSetLossCalculator(myTestData, true))
.evaluateEveryNEpochs(1)
.modelSaver(new LocalFileModelSaver(directory))
.build();
EarlyStoppingTrainer trainer = new EarlyStoppingTrainer(esConf,myNetworkConfiguration,myTrainData);
//执行早停训练
EarlyStoppingResult result = trainer.fit();
//打印结果
System.out.println("Termination reason: " + result.getTerminationReason());
System.out.println("Termination details: " + result.getTerminationDetails());
System.out.println("Total epochs: " + result.getTotalEpochs());
System.out.println("Best epoch number: " + result.getBestModelEpoch());
System.out.println("Score at best epoch: " + result.getBestModelScore());
//得到最佳模型:
MultiLayerNetwork bestModel = result.getBestModel();
文章图片
image.gif 你还可以实现自己的迭代和epoch终止条件。
早停并行包装器 上面描述的早停实现将仅用于单个设备。然而,
EarlyStoppingParallelTrainer
提供与早期停止类似的功能,并允许你为多个CPU或GPU进行优化。EarlyStoppingParallelTrainer
将你的模型包装在ParallelWrapper
类中,并执行本地化的分布式训练。请注意,
EarlyStoppingParallelTrainer
并不支持作为其单个设备使用时所具有的所有功能。它不是UI兼容的,可能无法与复杂的迭代监听器一起工作。这是由于模型是在后台分发和复制的机置引起的。API AutoencoderScoreCalculator 自编码器得分计算器
[源码]
一个多层网络或单个计算图的得分函数
ClassificationScoreCalculator 分类得分计算器
[源码]
作为多层网络和计算图的准确率、F1得分等。
DataSetLossCalculator 数据集损失计算器
[源码]
计算给定数据集(通常是测试集)上的得分(损失函数值)
DataSetLossCalculatorCG
[源码]
给定一个 DataSetIterator: 在该数据集上计算模型的总损失。通常用于计算测试集上的损失。
ROCScoreCalculator
[源码]
计算多层网络或计算图的ROC AUC(ROC曲线下的面积)或AUCPR(精确召回曲线下的区域)
RegressionScoreCalculator
[源码]
在测试集上计算网络(MultiLayerNetwork或ComputationGraph)的回归分数
VAEReconErrorScoreCalculator
[源码]
多层网络或计算图的变分自编码器重建误差的得分函数。VariationalAutoencoder 层必须是网络中的第一层。
VAEReconErrorScoreCalculator(RegressionEvaluation.Metric metric, DataSetIterator iterator)
public VAEReconErrorScoreCalculator(RegressionEvaluation.Metric metric, DataSetIterator iterator)
文章图片
image.gif 重建误差的构造函数
- 参数 metric
- 参数 iterator
[源码]
用于多层网络或计算图的变分自编码器重建概率或重建对数概率的得分计算器。VariationalAutoencoder 层必须是网络中的第一层。
VAEReconProbScoreCalculator(DataSetIterator iterator, int reconstructionProbNumSamples, boolean logProb)
public VAEReconProbScoreCalculator(DataSetIterator iterator, int reconstructionProbNumSamples, boolean logProb)
文章图片
image.gif 平均重建概率的构造函数
- 参数 iterator 迭代器
- 参数 reconstructionProbNumSamples 示例数量。 详见 {- link VariationalAutoencoder#reconstructionProbability(INDArray, int)}
- 参数 logProb 如果是 true: 计算 (负)对数概率。 false: 概率
[源码]
由 Sadat Anwar 创建于 3/26/16.
一旦达到预期分数,就停止训练。通常,如果当前分数低于初始化分数,则停止。如果希望一旦分数增加就停止训练,则将定义的分数设置lesserBetter设为false(请随意给该标志起一个更好的名称)
initialize
public void initialize()
文章图片
image.gif
- 弃用 “lessBetter” 参数不再使用
[源码]
终止训练,如果最好的模型得分没有在N个epoch内得到改善
翻译:风一样的男子
文章图片
image 【DL4J中文文档/调优与训练/早停】如果您觉得我的文章给了您帮助,请为我买一杯饮料吧!以下是我的支付宝,意思一下我将非常感激!
文章图片
image