拉格朗日乘法和L1、L2正则化
本篇博客是作为学习正则化的时候的笔记,难免可能存在一些错误,欢迎各位指出不对的地方。
拉格朗日乘法
在介绍L1、L2正则化之前,必须先介绍的是拉格朗日乘法。拉格朗日乘法解决的是在约束条件下求一个函数的极值问题。
例如以L2正则化为例,如下图所示,彩色椭圆等高线是目标函数 J(w),约束条件是黑色圆
我们要在 ∑ i d w i 2 ≤ C ( d 是维度 ) 的情况下最小化目标函数 J ( w ) 将约束条件改写为 g ( w ) = ∑ i d w i 2 − C = 0 我们要在 \sum_i^dw_i^2 \leq C(d是维度) 的情况下最小化目标函数 J(w)\\ 将约束条件改写为g(w) = \sum_i^dw_i^2-C = 0\\ 我们要在i∑dwi2≤C(d是维度)的情况下最小化目标函数J(w)将约束条件改写为g(w)=i∑dwi2−C=0
要在约束条件下取到极值,在本例中,很显然即意味着是在彩色等高线与黑色圆的第一次交点处取到,而在交点处取到极值,则意味着两个函数有着相同的切平面,因此也有公法线。而对于曲面来说,对每个方向求偏导就是其法向量。
J ( w ) 的法向量: ( ∂ J ∂ w 1 w ⃗ 1 , ∂ J ∂ w 2 w ⃗ 2 ) g ( w ) 的法向量: ( ∂ g ∂ w 1 w ⃗ 1 , ∂ g ∂ w 2 w ⃗ 2 ) J(w)的法向量:(\frac{\partial J}{\partial w_1} \vec w_1, \frac{\partial J}{\partial w_2} \vec w_2)\\ g(w)的法向量:(\frac{\partial g}{\partial w_1} \vec w_1, \frac{\partial g}{\partial w_2} \vec w_2) J(w)的法向量:(∂w1∂Jw1,∂w2∂Jw2)g(w)的法向量:(∂w1∂gw1,∂w2∂gw2)
又因为二者的法向量必定平行,我们通常让其作为相加的方式,有
λ
=
∣
∇
J
(
w
)
∇
g
(
w
)
∣
\lambda = |{\frac{\nabla J(w)}{\nabla g(w)}}|\\
λ=∣∇g(w)∇J(w)∣
即
∇
J
(
w
)
+
λ
∇
g
(
w
)
=
0
\nabla J(w) +\lambda\nabla g(w) = 0
∇J(w)+λ∇g(w)=0
question
-
为什么在交点处取得极值?
答:因为这是离目标函数最低点最近的位置
-
为什么不能是减号?
答:加减都可以,习惯上取加
构造一个新函数,
J
n
e
w
(
w
)
=
J
o
l
d
(
w
)
+
λ
g
(
w
)
J^{new}(w) = J^{old}(w) + \lambda g(w)
Jnew(w)=Jold(w)+λg(w)
根据上述结论,对这个函数有
{
∂
J
o
l
d
(
w
)
∂
w
1
+
λ
∂
g
(
w
)
∂
w
1
=
0
∂
J
o
l
d
(
w
)
∂
w
2
+
λ
∂
g
(
w
)
∂
w
2
=
0
g
(
w
)
=
0
\begin{aligned} &\begin{cases} & \frac{\partial J^{old}(w)}{\partial w_1} + \lambda \frac{\partial g(w)}{\partial w_1} = 0\\ \space\\ & \frac{\partial J^{old}(w)}{\partial w_2} + \lambda \frac{\partial g(w)}{\partial w_2} = 0\\ \space\\ & g(w) = 0 \end{cases} \end{aligned}
⎩
⎨
⎧ ∂w1∂Jold(w)+λ∂w1∂g(w)=0∂w2∂Jold(w)+λ∂w2∂g(w)=0g(w)=0
因此,实际上上面的方程组大概率可以解出
w
1
0
,
w
2
0
,
λ
w_1^0, w_2^0, \lambda
w10,w20,λ
三个未知数的。这里举个例子:
我们假设目标函数为
J
o
l
d
(
w
)
=
−
2
e
−
(
w
1
−
1
)
2
−
(
w
2
−
1
)
2
J^{old}(w) = -2e^{-(w_1-1)^2-(w_2-1)^2}
Jold(w)=−2e−(w1−1)2−(w2−1)2
我们的约束条件为
g
(
w
)
=
w
1
2
+
w
2
2
−
c
2
g(w) = w_1^2+w_2^2-c^2
g(w)=w12+w22−c2
按照上述方法得到方程组
{
4
e
−
(
w
1
−
1
)
2
−
(
w
2
−
1
)
2
(
w
1
−
1
)
+
λ
2
w
1
=
0
4
e
−
(
w
1
−
1
)
2
−
(
w
2
−
1
)
2
(
w
2
−
1
)
+
λ
2
w
2
=
0
w
1
2
+
w
2
2
−
c
2
=
0
\begin{cases} 4e^{-(w_1-1)^2-(w_2-1)^2}(w_1-1) + \lambda2w_1 = 0\\ 4e^{-(w_1-1)^2-(w_2-1)^2}(w_2-1) + \lambda2w_2 = 0\\ w_1^2+w_2^2-c^2 = 0 \end{cases}
⎩
⎨
⎧4e−(w1−1)2−(w2−1)2(w1−1)+λ2w1=04e−(w1−1)2−(w2−1)2(w2−1)+λ2w2=0w12+w22−c2=0
由于方程过于复杂,我们用python来辅助求解,可以求得
{
w
1
=
−
2
2
w
2
=
−
(
2
)
2
λ
=
−
(
2
+
2
2
)
e
−
3
−
2
2
或
{
w
1
=
2
2
w
2
=
(
2
)
2
λ
=
−
(
2
−
2
2
)
e
−
3
+
2
2
\begin{cases} w_1 = -\frac{\sqrt{2}}{2}\\ w_2=-\frac{\sqrt(2)}{2}\\ \lambda = -(2 + 2\sqrt2)e^{-3 - 2\sqrt2}\\ \end{cases} 或 \space \begin{cases} w_1 = \frac{\sqrt{2}}{2}\\ w_2=\frac{\sqrt(2)}{2}\\ \lambda = -(2 - 2\sqrt2)e^{-3 + 2\sqrt2}\\ \end{cases}\\
⎩
⎨
⎧w1=−22w2=−2(2)λ=−(2+22)e−3−22或 ⎩
⎨
⎧w1=22w2=2(2)λ=−(2−22)e−3+22
可视化结果为:
一个是最远处,一个是最近处。我们修改了代码中关于 λ 的符号,结果是一样的,证明加减都是没有关系的。
C和λ的关系
C 和 λ 是反比关系(例如sklearn中的逻辑回归函数的参数c,就是正则化系数的倒数),这里以L2范数为例:
g ( w ) = w 1 2 + w 2 2 − C λ = ∣ ∇ J ( w ) ∇ g ( w ) ∣ = ∣ ∇ J ( w ) 2 w 1 + 2 w 2 ∣ ∼ ∣ ∇ J ( w ) ∣ C g(w) = w_1^2+w_2^2-C\\ \space\\ \lambda = |\frac{\nabla J(w)}{\nabla g(w)}| = |\frac{\nabla J(w)}{2w_1+2w_2}| \sim \frac{|\nabla J(w)|}{C}\\ g(w)=w12+w22−C λ=∣∇g(w)∇J(w)∣=∣2w1+2w2∇J(w)∣∼C∣∇J(w)∣
L1、L2正则化
如上所述,我们的损失函数就是 J(w) ,我们发现如果不给参数加上限制,
w
1
w_1
w1 和
w
2
w2
w2 可能会导致模型过拟合的问题,即损失函数为0了,那么当他遇到含有噪声的时候,就会把噪声也学进去。其次,当参数过大的时候,样本一点点微小的变动,都会导致变化非常大。例如
y
=
w
1
∗
x
1
+
w
2
∗
x
2
y = w_1 * x_1 + w_2 * x_2
y=w1∗x1+w2∗x2
当
w
1
w_1
w1 和
w
2
w_2
w2 都非常大的时候,只要
x
1
x_1
x1 和训练数据相差一点点,都会导致
y
y
y 变化特别大.
出于以上的目的,我们需要对参数 w 进行约束。比如进行L2正则化,即
∑
i
w
i
2
≤
C
\sum_iw_i^2 \leq C
i∑wi2≤C
因此
约束条件
g
(
w
)
=
∑
i
w
i
2
−
C
=
0
约束条件 g(w) = \sum_iw_i^2-C = 0\\\\
约束条件g(w)=i∑wi2−C=0
由拉格朗日乘法,构建一个新的目标函数
J
n
e
w
(
w
)
=
J
o
l
d
(
w
)
+
λ
g
(
w
)
J^{new}(w) = J^{old}(w) + \lambda g(w)\\
Jnew(w)=Jold(w)+λg(w)
其中,g(w)中的 C 是超参,我们认为是已知的,
那么很明显,当 C 越大,也就是 λ 越小的时候,约束条件几乎可以包含原来函数的最优值的时候,就意味着其实没有进行正则化惩罚。这和表达式中的含义也是一样的,λ 越小,则正则化函数几乎就没用上,就可能会导致过拟合;以上述的情况为例,C很大的时候,就把红色的最低点包括在内了,这与我们表达式的结论一致。而当 C 越小,也就是 λ 越大的时候,约束条件过于严苛,根本到不了一个比较小的地方,就可能会导致欠拟合。
L1正则化的独有作用
如图所示,L1正则化有个很明显的作用就是能做特征提取。即在大多数情况下,L1约束下去求极值的时候,大多会在顶点取到。这就会导致一些维度的值为0,这就从侧面帮我们选出了更有用的特征,在一定程度上做到了特征提取。
而相比于L1,L2则没有那么容易在某个维度为0的时候取到极值。
代码
Gitee地址:https://gitee.com/hou_zhitian/ml_math/tree/master/%E9%AB%98%E7%AD%89%E6%95%B0%E5%AD%A6
Github地址:https://github.com/Zhi-tian-Hou/ML_math/tree/master/%E9%AB%98%E7%AD%89%E6%95%B0%E5%AD%A6