如何解决过拟合

你是如何解决模型训练过程中出现的过拟合问题的?最近似乎已经被问到很多次了。明明知道的问题,但是好像每次回答的都不够完整。痛定思痛,在这里整理一下,希望下次被问到能够脱口而出。

首先明确一下什么是过拟合?过拟合(overfitting)是指模型在训练的过程中,随着复杂度的增加,训练集上的误差越来越小,而验证集上的误差却越来越大的现象。具体可以参考下面的这张图片。如果把图中的欠拟合和过拟合和人作类比的话,那么欠拟合就是典型的说话不过脑子,而过拟合就是想太多。
欠拟合与过拟合

我们知道,过拟合一般是由于模型复杂度过高或者说模型容量过大导致的。那么,我们就可以通过约束模型的复杂度或者限制模型的容量的手段来解决过拟合问题。常见的方法有以下几种:

1、数据增强(data augment)
这应该是最常见的也是最容易想到的方法。既然是过拟合是由于模型容量过大导致的,那么我们自然可以通过扩充数据集来避免过拟合问题。

2、L1、L2正则化(Regularization)
L1正则化主要是通过在目标函数中增加所有权重系数的绝对值(即1范数)之和来逼迫更多的权重系数为零。事实上,这也是通过L1正则化来进行特征的自动选择的原理。L2正则化则是通过在目标函数中增加所有权重系数的平方之和(即2范数)来逼迫所有的所有的权重系数趋于零。

3、随机失活(dropout)
每次训练的时候让神经元以一定的概率被激活,这在一定的程度上简化了模型。由于每次被激活的神经元不一定相同,这就意味着实际上我们每次都是在采样部分样本来训练一个新的模型。这种思路和Bagging有些类似。

4、逐层归一化(batch normalization)
这种方法给每层的输出都进行一次归一化,使得下一层的输入接近高斯分布,这样可以避免训练下一层时由于输入的偏态分布导致训练出现以偏概全的现象。

5、提前终止(early stopping)
常用的一种方法,即在模型训练的过程中出现验证误差不再减小或者不降反升时停止训练模型,这样可以有效避免模型在训练过程中过度拟合已知的训练集数据而导致的泛化能力差的问题。