目录
深度学习基础:L1正则化,L2正则化与范数的关系?
L 1 L1 L1 正则和 L 2 L2 L2 正则本质上用到的是范数这块的数学知识,向量的 L 1 L1 L1 范数和 L 2 L2 L2 范数。所以先看一下范数的概念:
范数的概念
通常我们用范数 (norm) 来衡量向量,向量的
L
p
L_p
Lp 范数定义为:
∥
x
∥
p
=
(
∑
i
∣
x
i
∣
p
)
1
p
,
p
∈
R
,
p
≥
1
\|\mathbf{x}\|_p = (\sum_i|x_i|^p)^{\frac{1}{p}},p\in\mathbb{R},p\geq1
∥x∥p=(i∑∣xi∣p)p1,p∈R,p≥1
L
2
L^2
L2 范数,也称欧几里得范数 (Euclidean norm),是向量
x
\mathbf{x}
x 到原点的欧几里得距离。 有时也用
L
2
L^2
L2 范数的平⽅来衡量向量:
x
T
x
\mathbf{x}^T\mathbf{x}
xTx 。事实上,平方
L
2
L^2
L2 范数(Squared L2 norm)在计算上更为便利,例如它的对
x
\mathbf{x}
x 梯度的各个分量只依赖于
x
\mathbf{x}
x 的对应的各个分量,而
L
2
L^2
L2 范数对
x
\mathbf{x}
x 梯度的各个分量要依赖于整个
x
\mathbf{x}
x 向量。
L2范数(L2 norm):
∥
x
∥
2
=
∑
i
∣
x
∣
2
平方L2范数(Squared L2 norm):
∥
x
∥
2
2
=
∑
i
∣
x
∣
2
\text{L2范数(L2 norm):}\quad\|\mathbf{x}\|_2 = \sqrt{\sum_i|x|^2}\\ \text{平方L2范数(Squared L2 norm):}\quad\|\mathbf{x}\|_2^2 = \sum_i|x|^2
L2范数(L2 norm):∥x∥2=i∑∣x∣2平方L2范数(Squared L2 norm):∥x∥22=i∑∣x∣2
但是由于
L
2
L^2
L2 范数并不⼀定适用于所有的情况,比如它在原点附近的增长十分缓慢,因此不适用于需要区别
0
0
0 和非常小但是非
0
0
0 值的情况。
L
1
L^1
L1 范数就是⼀个比较好的选择,它在所有方向上的增长速率都是⼀样的,定义为:
∥
x
∥
1
=
∑
i
∣
x
i
∣
\|\mathbf{x}\|_1 = \sum_i|x_i|
∥x∥1=i∑∣xi∣
它经常使用在需要区分
0
0
0 和非
0
0
0 元素的情形中。
有时我们也会想衡量⼀个矩阵,机器学习中通常使用的是 F 范数 (Frobenius norm),其定义为:
∥
A
∥
F
=
∑
i
,
j
A
i
,
j
2
\|A\|_F = \sqrt{\sum_{i,j}A^2_{i,j}}
∥A∥F=i,j∑Ai,j2
范数如何与正则联系起来?
使用线性回归的例子,拿均方误差(Mean Squared Error,MSE)作为loss
:
L
(
w
)
=
1
m
∑
i
=
1
m
(
y
i
−
y
^
i
)
2
\mathcal{L}(\mathbf{w}) = \frac{1}{m}\sum_{i=1}^m(y_i-\hat{y}_i)^2
L(w)=m1i=1∑m(yi−y^i)2
y
^
i
\hat{y}_i
y^i表示的是对样本
x
i
x_i
xi的预测输出:
y
^
i
=
w
′
x
i
\hat{y}_i = \mathbf{w^\prime x_i}
y^i=w′xi
然后咱们的目标就是最小化这个损失:
min
w
L
(
w
)
=
min
w
1
m
∑
i
=
1
m
(
y
i
−
y
^
i
)
2
\mathop{\text{min}}\limits_{\mathbf{w}}\mathcal{L}(\mathbf{w}) = \mathop{\text{min}}\limits_{\mathbf{w}}\frac{1}{m}\sum_{i=1}^m(y_i-\hat{y}_i)^2
wminL(w)=wminm1i=1∑m(yi−y^i)2
w \mathbf{w} w就是网络的权重,输入一定的情况下,损失就是权重的函数
为了避免过拟合,我们倾向于给较简单的函数添加一个偏移,也就是说,假如有两个函数都可以很好地拟合咱们的数据,我们会倾向于使用简单的那个。 这可以通过添加一个正则项来实现,通常就是添加
L
1
L1
L1 范数或者
L
2
L2
L2 范数:
L1范数(L1 norm):
∥
w
∥
1
=
∑
i
∣
w
i
∣
平方L2范数(Squared L2 norm):
∥
w
∥
2
2
=
∑
i
∣
w
∣
2
\text{L1范数(L1 norm):}\quad\|\mathbf{w}\|_1 = \sum_i|w_i|\\ \text{平方L2范数(Squared L2 norm):}\quad\|\mathbf{w}\|_2^2 = \sum_i|w|^2
L1范数(L1 norm):∥w∥1=i∑∣wi∣平方L2范数(Squared L2 norm):∥w∥22=i∑∣w∣2
比如说我们给loss
添加了平方
L
2
L2
L2 范数然后将其最小化,就可以得到岭(Ridge
)回归:
min
w
L
λ
(
w
)
=
min
w
(
λ
∥
w
∥
2
2
+
1
m
∑
i
=
1
m
(
y
i
−
y
^
i
)
2
)
\mathop{\text{min}}\limits_{\mathbf{w}}\mathcal{L}_\lambda(\mathbf{w}) = \mathop{\text{min}}\limits_{\mathbf{w}}(\lambda\|\mathbf{w}\|_2^2+\frac{1}{m}\sum_{i=1}^m(y_i-\hat{y}_i)^2)
wminLλ(w)=wmin(λ∥w∥22+m1i=1∑m(yi−y^i)2)
这里
λ
\lambda
λ是正则系数,表示我们想要正则化的程度。
如果添加的是 L 1 L1 L1正则项就被称为
Lasso
回归
为什么最小化权重的范数就可以实现正则化?
答案在于:最小化权重的范数可以让拟合函数变“简单”。 数学上讲, L 1 L1 L1 范数和 L 2 L2 L2 范数本质上都是对权重的大小的度量: L 1 L1 L1 范数是各权重绝对值的和,平方 L 2 L2 L2 范数是各权重平方的和。所以权重越大,它们的范数就越大,这也就意味着,最小化范数可以让网络的权重变小,继而得到一个“相对简单”的网络。
举个例子,把这个过程可视化出来,假设咱们有一组下面这样的数据:
我们应该给它选择什么样的拟合函数呢,实际中有很多选择,下面是三个例子:
上图包含一个二阶多项式拟合和两个不同的八阶多项式拟合,它们的公式如下:
Figure a:
y
^
=
0.04
+
0.04
x
+
0.9
x
2
Figure b:
y
^
=
−
0.01
+
0.01
x
+
0.8
x
2
+
0.5
x
3
−
0.1
x
4
−
0.1
x
5
+
0.3
x
6
−
0.3
x
7
+
0.2
x
8
Figure c:
y
^
=
−
0.01
+
0.57
x
+
2.67
x
2
−
4.08
x
3
−
12.25
x
4
+
7.41
x
5
+
24.87
x
6
−
3.79
x
7
−
14.38
x
8
\begin{aligned} &\text { Figure a: } \hat{y}=0.04+0.04 x+0.9 x^{2}\\ &\text { Figure b: } \hat{y}=-0.01+0.01 x+0.8 x^{2}+0.5 x^{3}-0.1 x^{4}-0.1 x^{5}+0.3 x^{6}-0.3 x^{7}+0.2 x^{8}\\ &\text { Figure c: } \hat{y}=-0.01+0.57 x+2.67 x^{2}-4.08 x^{3}-12.25 x^{4}+7.41 x^{5}+24.87 x^{6}-3.79 x^{7}-14.38 x^{8} \end{aligned}
Figure a: y^=0.04+0.04x+0.9x2 Figure b: y^=−0.01+0.01x+0.8x2+0.5x3−0.1x4−0.1x5+0.3x6−0.3x7+0.2x8 Figure c: y^=−0.01+0.57x+2.67x2−4.08x3−12.25x4+7.41x5+24.87x6−3.79x7−14.38x8
前两个(“简单”些的函数)看起来在新数据上有更好的泛化性,第三个(复杂的函数)明显在训练数据上过拟合了。它们的复杂度是如何在范数上面体现出来的呢?
可以看到,线[c]
均方误差为0,但它的范数非常大,线[a],[b]
虽然范数稍微大了一点,但其范数却小得多:
- 线
[a]
的范数小是因为它跟[c]
相比参数少得多 - 线
[a]
的范数小是因为它跟[c]
相比虽然参数个数相同,但所有的参数在数值上小得多
通过这个例子我们就可以总结出来,通过给我们的最小化目标函数添加 L 1 L1 L1 范数和 L 2 L2 L2 范数,可以促使网络拟合出权重较小的函数,这就带来了正则效应,使得我们的网络在新数据上泛化性更好。
L 1 L1 L1 范数和 L 2 L2 L2 范数 有什么区别?
通过上面的例子我们已经了解到,降低一个函数的复杂度有两种方法,可以直接舍弃掉某些权重(将他们设置为 0 0 0),或者使权重尽可能地小,这其实就是 L 1 L1 L1 和 L 2 L2 L2 的区别。
为了理解这两种操作的不同之处,我们先看看它们是如何随着权重变化的。
左图是给定权重
w
w
w的
L
1
L1
L1 范数和
L
2
L2
L2 范数值,右图是对应的范数斜率图,我们可以看到,两个范数都随着权重绝对值的增大而增大,但是,
L
1
L1
L1 范数是以一个恒定的速度增加的,而
L
2
L2
L2 范数是以指数型的速度增加的。
这个区别很重要,因为在梯度下降的时候我们是基于损失函数的偏导数来更新权重的,所以如果我们在损失函数里面添加了范数项的话,该范数的导数会决定权重的更新速度。
可以看到, L 2 L2 L2 范数 的导数是随着 w \mathbf{w} w的减小而减小的,这也就意味着权重的更新速度会变得越来越慢。当权重接近 0 0 0的时候,这个斜率也会变得很小很小几乎可以忽略不计,所以权重基本上不会小到 0 0 0。
另一方面,因为 L 1 L1 L1 范数 的斜率是固定的。随着 w \mathbf{w} w的减小,权重的更新速度并不会改变,这样我们就能获得权重持续变小的“效果”,所以 L 1 L1 L1 范数更有可能将某些权重减小到 0 0 0。
简单总结一下
- L 1 L1 L1 范数可以将某些权重减小至 0 0 0,可以使权重变得稀疏。这对于内存的高效利用或者某些需要特征选择(就是我们只想保留某些特定权重)的场景很有用的。
- 而 L 2 L2 L2 范数会减小所有的权重但不会将它们一直减小至 0 0 0。这不便于高效使用内存,但在我们想要保留所有参数的时候还是挺有用的。
参考:
[1] https://www.deeplearningbook.org/contents/linear_algebra.html
[2] https://towardsdatascience.com/visualizing-regularization-and-the-l1-and-l2-norms-d962aa769932