深度学习中的拟合(欠拟合、过拟合)、正则化

摘自https://testerhome.com/topics/10811

偏差(欠拟合)和方差(过拟合)

要解释这两个现象比较复杂,先从下面的图说起吧。

深度学习中的拟合(欠拟合、过拟合)、正则化

我们不论在逻辑回归,线性回归还是在神经网络中应用的都是线性函数。也就是我们一开始的公式:y=wx + b。 也就是我们上图最左边的图片中,是一条直线。分类算法比较直观一点的理解就是要在坐标空间中找到一个最适合的直线,让每个样本所在的点离这条线最近。但是直线的表达能力是有限的,就像上面最左边的图中一样,一条直线并不能很好的区分圆圈和叉叉,这时候我们会发现在训练集上训练的效果不好,也就是准确率不高,我们称这种情况为高偏差,也叫欠拟合。我们希望效果能像中间的图一样,是一条曲线,能够有效的增加正确率。 所以这时候**函数出马了,我们在第一篇帖子中就写了**函数其实并不是在**什么,而是为我们的线性方程增加非线性效果。它为我们拟合了更好的效果。但有时候如果**函数过度拟合就会产生上图中最后边的情况。 它拟合了一个非常复杂的线,这种情况的表现就是它的效果在训练集上非常好,误差很小。 但实际在测试集上表现的就很差。 例如我们在训练集上的误差1%,而在测试集上额误差达到了15%。 这是因为我们的线拟合的很复杂,很好的契合了训练集的数据分布,但是到了测试集的时候数据分布就不是这么回事了。那么如果出现了欠拟合或者过拟合该怎么办呢。 通常的做法如下:

对于欠拟合: 增加神经网络复杂度,出现欠拟合的原因之一是由于函数的非线性不足,所以用更复杂的网络模型进行训练来加深拟合。
对于过拟合:增加数据规模, 出现过拟合的原因之一是数据规模不足而造成的数据分布不均,扩展数据规模能比较好的解决这个问题。 当然另一个做法是正则化,下面我们将正则化

正则化 λ

有些时候扩展数据规模是很难的,所以我们采取使用正则化来解决过拟合问题,常用的是L2正则,其他的还有L1和 Dropout正则。 这里主要说一下L2正则的原理,看下图:

深度学习中的拟合(欠拟合、过拟合)、正则化

这是我们加了正则化之后的成本函数,可以看我们后面加入了正则化 λ 的表达式来完善成本函数。为什么加入λ能够减轻过拟合呢?直观一点的解释是设置的λ值越大,那么参数w的值就会被压缩的越小(在梯度下降中, 每次迭代的步长,也就是这个公式w=w - 学习率*成本函数对w的导数, 现在由于成本函数增加了正则项,使得J和w变得数值相关了)。 假设λ设置的足够大,那么w会无限的趋近于0. 把多隐藏层的单元的权重设置为0以后,那么基本上就是消除掉了这些单元的作用,而使得网络模型得到简化,就像下面的图一样。由于正则化的设置,消除了一些隐藏单元的作用。而使得整个模型越来越接近于线性化,也就是从下图中的过拟合往欠拟合偏转。当然我们有一个适合的λ的值,能让我们的拟合状态达到最佳。 所以我们在训练模型的时候,往往都会有一个L2正则项的超参数需要我们设置。

深度学习中的拟合(欠拟合、过拟合)、正则化

更直观一点解释看下图:

深度学习中的拟合(欠拟合、过拟合)、正则化

这是我们的tanh**函数, 可以看到当z的值越大时,整个函数的非线性就越大,而z的值越小(图中红色加粗部分),函数就越是呈现出线性分布。 所以当我们增加λ的值, w得值就越小,相应的z的值也就越小。因为z = wx + b。 而我们第一次说**函数的时候就说过神经网络中基本上是不使用线性函数作为**函数的,因为不论有多少层,多少个单元,线性**函数会使得所有单元所计算的都呈现线性状态。