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 范数,可以促使网络拟合出权重较小的函数,这就带来了正则效应,使得我们的网络在新数据上泛化性更好。
通过上面的例子我们已经了解到,降低一个函数的复杂度有两种方法,可以直接舍弃掉某些权重(将他们设置为 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。
简单总结一下
[1] https://www.deeplearningbook.org/contents/linear_algebra.html
[2] https://towardsdatascience.com/visualizing-regularization-and-the-l1-and-l2-norms-d962aa769932