【AI】浅谈使用正则化防止过拟合(上)

释放双眼,带上耳机,听听看~!
本文讲述了过拟合产生的原因,以及正则化是如何解决过拟合的。详细介绍了L1和L2正则化以及它们的范数表示。同时解释了L1正则化和L2正则化在损失函数中的惩罚项的作用。此外,还介绍了Lasso回归和Ridge回归分别使用L1和L2正则化的情况。文章适用于AI资讯和AI教程相关的分类。

本文正在参加【AI】浅谈使用正则化防止过拟合(上) 中讲述了过拟合产生的原因,以及简单的描述了一下正则化是如何解决过拟合的,接下来将详细展开讲述正则化及权重减少;

正则化 (Regularization)

机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作 ℓ1−normℓ1-norm 和 ℓ2−normℓ2-norm,中文称作 L1 正则化 和 L2 正则化,或者 L1 范数 和 L2 范数

最常用的范数就是 p−范数p-范数,即一般范数 LpL_p,若 x=[x1,x2,…,xn]Tx=[x_1,x_2,…,x_n]^T,那么

∣∣x∣∣p=(∣x1∣p+∣x2∣p+…+∣xn∣p)1p=(∑i=1n∣xi∣p)1p||x||_p = (|x_1|^p+|x_2|^p+…+|x_n|^p)^{frac{1}{p}} = (sum_{i=1}^n |x_i|^p)^{frac{1}{p}}

pp 取 1,2 的时候分别是以下最简单的情形:

  • L1:∣∣x∣∣1=∣x1∣+∣x2∣+…+∣xn∣=∑i=1n∣xi∣L1: ||x||_1 = |x_1|+|x_2|+…+|x_n|= sum_{i=1}^n|x_i|

  • L2:∣∣x∣∣2=(∣x1∣2+∣x2∣2+…+∣xn∣2)12=∑i=1nxi2L2: ||x||_2 = (|x_1|^2+|x_2|^2+…+|x_n|^2)^{frac{1}{2}}= sqrt{sum_{i=1}^n x_i^2}

分别几个范数表示:

  • L0L0:指向量中非0的元素的个数;
  • L1L1:指向量中各个元素绝对值之和;
  • L2L2:指向量各元素的平方和的平方根;

用代码来简单表示一下 L1L1L2L2

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α||w||_1 即为 L1 正则化项。

min⁡w12nsamples∣∣Xw−y∣∣22+α∣∣w∣∣1min_w frac{1}{2n_{samples}}||X_w-y||^2_2 + α||w||_1

下面是 Python 中 Ridge 回归的损失函数,式中加号后面一项 α∣∣w∣∣22α||w||_2^2 即为 L2 正则化项。

min⁡w∣∣Xw−y∣∣22+α∣∣w∣∣22min_w ||X_w-y||^2_2 + α||w||_2^2

一般回归分析中 ww 表示特征的系数,从上式可以看到正则化项是对系数做了处理(限制)。

L1 正则化和 L2 正则化的说明如下:

  • L1 正则化是指权值向量 ww 中各个元素的绝对值之和,通常表示为 ∣∣w∣∣1||w||_1
  • L2 正则化是指权值向量 ww 中各个元素的平方和然后再求平方根(可以看到 Ridge 回归的 L2 正则化项有平方符号),通常表示为 ∣∣w∣∣2||w||_2

一般都会在正则化项之前添加一个系数,Python 的机器学习包 sklearn 中用 αα 表示,一些文章也用 λλ 表示,这个系数需要用户指定。

L1 正则化和 L2 正则化的作用:

  • L1 正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择;
  • L2 正则化可以防止模型过拟合(overfitting),一定程度上,L1L1 也可以防止过拟合;

深入理解

L1 正则化

假设有如下带 L1 正则化 的损失函数:

J=J0+α∑w∣w∣J = J_0 + α sum_w|w|

其中 J0J_0 是原始的损失函数,加号后面的一项是 L1 正则化项,αα 是正则化系数。注意到 L1 正则化是权值的绝对值之和,JJ 是带有绝对值符号的函数,因此 JJ 是不完全可微的。机器学习的任务就是要通过一些方法(比如梯度下降)求出损失函数的最小值。当我们在原始损失函数 J0J_0 后添加 L1 正则化项时,相当于对 J0J_0 做了一个约束。

令:

L=α∑w∣w∣L = α sum_w|w|

J=J0+LJ=J_0+L,此时我们的任务变成 在 L 约束下求出 J0J_0 取最小值的时候的解考虑二维的情况,即只有两个权值 w1w^1w2w^2,此时 L=∣w1∣+∣w2∣L = |w^1| + |w^2|。对于梯度下降法,求解 J0J_0 的过程可以画出等值线,同时 L1 正则化 的函数 LL 也可以在 ∣w1∣|w^1|∣w2∣|w^2| 的二维平面上画出来。如下图:

【AI】浅谈使用正则化防止过拟合(上)

图中等值线是 J0J_0 的等值线,黑色方形是 LL 函数的图形。L=∣w1∣+∣w2∣L = |w^1| + |w^2|,这个函数画出来就是一个方框。

在图中,当 J0J_0 等值线与 LL 图形首次相交的地方就是最优解。上图中 J0J_0LLLL 的一个顶点处相交,这个顶点就是最优解。注意到这个顶点的值是 (w1,w2)=(0,w)(w^1, w^2) = (0, w)。可以直观想象,因为 LL 函数有很多『突出的角』(二维情况下四个,多维情况下更多),J0J_0 与这些角接触的机率会远大于与 LL 其它部位接触的机率(这是很直觉的想象,突出的角比直线的边离等值线更近些),而在这些角上,会有很多权值等于0(因为角就在坐标轴上),这就是为什么 L1 正则化可以产生稀疏模型,进而可以用于特征选择

而正则化前面的系数 αα,可以控制 LL 图形的大小。αα 越小,LL 的图形越大(上图中的黑色方框);αα 越大,LL 的图形就越小,可以小到黑色方框只超出原点范围一点点,这时最优点的值 (w1,w2)=(0,w)(w^1, w^2) = (0, w) 中的 ww 可以取到很小的值。

L2 正则化

类似地,假设有如下带 L2 正则化的损失函数:

J=J0+a∑ww2J = J_0 + asum_ww^2

同样可以画出他们在二维平面上的图形,如下:

【AI】浅谈使用正则化防止过拟合(上)

二维平面下 L2 正则化的函数图形是个圆(绝对值的平方和,是个圆),与方形相比,被磨去了棱角。因此 J0J_0LL 相交时使得 w1w^1w2w^2 等于零的机率小了许多(这个也是一个很直观的想象) ,这就是为什么 L2 正则化不具有稀疏性的原因,因为不太可能出现多数 ww 都为0的情况。

L2 正则化可以获得值很小的参数

以线性回归中的梯度下降法为例,使用 Andrew Ng 机器学习的参数表示方法。假设要求解的参数为 θθhθ(x)h_theta(x) 是我们的假设函数。线性回归一般使用平方差损失函数。单个样本的平方差是 (hθ(x)−y)2(h_theta(x)-y)^2,如果考虑所有样本,损失函数是对每个样本的平方差求和,假设有 mm 个样本,线性回归的代价函数如下,为了后续处理方便,乘以一个常数 12mfrac{1}{2m}

J(θ)=12m∑i=1m(hθ(x(i))−y(i))2J(theta) = frac{1}{2m} sum_{i=1}^m (h_theta(x^{(i)})-y^{(i)})^2

中间推导过程不再赘述,可以参考这篇博文:【AI】浅谈梯度下降算法(理论篇)

梯度下降算法中,为了尽快收敛,会沿梯度的负方向更新参数,因此在上式前添加一个负号,并乘以一个系数 αα(即学习率),得到最终用于迭代计算参数 θjtheta_j 的形式:

θj:=θj−α1m∑i=1m(hθ(x(i))−y(i))xj(i)theta_j := theta_j – αfrac{1}{m}sum^m_{i=1}(h_theta(x^{(i)})-y^{(i)})x_j^{(i)}

其中 αα 是学习率(learning rate)。 上式是没有添加 L2 正则化项的迭代公式,如果在原始代价函数之后添加 L2 正则化,则迭代公式会变成下面的样子:

θj:=θj(1−αλm)−α1m∑i=1m(hθ(x(i))−y(i))xj(i)theta_j := theta_j(1-αfrac{lambda}{m}) – αfrac{1}{m}sum^m_{i=1}(h_theta(x^{(i)})-y^{(i)})x_j^{(i)}

其中 λλ 就是正则化参数。从上式可以看到,与未添加 L2 正则化的迭代公式相比,每一次迭代,θjtheta_j 都要先乘以一个小于1的因子(即 (1−αλm)(1-αfrac{lambda}{m}) ,从而使得 θjtheta_j 不断减小,因此总的来看,θθ 是不断减小的。

最开始也提到 L1 正则化一定程度上也可以防止过拟合。之前做了解释,当 L1 的正则化系数很小时,得到的最优解会很小,可以达到和 L2 正则化类似的效果。

权重减少

L1L1L2L2 的目的是通过减少 ww 的权重从而减少模型的复杂度,从而提高模型的泛华能力,为什么会这样呢?启发式地来说,如果代价函数没有正则化,那么权重向量的长度倾向于增长,而其它的都不变。随着时间推移,权重向量将会变得非常大。这可能导致权重向量被限制得或多或少指向同一个方向,因为当长度过长时,使代价函数的最优解发生偏离。

下面将从数学的角度出发给出了正则化为什么能减少 ww 的权重,机器学习的实践应用中也得到了验证,但是正则化到底是如何影响模型的泛化能力,并没有科学的数据依据,难道 ww 按照某种规则增加就不能提高模型的泛化能力吗?

从机器学习的领域经验表明:减少 ww 的权重从而减少模型的复杂度,提高模型的泛化能力,因此正则化处理手段在机器学习的模型上得到广泛应用。

L2L2 权重衰减

L2 正则化就是在代价函数后面再加上一个正则化项:

C=C0+λ2n∑ww2C = C_0 + frac{lambda}{2n} sum_w w^2

C0C_0 代表原始的代价函数,后面那一项就是 L2 正则化项,它是这样来的:所有参数 ww 的平方的和,除以训练集的样本大小 nnλλ 就是正则项系数,权衡正则项与 C0C_0 项的比重。另外还有一个系数 12frac{1}{2}12frac{1}{2} 经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与 12frac{1}{2} 相乘刚好凑整。

L2 正则化项是怎么避免 overfitting 的呢?我们推导一下看看,先求导:

∂C∂w=∂C0∂w+λnw∂C∂b=∂C0∂bfrac{∂C}{∂w} = frac{∂C_0}{∂w} + frac{lambda}{n}w \
quad \
frac{∂C}{∂b} = frac{∂C_0}{∂b}

可以发现 L2 正则化项对 bb 的更新没有影响,但是对于 ww 的更新有影响:

w→w−η∂C0∂w−ηλnw=(1−ηλn)w−η∂C0∂ww rightarrow w – etafrac{∂C_0}{∂w} – frac{etalambda}{n}w \
quad \
quad = (1-frac{etalambda}{n})w – etafrac{∂C_0}{∂w}

在不使用 L2 正则化时,求导结果中 ww 前系数为1,现在 ww 前面系数为 1−ηλn1-frac{etalambda}{n} ,因为 ηηλλnn 都是正的,所以 1−ηλn1-frac{etalambda}{n} 小于1,它的效果是减小 ww,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,ww 最终的值可能增大也可能减小。

另外,需要提一下,对于基于 mini-batch 的随机梯度下降,wwbb 更新的公式跟上面给出的有点不同:

w→(1−ηλn)w−ηm∑x∂Cx∂wb→b−ηm∑x∂Cx∂bw rightarrow (1-frac{etalambda}{n})w – frac{eta}{m} sum_x frac{∂C_x}{∂w} \
quad \
b rightarrow b – frac{eta}{m} sum_x frac{∂C_x}{∂b}

对比上面 ww 的更新公式,可以发现后面那一项变了,变成所有导数加和,乘以 ηη 再除以 mmmm 是一个 mini-batch 中样本的个数。

到目前为止,我们只是解释了 L2 正则化项有让 ww “变小” 的效果,但是还没解释为什么 ww “变小” 可以防止 overfitting?一个所谓 “显而易见” 的解释就是:更小的权值 ww,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2 正则化的效果往往好于未经正则化的效果。当然,对于很多人(包括我)来说,这个解释似乎不那么显而易见,所以这里添加一个稍微数学一点的解释(引自知乎):

过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。
【AI】浅谈使用正则化防止过拟合(上)

而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。

L1L1 权重衰减

在原始的代价函数后面加上一个 L1 正则化项,即所有权重 ww 的绝对值的和,乘以 λnfrac{λ}{n}(这里不像 L2 正则化项那样,需要再乘以 12frac{1}{2},具体原因上面已经说过。)

C=C0+λn∑w∣w∣C = C_0 + frac{lambda}{n} sum_w |w|

同样先计算导数:

∂C∂w=∂C0∂w+λnsgn(w)frac{∂C}{∂w} = frac{∂C_0}{∂w} + frac{lambda}{n}sgn(w)

上式中 sgn(w)sgn(w) 表示 ww 的符号。那么权重 ww 的更新规则为:

w→w′=w−ηλnsgn(w)−η∂C0∂ww rightarrow w’ = w – frac{etalambda}{n}sgn(w) – etafrac{∂C_0}{∂w}

比原始的更新规则多出了 ηλnsgn(w)frac{etalambda}{n}sgn(w) 这一项。当 ww 为正时,更新后的 ww 变小。当 ww 为负时,更新后的 ww 变大——因此它的效果就是让 ww 往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。

另外,上面没有提到一个问题,当 ww 为0时怎么办?当 ww 等于0时,∣w∣|w| 是不可导的,所以我们只能按照原始的未经正则化的方法去更新 ww,这就相当于去掉 ηλnsgn(w)frac{etalambda}{n}sgn(w) 这一项,所以我们可以规定 sgn(0)=0sgn(0)=0,这样就把 w=0w=0 的情况也统一进来了。

【AI】浅谈使用正则化防止过拟合(上)

后记

以上就是 浅谈使用正则化防止过拟合(下) 的全部内容了,具体讲解了什么是正则化,并进行深入理解,以及 L1L1L2L2 是如何进行权重衰减的,通过图文结合,公式推导,细致地讲述了要点,希望大家有所收获!

📝 上篇精讲:【AI】浅谈使用正则化防止过拟合(上)

💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注;

👍 创作不易,请多多支持;

🔥 系列专栏:AI

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

AIGC:AI下一代风口的内容创作方式

2023-11-29 1:52:14

AI教程

基于Python实现的随机数生成和采样

2023-11-29 3:42:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索