###### tags: `Machine learning`
{%hackmd @kk6333/theme-sty1 %}
# 正規化 (L1、L2)
:warning: 這邊正規化是指[模型參數]正規化,非資料正規化
參數的正規化是被用來解決模型 Overfitting 的情形
當然正規化的方法、定義有很多種,這邊會聚焦在 L1、L2 正規化
參考資料來源:
- [L1和L2正则化 直观理解(之一),从拉格朗日乘数法角度进行理解](https://www.youtube.com/watch?v=mV7-j1d1Ff8)
- [什么是 L1 L2 正规化 正则化 Regularization (深度学习 deep learning)](https://www.youtube.com/watch?v=TmzzQoO8mr4)
<br>
## 1. 拉格朗日乘數 ( Lagrange multiplier )
因為之後正規化的概念會用到拉格朗日乘數,這邊先簡單介紹
詳細介紹可參考此部影片 : [Lagrange乘數](https://www.youtube.com/watch?v=lDehPPIgQpI) 講的超好懂 !
有一函數 $f (x,y)$ ( 圖中碗狀函數 )
我們再使用另一函數 $g(x,y)=0$ 來限制 $f$ 的範圍 ( 圖中平面 )
**Lagrange 乘數**就是用來解在此限制下 $f$ 的極值

以俯視視角觀看 (這是另一不同函數了)
因為 $f$ 和 $g$ 的梯度方向相反,但都在同一條直線上
**所以可以設 $f$ 梯度是 $g$ 梯度的 $\lambda$ 倍**
$\triangledown{f}=\lambda \triangledown{g}$

有這個關係式後可以分別利用對 $x$、$y$ 做的梯度和 $g(x,y)=0$ 求出極值
- $\triangledown{f_x}=\lambda \triangledown{g_x}$
- $\triangledown{f_y}=\lambda \triangledown{g_y}$
- $g(x,y)=0$
把以上聯立式寫成一個式就為 **Lagrange乘數**
且此函數的微分(導數)為 0
$$L(x,y,\lambda) = f(x,y) + \lambda g(x)$$
如果 $g(x,y)=c$
$$L(x,y,\lambda) = f(x,y) + \lambda ( g(x) - c)$$
<br>
## 2. L1、L2 意義
這邊先跳來說一下 L1、L2 意義
#### L1 --------------------
> 這邊 L1 是指將模型參數 $w$ 取絕對值後相加
>
> $$L1 : \Vert{w}\Vert{_1} = \sum_i|w_i|$$
#### L2 -------------------
> L2 則是將參數平方後相加
> $$L2 : \Vert{w}\Vert{_2} = \sum_i(w_i)^2$$
<br>
## 3. L1、L2 正規化
正規化的目的是為了防止 Overfitting,背後的意義其實是為了**限制模型參數**
:::warning
#### 蝦 ! 為啥要限制模型參數呢 ?
因為假如參數太大,雖然可以順利的辨認"訓練資料" ( 畢竟是訓練資料訓練出來的 )
**但遇到真實資料時很容易就把真實資料的 noise 放大**,**就形成了 Overfitting**
所以我們必須限制參數大小,防止過擬和
:::
#### 懲罰項
> 為了要限制大小,定義了名為懲罰項的關係式
> 將參數限制在 $c$
> 這邊就可以看出"拉格朗日乘數"的影子了,這些懲罰項就對應 $g(x,y)$
>
> $L1 : \Vert{w}\Vert{_1}-c \le 0$
$L2 : \Vert{w}\Vert{_2}-c \le 0$
之後寫成拉格朗日乘數 ( 這邊以 $L2$ 做舉例 )
:::info
$$L(w,\lambda) = Loss(w) + \lambda (\Vert{w}\Vert{_2}-c)$$
:::
因為在這邊**算梯度時 $c$ 會直接被微掉**,所以我們可以去掉 $c$
以 $\lambda$ 來調整限制的範圍
:::info
$$L(w,\lambda) = Loss(w) + \lambda \Vert{w}\Vert{_2}$$
:::
**且此項式子會被拿去做參數的更新**
其幾何意義如下 ( x,y 軸為 $w_1,w_2$ 等高線為 $loss$ 大小 )
- 有顏色的地方就是我們**限制的範圍**
- 黑點為限制範圍 loss 的最小值
 此為 L1 正規化
 此為 L2 正規化
你可能會問說可是限制了參數 loss 永遠到不了最小值阿 (等高線中心)
這個正是我們的目的,
當我們到了 loss 中心點,會發生過擬和的問題,
**所以如停在了黑點,則可以保持模型的靈活度,且有不錯的結果**
**而我們也可以利用 $\lambda$ 去調整限制的範圍**
<br>
## 3. L1、L2 正規化比較
在圖形中可以看到 L1 的最小 loss 值很容易的就在 y 軸上,
也就是說指使用一個參數就判斷出結果 (有耳朵、鼻子兩特徵,用耳朵就判斷出是貓)
所以我們會說 L1 正規化較容易有 **[ 稀疏解 ]** ( 就是某些參數為 0 ,可得最好特徵)
而 L2 因為平方關係,容易受到 outlier 影響
但相比 L1 參數變化沒那麼大,相對穩定
 此為 L1 正規化
 此為 L2 正規化
<br>
## 4. L2 Pytorch
目前 pytorch 內建可用 L2 正規化
用法是在 Optimizer 使用 weight_decay 也就是設定 $\lambda$
```python=
optimizer = torch.optim.SGD( model.parameters(), lr=0.01, weight_decay=0.001 )
```
---
其實我還是有一些地方不是很懂
如有錯誤可以糾正我一夏,感謝 !