深度学习中过拟合、欠拟合现象以及解决方法

一、过拟合

1.过拟合现象

过拟合(overfitting)是指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合。具体表现就是最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。

2.过拟合产生的原因?

(1)在对模型进行训练时,有可能遇到训练数据不够,即训练数据无法对整个数据的分布进行估计的时候

(2)权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征.

3.过拟合解决方法

  1. 数据增强。
    1.  
  2. 采用正则化。
  3. Dropout。
  4. 提前终止训练过程。
  5. Batch Nomalization。

二、欠拟合

欠拟合的表现:

训练了很长时间,但是在训练集上,loss值仍然很大甚至与初始值没有太大区别,而且精确度也很低,几乎接近于0,在测试集上亦如此。

神经网络的欠拟合大致分为两种情况,一种是神经网络的拟合能力不足,一种是网络配置的问题。

解决方法:

对于大量的数据样本,神经网络无法去拟合全部数据,只能拟合大量样本的整体特征,或者少数样本的具体特征。此时,需要做的很简单,只需要增加深度,也就是增加神经网络的层数就可以了。也可以增加神经网络的宽度,将每一层的神经单元数量增加,但是同等情况下,效果明显不如增加层数,而且要想达到较好的效果,需要增加的神经元数远超过增加一层增加的神经元数。深度深比宽度宽的模型更优这一点,是大家普遍认同的。

那么如果loss和accurancy仍然如此呢?不论怎么增加神经网络的层数,用哪怕只有一条数据去训练拟合,神经网络就是“岿然不动”,loss的值“屹立不倒”,那么这就与神经网络的拟合能力无关了,就要考虑一下其他的因素了。这也是我遇到的那个问题的根源所在。

寻找最优的权重初始化方案

首先要说的就是权重的初始化方案。神经网络在训练之前,我们需要给其赋予一个初值,但是如何选择这个初始值,这是个问题。神经网络有大概如下的几种初始化方案:

  • 全零初始化 Zeros

  • 全1初始化 Ones

  • 初始化为固定值value Constant

  • 随机正态分布初始化 RandomNormal

  • 随机均匀分布初始化 RandomUniform

  • 截尾高斯分布初始化 TruncatedNormal

  • VarianceScaling

  • 用随机正交矩阵初始化Orthogonal

  • 使用单位矩阵初始化 Identiy

  • LeCun均匀分布初始化方法 lecun_uniform

  • LeCun正态分布初始化方法 lecun_normal

  • Glorot正态分布初始化方法 glorot_normal

  • Glorot均匀分布初始化 glorot_uniform

  • He正态分布初始化 he_normal

  • LeCun均匀分布初始化 he_uniform

使用适当的激活函数

不仅仅是初始化,在神经网络的激活函数方面的选取,也不是随意的。比如,卷积神经网络中,卷积层的输出,需要使用的激活函数一般为ReLu,循环神经网络中的循环层使用的激活函数一般为tanh,或者ReLu,全连接层一般也是多用ReLu来激活,只有在神经网络的输出层,使用全连接层来分类的情况下,才会使用softmax这种激活函数。而在各种机器学习入门教程里面最常讲到的sigmoid函数,想都不要想它,它已经不适用于深度学习了,哪怕是作为其改进版的softmax函数,也仅仅是在输出层才使用。

选择合适的优化器和学习速率

神经网络训练的优化器也是需要考虑的一大因素。神经网络的优化器其实有很多种,每种都有其不同的特点,我们最耳熟能详的就是梯度下降法,对应着有批量梯度下降,随机梯度下降。这种优化方法其实不赖,尤其是在神经网络即将最终收敛的时候,使用一个合适的学习速率使得其最终下降到尽可能低的点上。但是随机梯度下降有着明显的缺点,尤其是跟Momentum、Adagrad、Adadelta等其他优化器对比之后。

使用更加复杂的模型

 

减少正则化的参数

 

 

参考:

1.《深度学习》

2.过拟合:https://blog.csdn.net/chen645096127/article/details/78990928

3.

你可能感兴趣的:(DNN)