深度学习中模型训练效果不好的原因以及防止过拟合的方法

深度学习中模型训练效果不好的原因

  • 1. 是否选择合适的损失函数
  • 2. 是否选择了合适的Mini-batch size
  • 3. 是否选择了合适的激活函数
  • 4. 是否选择了合适的学习率
  • 5. 优化算法是否使用了动量(Momentum)
  • 6. 其他原因

当我们用自定义的模型去训练某个数据集时,
经常会出现效果不佳的情况:精度太低、损失降不下去、泛性太差等情况。可能的原因有:

  • 数据集样本太少,多样性不够;
  • 网络模型是否添加了BN层,损失函数和激活函数的选取;
  • 优化器的选取,学习率的设置等;

这里暂时不考虑数据集的原因,我们首先来看一下网络模型和优化算法中可能存在的问题:

1. 是否选择合适的损失函数

神经网络的损失函数是非凸的,有多个局部最低点,目标是找到一个可用的最低点。
非凸函数是凹凸不平的,但是不同的损失函数凹凸起伏的程度不同,例如下述的平方损失和交叉熵损失,后者起伏更大,且后者更容易找到一个可用的最低点,从而达到优化的目的。
- Square Error(平方损失)
- Cross Entropy(交叉熵损失)

2. 是否选择了合适的Mini-batch size

使用合适的batch size进行学习,一方面可以减少计算量,一方面有助于跳出局部最优点。
batch取太大会陷入局部最小值,batch取太小会抖动厉害,因此要选择一个合适的batch size。

batch size选取时可以采用以下策略:

  • 当有足够算力时,选取batch size为32或更小一些。
  • 算力不够时,在效率和泛化性之间做trade-off,尽量选择更小的batch size。
  • 当模型训练到尾声,想更精细化地提高成绩(比如论文实验/比赛到最后),有一个有用的trick,就是设置batch size为1,即做纯SGD,慢慢把error磨低。

3. 是否选择了合适的激活函数

使用激活函数把卷积层输出结果做非线性映射,但是要选择合适的激活函数。

  • Sigmoid函数是一个平滑函数,且具有连续性和可微性,它的最大优点就是非线性。但该函数的两端很缓,易发生学不动的情况,产生梯度弥散。
  • ReLU函数是如今设计神经网络时使用最广泛的激活函数,该函数为非线性映射,且简单,可缓解梯度弥散。

4. 是否选择了合适的学习率

  1. 学习率过大,会抖动厉害,导致没有优化提升,容易错过最优解
  2. 学习率太小,下降太慢,训练会很慢

学习率可以采用以下策略:

  • 如果模型是非常稀疏的,那么优先考虑自适应学习率的算法。
  • 在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam进行快速实验优化;在模型上线或者结果发布前,可以用精调的SGD进行模型的极致优化。并且制定一个合适的学习率衰减策略。 可以使用定期衰减策略,比如每过多少个epoch就衰减一次。

5. 优化算法是否使用了动量(Momentum)

在SGD的基础上使用动量,有助于冲出局部最低点。
深度学习中模型训练效果不好的原因以及防止过拟合的方法_第1张图片

当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。

在SGD的基础上使用动量,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。

6. 其他原因

如果以上五部分都选对了,效果还不好,那就是产生过拟合了,可使如下方法来防止过拟合,分别是

  1. 早停法(earyly stoping):早停法将数据分成训练集和验证集,训练集用来计算梯度、更新权重和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。
  2. 权重衰减(Weight Decay):到训练的后期,通过衰减因子使权重的梯度下降地越来越缓,可以采用L1或L2正则化。
  3. Dropout:Dropout是正则化的一种处理,以一定的概率关闭神经元的通路,阻止信息的传递。由于每次关闭的神经元不同,从而得到不同的网路模型,最终对这些模型进行融合。
  4. 调整网络结构(Network Structure)。

参考文章:
https://www.julyedu.com/question/big/kp_id/26/ques_id/2589
本文是对其他参考文章的总结,若内容和图片有涉及侵权,请联系作者删除。

你可能感兴趣的:(神经网络,深度学习,算法,过拟合)