过拟合、欠拟合

过拟合、欠拟合

  • 左图,对图中的数据采用一个简单的模型,例如线性拟合,并不能很好地对这些数据进行分类,分类后存在较大的偏差(Bias),称这个分类模型欠拟合(Underfitting)。
  • 右图,采用复杂的模型进行分类,例如深度神经网络模型,当模型复杂度过高时变容易出现过拟合(Overfitting),使得分类后存在较大的方差(Variance)。
  • 中间的图中,采用一个恰当的模型,才能对数据做出一个差不多的分类。

通常采用开发集来诊断模型中是否存在偏差或者时方差:

  • 当训练出一个模型后,发现训练集的错误率较小,而开发集的错误率却较大,这个模型可能出现了过拟合,存在较大方差;
  • 发现训练集和开发集的错误率都都较大时,且两者相当,这个模型就可能出现了欠拟合,存在较大偏差;
  • 发现训练集的错误率较大时,且开发集的错误率远较训练集大时,这个模型就有些糟糕了,方差和偏差都较大。
  • 只有当训练集和开发集的错误率都较小,且两者的相差也较小,这个模型才会是一个好的模型,方差和偏差都较小。

模型存在较大偏差时,可采用增加神经网络的隐含层数、隐含层中的节点数,训练更长时间等方法来预防欠拟合。
存在较大方差时,则可以采用引入更多训练样本、对样本数据正则化(Regularization)等方法来预防过拟合。

预防过拟合

L2正则化

向Logistic回归的成本函数中加入L2正则化(也称“L2范数”)项:

\[{J(w,b) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}({\hat y}^{(i)}, y^{(i)}) + \frac{\lambda}{2m}||w||_2^2} \]

其中:

\[||w||_2^2 = \sum_{j=1}^n{w_j^2} = w^T w \]

L2正则化是最常用的正则化类型,也存在L1正则化项:

\[\frac{\lambda}{m}||w||_1 = \frac{\lambda}{m}\sum_{j=1}^n |w_j| \]

由于L1正则化最后得到w向量中将存在大量的0,使模型变得稀疏化,所以一般都使用L2正则化。其中的参数λ称为正则化参数,这个参数通常通过开发集来设置。
向神经网络的成本函数加入正则化项:

\[{J(w^{[1]},b^{[1]},…,w^{[L]},b^{[L]}) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}({\hat y}^{(i)}, y^{(i)}) + \frac{\lambda}{2m} \sum\limits_{l=1}^L ||w^{[l]}}||^2_F \]

因为w是一个\(n^{[l]} \times n^{[l-1]}\)矩阵所以:

\[{||w^{[l]}||^2_F = \sum\limits_{i=1}^{n^{[l-1]}} \sum\limits_{j=1}^{n^{[l]}} (w_{ij}^{[l]})^2} \]

这被称为弗罗贝尼乌斯范数(Frobenius Norm),所以神经网络的中的正则化项被称为弗罗贝尼乌斯范数矩阵。
加入正则化项后,反向传播时:

\[dw^{[l]} = \frac{\partial \mathcal{L}}{\partial w^{[l]}} + \frac{\lambda}{m} w^{[l]} \]

更新参数时:

\[w^{[l]} := w^{[l]} - \alpha \frac{\partial \mathcal{L}}{\partial w^{[l]}} - \alpha \frac{\lambda}{m} w^{[l]} \]

有了新定义的\(dw^{[l]}\),参数\(w^{[L]}\)在更新时会多减去一项\(\alpha \frac{\lambda}{m} w^{[l]}\),所以L2正则化项也被称为权值衰减(Weight Decay)
参数λ用来调整式中两项的相对重要程度,较小λ偏向于最后使原本的成本函数最小化,较大的λ偏向于最后使权值w最小化。当λ较大时,权值\(w^{[L]}\)便会趋近于0,相当于消除深度神经网络中隐藏单元的部分作用。另一方面,在权值\(w^{[L]}\)变小之下,输入样本X随机的变化不会对神经网络模造成过大的影响,神经网络受局部噪音的影响的可能性变小。这就是正则化能够降低模型方差的原因。

随机失活正则化

随机失活(DropOut)正则化就是在一个神经网络中对每层的每个节点预先设置一个被消除的概率,之后在训练过程中随机决定将其中的某些节点给消除掉,得到一个被缩减的神经网络,以此来到达降低方差的目的。
DropOut正则化较多地被使用在计算机视觉(Computer Vision)领域。
假设网络中的每一层,每个节点得以保留和消除的概率都是 0.5,设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用 backprop 方法进行训练。

使用Python编程时可以用反向随机失活(Inverted DropOut)来实现DropOut正则化,对于一个神经网络第3层:
其中的d3是一个随机生成,与第3层大小相同的的布尔矩阵,矩阵中的值为0或1。而keep.prob ≤ 1,它可以随着各层节点数的变化而变化,决定着失去的节点的个数。
例如,将keep.prob设置为0.8时,矩阵d3中便会有20%的值会是0。而将矩阵a3和d3相乘后,便意味着这一层中有20%节点会被消除。需要再除以keep_prob的原因,是因为后一步求z4中将用到a3,而a3有20%的值被清零了,为了不影响下一层z4的最后的预期输出值,就需要这个步骤来修正损失的值,这一步就称为反向随机失活技术,它保证了a3的预期值不会因为节点的消除而收到影响,也保证了进行测试时采用的是DropOut前的神经网络。
与之前的L2正则化一样,利用DropOut,可以简化神经网络的部分结构,从而达到预防过拟合的作用。另外,当输入众多节点时,每个节点都存在被删除的可能,这样可以减少神经网络对某一个节点的依赖性,也就是对某一特征的依赖,扩散输入节点的权重,收缩权重的平方范数。

数据扩增法

在无法获取额外的训练样本下,对已有的数据做一些简单的变换。例如对一张图片进行翻转、放大扭曲,以此引入更多的训练样本。

早停止

早停止(Early Stopping)是分别将训练集和开发集进行梯度下降时成本变化曲线画在同一个坐标轴内,在箭头所指两者开始发生较大偏差时就及时进行纠正,停止训练。

在中间箭头处,参数w将是一个不大不小的值,理想状态下就能避免过拟合的发生。
然而这种方法一方面没有很好的降低成本函数,另一方面又想以此来避免过拟合,一个方法解决两个问题,但是哪个都不能很好解决。

posted @ 2019-04-10 14:40  youngliu91  阅读(270)  评论(0编辑  收藏  举报