一、过拟合
1.过拟合现象
过拟合(overfitting)是指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合。具体表现就是最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。
2.过拟合产生的原因?
(1)在对模型进行训练时,有可能遇到训练数据不够,即训练数据无法对整个数据的分布进行估计的时候
(2)权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征.
3.过拟合解决方法
- 数据增强。
- 采用正则化。
- Dropout。
- 提前终止训练过程。
- 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.