Fork me on GitHub

过拟合与正则

前言

之前对于正则的理解都行于一些肤浅的理解,没有深入去想其中的一些细节。这篇文章也不会涉及比较深入的数学证明,旨在能够给一个明确的形象化的解释。有什么地方不正确的请指正。

过拟合

在机器学习中,过拟合现象是普遍存在的。所谓过拟合就是模型过分拟合了每个数据点,导致模型变得比较复杂,在测试数据集上的泛化性较差。下面的这张图会更能直观感受:

防止过拟合的方式有很多,一般来说可以加正则,early-stopping,dropout等。加正则可能是最广泛的一种方式,更加准确一点说,一般加的是L2正则,而L0L1正则严格来说并是不用来防止过拟合的,下面会简单介绍。当然正则的手段比较多,还有人会加KL散度作为正则,这里并不加以扩展。

常见正则

L0正则与L1正则

L0正则的定义是求向量向量中非0元素的个数。这是一种比较强的条件。那么这么做的目的是什么呢?我们知道,如果模型能够帮我们筛选哪些特征是重要的,哪些特征是可以忽略的,那将是我们想要的结果。而L0正则的优化目的就是让向量中的更多参数趋近于0,这样可以保留重要的参数,不重要的对应的权重设置为0。所以说L0正则主要用来做特征选择. L1正则的定义是求向量的各个元素的绝对值之和。这个也可以实现稀疏.这个为什么会使权值稀疏呢?数学上的解释是:任何规则化算子,如果在W = 0的地方不可微,并且可以分解为“求和”形式,那么这个规则化算子就能实现稀疏。关于这个描述的证明大家可以去查阅一些相关资料,这里并不做严格证明,下一节和L2正则对比的时候会给一个图像解释。那么大家为什么选择L1正则而很少用L0呢?因为L0的求解是个NP问题,而L1相对更好求一点,关于L1正则的求导大家可以查阅次梯度的相关资料。

L2正则

L2正则是求各个参数的平方和。用在我们的损失函数中的定义如下:

那么,我们在用梯度下降更新参数时候L2正则做了什么呢?我们看权重的更新公式:

我们从权重更新公式可以看出,L2正则起到的作用就是使得权重趋于变小。那么变小为什么能够减缓过拟合现象呢。之前的理解是如果很多参数变小会近似为0,这样模型的参数就会变少,也就是说模型的规模会变小。但是,这种理解是错误的。 L1正则和L2正则可以等价于下面的优化问题(利用拉格朗日定理):

那么我们就可以据此得到L1正则和L2正则的图像化表示:

因此我们可以形象化看出L1正则的效果是产生更少的参数,其他的参数为0(因为最优解在会与坐标轴相交)。所以我们会说L1正则能产生稀疏特征,这种特性也能很好用于特征选择。而L2正则起到的作用是产生更多参数,而参数趋向于变得比较小。那么核心问题就是为什么参数小会减缓过拟合? 实际上过拟合的一个重要原因是我们的数据是有噪声的,而如果我们的模型学习过度而模拟这个点的时候就会使得这个数据特征的权重变大,这样的风险就会很大。从另一个角度来看,如果从最大似然角度来讲,假设我们的训练数据极大,而噪声点只出现过一次,那么在最大似然策略优化的时候会让噪声点表示的特征的权重变得无穷大。从这两个角度来讲,权重大是有很大风险的。因此我们想通过L2来进行“权值衰减”,从而降低每个分量带来的风险。

总结:L0和L1会产更少特征,用于特征选择。L2正则会产生更多特征,而权重会趋向变小。

参考资料