机器学习解决过拟合的N种方法

什么是过拟合?如果模型在训练集上表现良好,在测试集上表现地不好,则说该模型存在过拟合问题。

如果遇到过拟合问题,通常的解决办法包括三类:

  • 收集更多数据
  • 构建新的神经网络
  • 对神经网络进行正则化

对于第一点,因为过拟合问题本质上就是数据不够造成的,模型太过于自信,把带有噪声的点也给拟合了。简而言之就是数据太少模型太复杂。使用足够多的数据进行训练通常都会解决过拟合问题,不过有些时候数据不是你想收想收就能收滴,收集数据也需要时间成本和金钱成本。

对于第二点,额,这不是废话嘛!

对于第三点,这才是一般的研究重点。常用的正则化方法包括:

  • L1/L2正则化
  • Dropout
  • 数据增强
  • 终止终止训练

L1/L2 正则化

所谓的L1/L2正则化,指的是在原始的Cost Function后面添加一项表达式。例如,L2以及L1正则化的表达式分别是:

其中λ是这里引入的一次超参数。

为什么这样能解决过拟合问题呢?Andrew Ng给了两个直观的解释。

第一个解释,在上面的公式中,如果λ设置得很大,要使整个Cost Function接近0的话,则权重W也必须接近0,因此整个网络变得比较简单,从而防止过拟合。

第二个解释是针对激活函数是sigmoid或者tanh的神经网络而言的,当W比较小的时候,Wx+b也比较小,sigmoid(Wx+b)也比较小,而sigmoid函数在自变量很小时几乎是呈线性关系的,所以整个网络也比较简单,从而防止过拟合。

Dropout

Dropout指的是随机地丢弃神经网络的某些神经元节点,使一个复杂的神经网络变简单,至于丢弃多少,要使网络变得多简单,则是由超参数dropout的概率或者不dropout的概率决定的。

为什么dropout可以解决过拟合问题?假设某个神经元有100个输入特征,如果丢弃掉20个特征,则该神经元就不会依赖于这20个特征了,因此网络变简单了。又由于每次前向推倒的时候丢弃哪些特征是随机的,所以整个网络的性能不会有太大的降低。

在实际的过程中,我们甚至还可以对神经网络不同的层使用不同的dropout概率,将复杂的神经层的dropout概率设高点,将简单的神经层的dropout概率设低点。

Note: 只在训练的时候才使用dropout,在测试的时候不要用dropout,否则多次的测试结果会很不稳定。

数据增强

既然过拟合是由于数据过少造成的,那么我们可不可以人造一些数据呢?答案是可以。

例如对于普通的图片,我们可以对它进行翻转、裁剪,从而构成新的图片,如下图所示。

又例如对于数字图片,我们可以对笔画进行扭曲:

利用数据增强,我们可以非常方便地生成新数据,不过由于新数据是根据老数据来的,所以新数据与老数据之间存在很多冗余信息,所以与真正地收集新数据相比,它的效果没有那么好。不过,性价比高啊!

提前训练终止

有时候可能会碰到这样的情况:当我们在迭代时,发现在测试集上的Cost Fucntion不是单调递减的,而是先单调递减到某个最小值,然后反而会上升。

面对这样的情况,一种解决办法是当Cost Function递减到最小值后就停止训练,这样就能保证测试误差最小。

这是一种解决办法,但是不是一种好的解决办法,因为我们提前结束训练,虽然看上去Cost Function到最小了,即方差变到最小了,但是由于我们训练的时间不够长,偏差会比较大。

总结

我们说,过拟合是由于数据小、模型复杂造成的,所以前面这几种方法的基本思路是:

  • 增加数据
  • 减小模型复杂度