一. 概念:
- 正则化(Regularization) 是机器学习中对原始损失函数引入额外信息,以便防止过拟合和提高模型泛化性能的一类方法的统称。也就是目标函数变成了原始损失函数+额外项,常用的额外项一般有两种,英文称作L1−norm和L2−norm,中文称作L1正则化和L2正则化,或者L1范数和L2范数(实际是L2范数的平方,L2正则化又称为权重衰减)。
- 无论哪一种正则化方式,基本思想都是希望通过限制权重的大小,使得模型不能任意拟合训练数据中的随机噪声,正则化实际是在损失函数中加入刻画模型复杂程度的指标
- 为了防止过拟合,可以为损失函数加上一个惩罚项对复杂的模型进行惩罚,即强制让模型的参数值尽可能小。加上正则化项的目标是让它的值尽可能小,即参数等于0或者接近于0。λ为惩罚项系数,是人工设定的大于0的参数。
- L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓惩罚是指对损失函数中的某些参数做一些限制,约束我们的模型尽量的简单。对于线性回归模型,使用L1正则化的模型叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。
- 线性回归L1正则化损失函数:
- 线性回归L2正则化损失函数:
- 公式(1)(2)中表示特征的系数(x的参数),可以看到正则化项是对系数做了限制。L1正则化和L2正则化的说明如下:
- L1正则化是指权值向量w中各个元素的绝对值之和,通常表示为。
- L2正则化是指权值向量中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为
- 一般都会在正则化项之前添加一个系数λ。Python中用α表示,这个系数需要用户指定(也就是我们要调的超参)。
二. 正则化的作用:
1. 过拟合:
第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适
过拟合的定义:
过拟合是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测得很好,对未知数据预测得很差的现象,过拟合发生的本质原因,是由于监督学习问题的不适定:数据远远少于模型空间。因此过拟合现象的发生,可以分解成以下三点:
- 有限的训练数据不能完全反映出一个模型的好坏,然而我们却不得不在这有限的数据上挑选模型,因此我们完全有可能挑选到在训练数据上表现很好而在测试数据上表现很差的模型,因为我们完全无法知道模型在测试数据上的表现。
- 如果模型空间很大,也就是有很多很多模型以给我们挑选,那么挑到对的模型的机会就会很小。
- 与此同时,如果我们要在训练数据上表现良好,最为直接的方法就是要在足够大的模型空间中挑选模型,否则如果模型空间很小,就不存在能够拟合数据很好的模型。
- 由此可见,要拟合训练数据,就要足够大的模型空间;用了足够大的模型空间,挑选到测试性能好的模型的概率就会下降。因此,就会出现训练数据拟合越好,测试性能越差的过拟合现象。
- 为什么正则化能够避免过拟合:因为正则化就是控制模型空间的一种办法。符合奥克姆剃刀原理,奥克姆剃刀原理应用于模型选择时变为以下想法:在所有可能选择的模型中,能够很好的解释已知数据并且十分简单才是最好的模型,正则化能够在保证模型有效的前提下使得模型简单,而越简单的模型泛化能力越强。就像求解n个一阶变量的方程组,但是方程组的个数不足n,这样就会有无数解,引入正则化项使得有唯一解,而且此解会使该方程组简单。
2. 避免过拟合
1) 避免过拟合的第一个思路:使尽可能多的参数为零。为此,最直观地可以引入L0-范数。这意味着,我们希望绝大多数w的分量为零。
- L0范数:向量中非0元素的个数。
- 通过引入L0正则项,我们可以使模型稀疏化且易于解释,并且在某种意义上实现了特征选择。这看起来很美好,但是L0正则项:非连续、非凸、不可导。因此,L0正则项虽好,但是求解这样的最优化问题,难以在多项式时间内找到有效解(NP-Hard 问题)。
- 于是我们考虑 L0范数最紧的凸放松:L1-范数。
2) L1正则化可以使得参数稀疏化,即得到的参数是一个稀疏矩阵,可以用于特征选择,也就是使得 w 大部分元素都为0,也就是减少和特征数量。
- 稀疏性,说白了就是模型的很多参数是0。通常机器学习中特征数量很多,例如文本处理时,如果将一个词组(term)作为一个特征,那么特征数量会达到上万个(bigram)。在预测或分类时,那么多特征显然难以选择,但是如果代入这些特征得到的模型是一个稀疏模型,很多参数是0,表示只有少数特征对这个模型有贡献,绝大部分特征是没有贡献的,即使去掉对模型也没有什么影响,此时我们就可以只关注系数是非零值的特征。这相当于对模型进行了一次特征选择,只留下一些比较重要的特征,提高模型的泛化能力,降低过拟合的可能。
- 的大部分元素(也就是特征)都是和最终的输出没有关系或者不提供任何信息的,在最小化目标函数的时候考虑这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确的预测。稀疏会学习去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。
3) L2正则化为什么可以防止模型过拟合(overfitting)?
- 拟合过程中通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。可以设想一下对于一个线性回归方程,若参数很大,那么只要数据偏移一点点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什么影响,专业一点的说法是抗扰动能力强。
4)为什么L2正则化可以获得值很小的参数?
- 以线性回归中的梯度下降法为例。假设要求的参数为θ,hθ(x)是我们的假设函数,那么线性回归的代价函数如下:
- 在梯度下降中θ的迭代公式为:
- 其中是learning rate。 上式是没有添加L2正则化项的迭代公式,如果在原始代价函数之后添加L2正则化,则迭代公式为:
- 其中就是正则化参数。从上式可以看到,与未添加L2正则化的迭代公式相比,每一次迭代,都要先乘以一个小于1的因子,从而使得不断减小,因此总得来看,是不断减小的。
最开始也提到L1正则化一定程度上也可以防止过拟合。之前做了解释,当L1的正则化系数很小时,得到的最优解会很小,可以达到和L2正则化类似的效果。
举个例子:
第一张图中如果我们的模型是: 正是那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于0的话,我们就能很好的拟合了。 所以我们要做的就是在一定程度上减小这些参数的值。
具体方法是修改代价函数,在其中和设置一点惩罚。这样做的话,我们在尝试最小化代价时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的和
经过正则化处理的模型与原模型的可能对比如下图所示:
-
L2范数是指向量各元素的平方和然后求平方根。我们让L2范数的规则项最小,可以使得的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0,L2正则化又称为权重衰减。
-
L2范数有助于处理 不好的情况下矩阵求逆很困难的问题。L2范数不但可以防止过拟合,还可以让我们的优化求解变得稳定和快速。大概保证在梯度下降和有限的迭代次数的情况下得到的点会是一个比较好的全局最小点的近似点。
-
我们将权值参数以L1或者L2的方式放到代价函数里面去。然后模型就会尝试去最小化这些权值参数。正则化的作用就是选择经验风险(loss)与模型复杂度同时较小的模型。而这个最小化就像一个下坡的过程,L1和L2的差别就在于这个“坡”不同:L1就是按绝对值函数的“坡”下降的,而L2是按二次函数的“坡”下降。
-
L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。
4) L1 与 L2 的区别:
- L1范数可以进行特征选择,即让特征的系数变为0.
- L2范数可以防止过拟合,提升模型的泛化能力,有助于处理 condition number不好的情况下矩阵求逆很困难的问题(数据变化很小矩阵求解后结果变化很大)
- (核心:L2对大数,对outlier离群点更敏感!)
- 下降速度:最小化权值参数L1比L2变化的快
- 模型空间的限制:L1会产生稀疏 L2不会。
- L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,L2正则化使参数减小到很小的范围,这些特征都会接近于0。
在pytorch中没有明确的添加L1和L2正则化的方法,但是可以直接的采用优化器自带的weight_decay选项来制订权重衰减,相当于L2正则化中的 :
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4, weight_decay=1e-5)
上面这是Adam优化器的一种达到L2正则化效果的一种方式。pytorch中还有很多这样的优化器,如SGD,Adadelta,Adam,Adagrad,RMSprop等,使用它很简单,你需要传入一个可迭代的参数列表(里面必须都是Variable类型的)进行优化,然后你可以指定一些优化器的参数,如学习率,动量,权值衰减等。
参考:
深入理解L1、L2正则化 - ZingpLiu - 博客园 (cnblogs.com)
李航《统计学习方法》
L1和L2 CSDN博客
网友评论