一,train loss与test loss结果分析
- train loss 不断下降,test loss不断下降,说明网络仍在学习;
- train loss 不断下降,test loss趋于不变,说明网络过拟合;
- train loss 趋于不变,test loss不断下降,说明数据集100%有问题;
- train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;
- train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。
https://zhuanlan.zhihu.com/p/136786657
如何解决神经网络训练时loss不下降的问题
https://blog.ailemon.net/2019/02/26/solution-to-loss-doesnt-drop-in-nn-train/
二,训练过程中的梯度检验
使用相对误差做比较,这是实际工程中需要提到的另外一点,在我们得到数值梯度和解析梯度之后,我们如何去比较两者?第一反应是作差对吧,或者顶多求一个平方。但是用绝对值是不可靠的,假如两个梯度的绝对值都在1.0左右,那么我们可以认为1e-4这样一个差值是非常小的,但是如果两个梯度本身就是1e-4级别的,那这个差值就相当大了。所以我们考虑相对误差:
加max项的原因很简单:整体形式变得简单和对称。再提个小醒,别忘了避开分母中两项都为0的情况。OK,对于相对误差而言:
相对误差>1e-2意味着你的实现肯定是有问题的
1e-2>相对误差>1e-4,你会有点担心
1e-4>相对误差,基本是OK的,但是要注意极端情况(使用tanh或者softmax时候出现kinks)那还是太大
1e-7>相对误差,放心大胆使用
哦,对对,还有一点,随着神经网络层数增多,相对误差是会增大的。这意味着,对于10层的神经网络,其实相对误差也许在1e-2级别就已经是可以正常使用的了。
使用双精度浮点数。如果你使用单精度浮点数计算,那你的实现可能一点问题都没有,但是相对误差却很大。实际工程中出现过,从单精度切到双精度,相对误差立马从1e-2降到1e-8的情况。
三,训练过程中的监控
开始训练之后,我们可以通过监控一些指标来了解训练的状态。我们还记得有一些参数是我们认为敲定的,比如学习率,比如正则化系数。
损失/loss随每轮完整迭代后的变化
下面这幅图表明了不同的学习率下,我们每轮完整迭代(这里的一轮完整迭代指的是所有的样本都被过了一遍,因为随机梯度下降中batch size的大小设定可能不同,因此我们不选每次mini-batch迭代为周期)过后的loss应该呈现的变化状况:
合适的学习率可以保证每轮完整训练之后,loss都减小,且能在一段时间后降到一个较小的程度。太小的学习率下loss减小的速度很慢,如果太激进,设置太高的学习率,开始的loss减小速度非常可观,可是到了某个程度之后就不再下降了,在离最低点一段距离的地方反复,无法下降了。下图是实际训练CIFAR-10的时候,loss的变化情况:
大家可能会注意到上图的曲线有一些上下跳动,不稳定,这和随机梯度下降时候设定的batch size有关系。batch size非常小的情况下,会出现很大程度的不稳定,如果batch size设定大一些,会相对稳定一点。
然后我们需要跟踪一下训练集和验证集上的准确度状况,以判断分类器所处的状态(过拟合程度如何):
随着时间推进,训练集和验证集上的准确度都会上升,如果训练集上的准确度到达一定程度后,两者之间的差值比较大,那就要注意一下,可能是过拟合现象,如果差值不大,那说明模型状况良好。
https://blog.csdn.net/u011534057/article/details/51452564
四,Keras的BN层能彻底解决过拟合问题吗?
解决方法:
- 扩大数据集,方法很多不管是加更多的新图还是数据增强;
- 早停策略,减少epoch,或者提前终止迭代可以有效的控制权值参数的大小,从而降低模型的复杂度;
- 权值衰减,在神经网络模型中,可使用权值衰减的方法,即每次迭代过程中以某个小因子降低每个权值;
- 保留验证数据集,对训练成果进行验证; 获取额外数据进行交叉验证; 正则化,即在进行目标函数或代价函数优化时,在目标函数或代价函数;
- 权值共享,最常见的就是在卷积神经网络中,权值共享的目的旨在减小模型中的参数,同时还能较少计算量,在循环神经网络中也用到了权值共享。
- 增加噪声,这也是深度学习中的一种避免过拟合的方法,添加噪声的途径有很多,可以在输入数据上添加,增大数据的多样性,可以在权值上添加噪声,这种方法类似于L2正则化。
- Batch Normalization。BM算法会将每一层的输入值做归一化处理,并且会重构归一化处理之后的数据,确保数据的分布不会发生变化。而且有很多变种,比如Layerr Normalization,在RNN或者Transformer中用的比较多。上面的几种方法都是操作在一个模型上,通过改变模型的复杂度来控制过拟合。 另一种可行的方法是结合多种模型来控制过拟合。
- Bagging和Boostin,Bagging和Boosting是机器学习中的集成方法,多个模型的组合可以弱化每个模型中的异常点的影响,保留模型之间的通性,弱化单个模型的特性。
- Dropout,是深度学习中最常用的控制过拟合的方法,主要用在全连接层处。Dropout方法是在一定的概率上(通常设置为0.5,原因是此时随机生成的网络结构最多)隐式的去除网络中的神经元。
https://www.cnblogs.com/jiangxinyang/p/9281107.html
四,总结
- 用一部分的数据测试你梯度计算是否正确,注意提到的注意点。 检查你的初始权重是否合理,在关掉正则化项的系统里,是否可以取得100%的准确度。
- 在训练过程中,对损失函数结果做记录,以及训练集和交叉验证集上的准确度。
- 最常见的权重更新方式是SGD+Momentum,推荐试试RMSProp自适应学习率更新算法。 随着时间推进要用不同的方式去衰减学习率。
- 用交叉验证等去搜索和找到最合适的超参数。 记得也做做模型融合的工作,对结果有帮助。