前言
对于机器学习问题,我们最常遇到的一个问题便是过拟合。在对已知的数据集合进行学习的时候,我们选择适应度最好的模型最为最终的结果。虽然我们选择的模型能够很好的解释训练数据集合,但却不一定能够很好的解释测试数据或者其他数据,也就是说这个模型过于精细的刻画了训练数据,对于测试数据或者其他新的数据泛化能力不强。
因此,我们需要通过正则化的方法来防止过拟合,接下来跟博主一起来了解一下吧。
在上篇博文 【AI】浅谈使用正则化防止过拟合(上) 中讲述了过拟合产生的原因,以及简单的描述了一下正则化是如何解决过拟合的,接下来将详细展开讲述正则化及权重减少;
机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作`$ℓ1−norm 和
ℓ2−norm$`,中文称作 L1 正则化 和 L2 正则化,或者 L1 范数 和 L2 范数。
最常用的范数就是 p−范数p-范数p−范数,即一般范数 Lp,若 x=x1,x2,...,xnT,那么
当 p 取 1,2 的时候分别是以下最简单的情形:
分别几个范数表示:
用代码来简单表示一下 L1,L2:
import torch
u = torch.tensor([3.0, -4.0])
# L1
torch.abs(u).sum()
# tensor(5.)
# L2
torch.norm(u)
# tensor(7.)
L1 正则化和 L2 正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用 L1 正则化的模型建叫做 Lasso
回归,使用 L2 正则化的模型叫做 Ridge
回归(岭回归)。
下面是 Python 中 Lasso
回归的损失函数,式中加号后面一项 `$α∣∣w∣∣
1
$` 即为 L1 正则化项。
下面是 Python 中 Ridge
回归的损失函数,式中加号后面一项 `$α∣∣w∣∣
2
2$` 即为 L2 正则化项。
一般回归分析中 w 表示特征的系数,从上式可以看到正则化项是对系数做了处理(限制)。
L1 正则化和 L2 正则化的说明如下:
$∣∣w∣∣
1
$
;$∣∣w∣∣
2$
;一般都会在正则化项之前添加一个系数,Python 的机器学习包 sklearn
中用 α 表示,一些文章也用 λ表示,这个系数需要用户指定。
L1 正则化和 L2 正则化的作用:
L1 正则化
假设有如下带 L1 正则化 的损失函数:
其中 J0 是原始的损失函数,加号后面的一项是 L1 正则化项,α 是正则化系数。注意到 L1 正则化是权值的绝对值之和,J 是带有绝对值符号的函数,因此 J 是不完全可微的。机器学习的任务就是要通过一些方法(比如梯度下降)求出损失函数的最小值。当我们在原始损失函数 J0 后添加 L1 正则化项时,相当于对 J0 做了一个约束。
令:
则 J=J0+L,此时我们的任务变成 在 L 约束下求出 J0 取最小值的时候的解。考虑二维的情况,即只有两个权值 w^1 和 w^2,此时 `$L=∣w
1
∣+∣w
2
∣$。对于梯度下降法,求解 J0 的过程可以画出等值线,同时 **L1 正则化** 的函数 L也可以在
$∣∣w
1
∣$,
$∣w
2
∣$`的二维平面上画出来。如下图:
图中等值线是 J0 的等值线,黑色方形是 L函数的图形。`$L=∣w
1
∣+∣w
2
∣$`,这个函数画出来就是一个方框。
在图中,当 J0 等值线与 L 图形首次相交的地方就是最优解。上图中 J0 与 L 在 L 的一个顶点处相交,这个顶点就是最优解。注意到这个顶点的值是 `$(w
1
,w
2
)=(0,w)$`可以直观想象,因为 L 函数有很多『突出的角』(二维情况下四个,多维情况下更多),J0与这些角接触的机率会远大于与 其它部位接触的机率(这是很直觉的想象,突出的角比直线的边离等值线更近些),而在这些角上,会有很多权值等于0(因为角就在坐标轴上),这就是为什么 L1 正则化可以产生稀疏模型,进而可以用于特征选择。
而正则化前面的系数 α,可以控制 L 图形的大小。α 越小,L 的图形越大(上图中的黑色方框);α越大,L 的图形就越小,可以小到黑色方框只超出原点范围一点点,这时最优点的值`$(w
1
,w
2
)=(0,w)$` 中的 w 可以取到很小的值。
L2 正则化
类似地,假设有如下带 L2 正则化的损失函数:
同样可以画出他们在二维平面上的图形,如下:
二维平面下 L2 正则化的函数图形是个圆(绝对值的平方和,是个圆),与方形相比,被磨去了棱角。因此 J0 与 L 相交时使得 `$w
1
$**或**
$w
2$` 等于零的机率小了许多(这个也是一个很直观的想象) ,这就是为什么 L2 正则化不具有稀疏性的原因,因为不太可能出现多数 w都为0的情况。
L2 正则化可以获得值很小的参数
以线性回归中的梯度下降法为例,使用 Andrew Ng 机器学习的参数表示方法。假设要求解的参数为 θ,hθ(x) 是我们的假设函数。线性回归一般使用平方差损失函数。单个样本的平方差是 `$(h
θ
(x)−y)
2
$`,如果考虑所有样本,损失函数是对每个样本的平方差求和,假设有 m个样本,线性回归的代价函数如下,为了后续处理方便,乘以一个常数 1/2m:
中间推导过程不再赘述,可以参考这篇博文:【AI】浅谈梯度下降算法(理论篇)
梯度下降算法中,为了尽快收敛,会沿梯度的负方向更新参数,因此在上式前添加一个负号,并乘以一个系数 α(即学习率),得到最终用于迭代计算参数 θj的形式:
其中 α 是学习率(learning rate)。 上式是没有添加 L2 正则化项的迭代公式,如果在原始代价函数之后添加 L2 正则化,则迭代公式会变成下面的样子:
其中 λλλ 就是正则化参数。从上式可以看到,与未添加 L2 正则化的迭代公式相比,每一次迭代,θj都要先乘以一个小于1的因子(即 `$(1−α
m
λ
)$`) ,从而使得 θj不断减小,因此总的来看,θ 是不断减小的。
最开始也提到 L1 正则化一定程度上也可以防止过拟合。之前做了解释,当 L1 的正则化系数很小时,得到的最优解会很小,可以达到和 L2 正则化类似的效果。
L1 和 L2 的目的是通过减少 w 的权重从而减少模型的复杂度,从而提高模型的泛华能力,为什么会这样呢?启发式地来说,如果代价函数没有正则化,那么权重向量的长度倾向于增长,而其它的都不变。随着时间推移,权重向量将会变得非常大。这可能导致权重向量被限制得或多或少指向同一个方向,因为当长度过长时,使代价函数的最优解发生偏离。
下面将从数学的角度出发给出了正则化为什么能减少 w 的权重,机器学习的实践应用中也得到了验证,但是正则化到底是如何影响模型的泛化能力,并没有科学的数据依据,难道 w按照某种规则增加就不能提高模型的泛化能力吗?
从机器学习的领域经验表明:减少 w 的权重从而减少模型的复杂度,提高模型的泛化能力,因此正则化处理手段在机器学习的模型上得到广泛应用。
L2 权重衰减
L2 正则化就是在代价函数后面再加上一个正则化项:
C0代表原始的代价函数,后面那一项就是 L2 正则化项,它是这样来的:所有参数 w 的平方的和,除以训练集的样本大小 n。λ 就是正则项系数,权衡正则项与 C0 项的比重。另外还有一个系数1/2,1/2 经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与 1/2相乘刚好凑整。
L2 正则化项是怎么避免 overfitting 的呢?我们推导一下看看,先求导:
可以发现 L2 正则化项对 b 的更新没有影响,但是对于 w的更新有影响:
在不使用 L2 正则化时,求导结果中 w 前系数为1,现在 w 前面系数为`$1−
ηλ/n
$因为 η、λ、n 都是正的,所以
$1−
ηλ/n
$`小于1,它的效果是减小 w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w 最终的值可能增大也可能减小。
另外,需要提一下,对于基于 mini-batch 的随机梯度下降,w 和 b 更新的公式跟上面给出的有点不同:
对比上面 w的更新公式,可以发现后面那一项变了,变成所有导数加和,乘以 η 再除以 m,m 是一个 mini-batch 中样本的个数。
到目前为止,我们只是解释了 L2 正则化项有让 w “变小” 的效果,但是还没解释为什么 w “变小” 可以防止 overfitting?一个所谓 “显而易见” 的解释就是:更小的权值 w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2 正则化的效果往往好于未经正则化的效果。当然,对于很多人(包括我)来说,这个解释似乎不那么显而易见,所以这里添加一个稍微数学一点的解释(引自知乎):
过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。
而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。
L1 权重衰减
在原始的代价函数后面加上一个 L1 正则化项,即所有权重 w 的绝对值的和,乘以 λ/n(这里不像 L2 正则化项那样,需要再乘以 1/2,具体原因上面已经说过。)
同样先计算导数:
上式中 sgn(w)表示 w 的符号。那么权重 w 的更新规则为:
比原始的更新规则多出了`$
ηλ/n
sgn(w)$` 这一项。当 w 为正时,更新后的 w 变小。当 w 为负时,更新后的 w 变大——因此它的效果就是让 w 往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。
另外,上面没有提到一个问题,当 w 为0时怎么办?当 w 等于0时,∣w∣ 是不可导的,所以我们只能按照原始的未经正则化的方法去更新 w,这就相当于去掉 `$
ηλ/n
sgn(w)$` 这一项,所以我们可以规定 sgn(0)=0,这样就把 w=0 的情况也统一进来了。
以上就是 浅谈使用正则化防止过拟合(下) 的全部内容了,具体讲解了什么是正则化,并进行深入理解,以及 L1、L2 是如何进行权重衰减的,通过图文结合,公式推导,细致地讲述了要点,希望大家有所收获!