###### 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$ 的極值 ![](https://i.imgur.com/Vmpmzno.png =330x300) 以俯視視角觀看 (這是另一不同函數了) 因為 $f$ 和 $g$ 的梯度方向相反,但都在同一條直線上 **所以可以設 $f$ 梯度是 $g$ 梯度的 $\lambda$ 倍** $\triangledown{f}=\lambda \triangledown{g}$ ![](https://i.imgur.com/yJkaLtX.png =330x300) 有這個關係式後可以分別利用對 $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 的最小值 ![](https://i.imgur.com/i5388zm.png =400x300) 此為 L1 正規化 ![](https://i.imgur.com/UwY5xRc.png =400x300) 此為 L2 正規化 你可能會問說可是限制了參數 loss 永遠到不了最小值阿 (等高線中心) 這個正是我們的目的, 當我們到了 loss 中心點,會發生過擬和的問題, **所以如停在了黑點,則可以保持模型的靈活度,且有不錯的結果** **而我們也可以利用 $\lambda$ 去調整限制的範圍** <br> ## 3. L1、L2 正規化比較 在圖形中可以看到 L1 的最小 loss 值很容易的就在 y 軸上, 也就是說指使用一個參數就判斷出結果 (有耳朵、鼻子兩特徵,用耳朵就判斷出是貓) 所以我們會說 L1 正規化較容易有 **[ 稀疏解 ]** ( 就是某些參數為 0 ,可得最好特徵) 而 L2 因為平方關係,容易受到 outlier 影響 但相比 L1 參數變化沒那麼大,相對穩定 ![](https://i.imgur.com/i5388zm.png =400x300) 此為 L1 正規化 ![](https://i.imgur.com/UwY5xRc.png =400x300) 此為 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 ) ``` --- 其實我還是有一些地方不是很懂 如有錯誤可以糾正我一夏,感謝 !