在训练深度学习网络(比如使用TensorFlow或类似工具)时,通常会对一组固定的样本进行训练,并希望随着训练时间的延长,结果会变得更好。但这假设准确率是单调递增的,如下图所示,这显然不是真的。下图显示,在“2.0”处停止训练的准确率会更好十个百分点。有没有选择更好的模型并保存它们的常见程序?换句话说,是否有一种峰值检测例程?或许,可以在整个训练过程中跟踪测试准确率,并且在准确率高于之前的值时保存模型(检查点?)。
问题:
- 选择最佳模型的最佳实践是什么?
- TensorFlow是否有这方面的功能?
- 是否有继续训练更长时间(可能更长时间)的价值,基于优化器最终会找到更好的解决方案的理论?
- 检查点是最佳的保存方法吗?
编辑:感谢@Wontonimo的建议,改进后的准确率结果如下所示。进行了以下更改:
- 将Adam优化器的学习率从0.003降低到0.001
- 添加两个额外的dropout层(概率=0.5)
- 从完整数据集中随机选择训练帧(而不是顺序选择)
- 增加训练迭代次数50%。
有了这些变化,似乎继续训练甚至更长时间会更有利。可能还需要增加更多的正则化。
回答:
这突显了机器学习中的两个常见问题
- 1 : 学习率不稳定
- 2 : 过于乐观
学习率不稳定首先让我们谈谈学习率不稳定。你的图表显示错误率先是改善,然后突然之间,好像神经网络看到了某些数据,使之前的所有经验都无效了,它对问题的全部理解被颠覆了。如果我们从训练动物或人的角度来思考,这可能会发生在我们过于重视下一次训练结果而不是采取长远观点的时候。业内人士谈论学习率衰减,这类似于说“一旦你有了基本的理解,就对你的心理模型进行小的调整”。
具体来说,考虑将你的学习率降低到原来的1/2或1/3。此外,尝试使用更robust的学习算法。如果你使用的是梯度下降法,那么尝试使用基于动量的梯度下降法。最后,如果你看到测试准确率出现剧烈波动,再次将学习率降低到原来的1/2或1/3。如果你在最后一层没有使用像dropout这样的正则化器,这也可以帮助保持你的训练结果与测试结果密切相关,从而避免过拟合。
过于乐观你提到希望在获得好结果时停止训练。你忽略了你的模型实际上并没有收敛。忽略糟糕的结果是对模型过于乐观。
我认为,如果你的模型能够达到0.8,它显示出很大的潜力。像动量和dropout这样的小变化将稳定你的结果。
更新:小批量经过对你的旧图表和新图表的多次审查,并考虑到评论,看起来你可以通过使用更大的小批量来显著减少噪声。考虑将你的批量大小增加10倍。你的图表非常像是SGD,或者批量大小足够小以至于有类似的结果。在将损失函数发送到Adam之前,跨批量结果平均你的损失函数以获得好处是很重要的。如果你这样做,你可能需要运行多达10倍的epoch,但你会看到更平滑的图表。