模型在训练过程中出现的问题总结
1. 首先是过拟合和欠拟合的问题
1)过拟合问题
- 模型学习到了数据中的噪声,增加训练数据
- 降低模型复杂度,进行剪枝操作(dropout)
- 添加正则化l1或者l2,或者添加batch_normalization(防止梯度消失和梯度爆炸)
BN和LN的区别
Layer Normalization,LN是“横”着来的,对一个样本,经过同一层的所有神经元做归一化。BN:Batch Normalization,BN是“竖”着来的,经过一个神经元的所有样本做归一化,所以与batch size有关系。二者提出的目的都是为了加快模型收敛,减少训练时间。
相关地址:https://gitee.com/nuocheng1/note/blob/master/论文笔记/DeepNet Scaling Transformers to 1000 Layers.md
2)欠拟合
- 增加数据特征
- 增加模型复杂度
- 减少正则系数
2.BN与Dropout的使用
BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2的效果,相反可能会得到比单独使用更差的效果。
有些论文中指出原因就是在训练和测试的时候出现的方差偏移导致的,随着网络的加深,这个偏差会越来越大。
3.梯度消失和梯度爆炸产生
现象
- 模型无法从训练数据中获得更新(如低损失)。
- 模型不稳定,导致更新过程中的损失出现显著变化。训练过程中,每个节点和层的误差梯度值持续超过 1.0。
- 训练过程中,模型损失变成NaN。
目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。
在神经网络中,根据链式法则,它的公式是每一层神经元对上一层的输出的一个loss损失求偏导,然后是一个连乘的形式,公式展开中有一项是激活函数的导数,如果激活函数使用的是sigmoid或者是tanh,我们知道sigmoid的导数形式是f(x)(1-f(x)),那么这个结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0。同理,如果这个结果大于1的话,误差对输入层的偏导会趋于无穷大。
解决方式
- 梯度消失:可以采用ReLU激活函数有效的解决梯度消失的情况,也可以用Batch Normalization解决。
- 梯度爆炸:1.重新设计网络模型。在深度神经网络中,梯度爆炸可以通过重新设计层数更少的网络来解决。
- 2.梯度剪切,设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
- 3.使用不同的激活函数。如用ReLU,LeakReLU。
- 4.使用BN,BN可以将每次batch的数据分布拉到一个0点附近,BN将输出从饱和区拉倒了非饱和区。
- 5.使用残差结构,相比较于以前网络的直来直去结构,残差中有很多这样的跨层连接结构,这样的结构在反向传播中具有很大的好处,
其他
- train loss 不断下降,test loss不断下降,说明网络仍在学习;
- train loss 不断下降,test loss趋于不变,说明网络过拟合;
- train loss 趋于不变,test loss不断下降,说明数据集100%有问题;
- train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;
- train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。
4.正则化的使用L1,L2
由于L1、L2的特点有各自不同的适用场景。
- L1:使模型中尽可能多的参数值为0,因此适用于:模型剪枝,模型压缩,特征选择。是一种从改变模型结构的角度(减少模型参数的数量)解决过拟合的方式。
- L2:使模型中的所有参数值尽可能小,使得模型尽量不依赖于某几个特殊的特征,而是使每个特征都得到尽量均衡的权重,因此适用于解决普通的过拟合问题,即从参数分布(让分布尽可能的均匀)的角度解决过拟合的问题,这也是常用的解决过拟合的方式。
5.Batch size对模型训练的影响
一般来说,在合理的范围之内,越大的 batch size 使下降方向越准确,震荡越小;
batch size 如果过大,则可能会出现局部最优的情况(这也是其中的一个缺点吧)。
小的 bath size 引入的随机性更大,难以达到收敛,极少数情况下可能会效果变好。 会影响训练的稳定性,Batch size过小会使Loss曲线振荡的比较大,大小一般按照2的次幂规律选择,这是为了硬件计算效率考虑的。