深入理解L1、L2正则化
過節(jié)福利,我們來深入理解下L1與L2正則化。
1 正則化的概念
- 正則化(Regularization) 是機(jī)器學(xué)習(xí)中對(duì)原始損失函數(shù)引入額外信息,以便防止過擬合和提高模型泛化性能的一類方法的統(tǒng)稱。也就是目標(biāo)函數(shù)變成了原始損失函數(shù)+額外項(xiàng),常用的額外項(xiàng)一般有兩種,英文稱作\(?1-norm\)和\(?2-norm\),中文稱作L1正則化和L2正則化,或者L1范數(shù)和L2范數(shù)(實(shí)際是L2范數(shù)的平方)。
L1正則化和L2正則化可以看做是損失函數(shù)的懲罰項(xiàng)。所謂懲罰是指對(duì)損失函數(shù)中的某些參數(shù)做一些限制。對(duì)于線性回歸模型,使用L1正則化的模型叫做Lasso回歸,使用L2正則化的模型叫做Ridge回歸(嶺回歸)。
線性回歸L1正則化損失函數(shù):
\[\min_w [\sum_{i=1}^{N}(w^Tx_i - y_i)^2 + \lambda \|w\|_1 ]........(1)\]線性回歸L2正則化損失函數(shù):
\[\min_w[\sum_{i=1}^{N}(w^Tx_i - y_i)^2 + \lambda\|w\|_2^2] ........(2)\]- 公式(1)(2)中\(w\)表示特征的系數(shù)(\(x\)的參數(shù)),可以看到正則化項(xiàng)是對(duì)系數(shù)做了限制。L1正則化和L2正則化的說明如下:
- L1正則化是指權(quán)值向量\(w\)中各個(gè)元素的絕對(duì)值之和,通常表示為\(\|w\|_1\)。
- L2正則化是指權(quán)值向量\(w\)中各個(gè)元素的平方和然后再求平方根(可以看到Ridge回歸的L2正則化項(xiàng)有平方符號(hào)),通常表示為\(\|w\|_2^2\)。
- 一般都會(huì)在正則化項(xiàng)之前添加一個(gè)系數(shù)\(\lambda\)。Python中用\(\alpha\)表示,這個(gè)系數(shù)需要用戶指定(也就是我們要調(diào)的超參)。
2 正則化的作用
- L1正則化可以使得參數(shù)稀疏化,即得到的參數(shù)是一個(gè)稀疏矩陣,可以用于特征選擇。
- 稀疏性,說白了就是模型的很多參數(shù)是0。通常機(jī)器學(xué)習(xí)中特征數(shù)量很多,例如文本處理時(shí),如果將一個(gè)詞組(term)作為一個(gè)特征,那么特征數(shù)量會(huì)達(dá)到上萬個(gè)(bigram)。在預(yù)測(cè)或分類時(shí),那么多特征顯然難以選擇,但是如果代入這些特征得到的模型是一個(gè)稀疏模型,很多參數(shù)是0,表示只有少數(shù)特征對(duì)這個(gè)模型有貢獻(xiàn),絕大部分特征是沒有貢獻(xiàn)的,即使去掉對(duì)模型也沒有什么影響,此時(shí)我們就可以只關(guān)注系數(shù)是非零值的特征。這相當(dāng)于對(duì)模型進(jìn)行了一次特征選擇,只留下一些比較重要的特征,提高模型的泛化能力,降低過擬合的可能。
- L2正則化可以防止模型過擬合(overfitting);一定程度上,L1也可以防止過擬合。
3 L1正則化與稀疏性
- 事實(shí)上,”帶正則項(xiàng)”和“帶約束條件”是等價(jià)的。
為了約束w的可能取值空間從而防止過擬合,我們?yōu)樵撟顑?yōu)化問題加上一個(gè)約束,就是w的L1范數(shù)不能大于m:
\[ \begin{cases} \min \sum_{i=1}^{N}(w^Tx_i - y_i)^2 \\ s.t. \|w\|_1 \leqslant m. \end{cases}........(3) \]- 問題轉(zhuǎn)化成了帶約束條件的凸優(yōu)化問題,寫出拉格朗日函數(shù):
\[ \sum_{i=1}^{N}(w^Tx_i - y_i)^2 + \lambda (\|w\|_1-m)........(4)\] 設(shè)\(W_*\)和\(\lambda_*\)是原問題的最優(yōu)解,則根據(jù)\(KKT\)條件得:
\[ \begin{cases} 0 = \nabla_w[\sum_{i=1}^{N}(W_*^Tx_i - y_i)^2 + \lambda_* (\|w\|_1-m)] \\ 0 \leqslant \lambda_*. \end{cases}........(5) \]- 仔細(xì)看上面第一個(gè)式子,與公式(1)其實(shí)是等價(jià)的,等價(jià)于(3)式。
- 設(shè)L1正則化損失函數(shù):\(J = J_0 + \lambda \sum_{w} |w|\),其中\(J_0 = \sum_{i=1}^{N}(w^Tx_i - y_i)^2\)是原始損失函數(shù),加號(hào)后面的一項(xiàng)是L1正則化項(xiàng),\(\lambda\)是正則化系數(shù)。
- 注意到L1正則化是權(quán)值的絕對(duì)值之和,\(J\)是帶有絕對(duì)值符號(hào)的函數(shù),因此\(J\)是不完全可微的。機(jī)器學(xué)習(xí)的任務(wù)就是要通過一些方法(比如梯度下降)求出損失函數(shù)的最小值。當(dāng)我們?cè)谠紦p失函數(shù)\(J_0\)后添加L1正則化項(xiàng)時(shí),相當(dāng)于對(duì)\(J_0\)做了一個(gè)約束。令\(L=\lambda \sum_w|w|\),則\(J=J_0+L\),此時(shí)我們的任務(wù)變成在\(L\)約束下求出\(J_0\)取最小值的解。
- 考慮二維的情況,即只有兩個(gè)權(quán)值\(w_1\)和\(w_2\),此時(shí)\(L=|w_1|+|w_2|\)對(duì)于梯度下降法,求解\(J_0\)的過程可以畫出等值線,同時(shí)L1正則化的函數(shù)\(L\)也可以在\(w_1\)、\(w_2\)的二維平面上畫出來。如下圖:
- 上圖中等值線是\(J_0\)的等值線,黑色方形是\(L\)函數(shù)的圖形。在圖中,當(dāng)\(J_0\)等值線與\(L\)圖形首次相交的地方就是最優(yōu)解。上圖中\(J_0\)與\(L\)在\(L\)的一個(gè)頂點(diǎn)處相交,這個(gè)頂點(diǎn)就是最優(yōu)解。注意到這個(gè)頂點(diǎn)的值是\((w_1,w_2)=(0,w_2)\)。可以直觀想象,因?yàn)?span id="ozvdkddzhkzd" class="math inline">\(L\)函數(shù)有很多突出的角(二維情況下四個(gè),多維情況下更多),\(J_0\)與這些角接觸的機(jī)率會(huì)遠(yuǎn)大于與\(L\)其它部位接觸的機(jī)率,而在這些角上,會(huì)有很多權(quán)值等于\(0\),這就是為什么L1正則化可以產(chǎn)生稀疏模型,進(jìn)而可以用于特征選擇。
而正則化前面的系數(shù)\(\lambda\),可以控制\(L\)圖形的大小。\(\lambda\)越小,\(L\)的圖形越大(上圖中的黑色方框);\(\lambda\) 越大,\(L\)的圖形就越小,可以小到黑色方框只超出原點(diǎn)范圍一點(diǎn)點(diǎn),這是最優(yōu)點(diǎn)的值\((w_1,w_2)=(0,w_2)\)中的\(w_2\)可以取到很小的值。
- 同理,又L2正則化損失函數(shù):\(J = J_0 + \lambda \sum_w w^2\),同樣可畫出其在二維平面的圖像,如下:
二維平面下L2正則化的函數(shù)圖形是個(gè)圓,與方形相比,被磨去了棱角。因此\(J_0\)與\(L\)相交時(shí)使得\(w_1\)或\(w_2\)等于零的機(jī)率小了許多,這就是為什么L2正則化不具有稀疏性的原因。
4 L2正則化為什么能防止過擬合
- 擬合過程中通常都傾向于讓權(quán)值盡可能小,最后構(gòu)造一個(gè)所有參數(shù)都比較小的模型。因?yàn)橐话阏J(rèn)為參數(shù)值小的模型比較簡(jiǎn)單,能適應(yīng)不同的數(shù)據(jù)集,也在一定程度上避免了過擬合現(xiàn)象。可以設(shè)想一下對(duì)于一個(gè)線性回歸方程,若參數(shù)很大,那么只要數(shù)據(jù)偏移一點(diǎn)點(diǎn),就會(huì)對(duì)結(jié)果造成很大的影響;但如果參數(shù)足夠小,數(shù)據(jù)偏移得多一點(diǎn)也不會(huì)對(duì)結(jié)果造成什么影響,專業(yè)一點(diǎn)的說法是抗擾動(dòng)能力強(qiáng)。
- 為什么L2正則化可以獲得值很小的參數(shù)?
- (1) 以線性回歸中的梯度下降法為例。假設(shè)要求的參數(shù)為\(\theta\),\(h \theta (x)\)是我們的假設(shè)函數(shù),那么線性回歸的代價(jià)函數(shù)如下:
\[ J_{\theta} = \frac{1}{2n}\sum_{i=1}^n (h \theta (x^{(i)}) - y^{(i)})^2 ........(6)\] - (2)在梯度下降中\(\theta\)的迭代公式為:
\[\theta_j = \theta_j - \alpha \frac{1}{n} \sum_{i=1}^n (h \theta (x^{(i)}) - y^{(i)}) x_j^{(i)}........(7)\] - (3) 其中\(\alpha\)是learning rate。 上式是沒有添加L2正則化項(xiàng)的迭代公式,如果在原始代價(jià)函數(shù)之后添加L2正則化,則迭代公式為:
\[\theta_j = \theta_j(1- \alpha \frac{\lambda}{n}) - \alpha \frac{1}{n} \sum_{i=1}^n (h \theta (x^{(i)}) - y^{(i)}) x_j^{(i)} ........(8)\] - 其中\(\lambda\)就是正則化參數(shù)。從上式可以看到,與未添加L2正則化的迭代公式相比,每一次迭代,\(\theta_j\)都要先乘以一個(gè)小于1的因子,從而使得\(\theta_j\)不斷減小,因此總得來看,\(\theta\)是不斷減小的。
最開始也提到L1正則化一定程度上也可以防止過擬合。之前做了解釋,當(dāng)L1的正則化系數(shù)很小時(shí),得到的最優(yōu)解會(huì)很小,可以達(dá)到和L2正則化類似的效果。
5 正則化項(xiàng)的參數(shù)選擇
- L1、L2的參數(shù)\(\lambda\)如何選擇好?
- 以L2正則化參數(shù)為例:從公式(8)可以看到,λ越大,\(\theta_j\)衰減得越快。另一個(gè)理解可以參考L2求解圖, \(\lambda\)越大,L2圓的半徑越小,最后求得代價(jià)函數(shù)最值時(shí)各參數(shù)也會(huì)變得很小;當(dāng)然也不是越大越好,太大容易引起欠擬合。
- 經(jīng)驗(yàn)
從0開始,逐漸增大\(\lambda\)。在訓(xùn)練集上學(xué)習(xí)到參數(shù),然后在測(cè)試集上驗(yàn)證誤差。反復(fù)進(jìn)行這個(gè)過程,直到測(cè)試集上的誤差最小。一般的說,隨著\(\lambda\)從0開始增大,測(cè)試集的誤分類率應(yīng)該是先減小后增大,交叉驗(yàn)證的目的,就是為了找到誤分類率最小的那個(gè)位置。建議一開始將正則項(xiàng)系數(shù)λ設(shè)置為0,先確定一個(gè)比較好的learning rate。然后固定該learning rate,給\(\lambda\)一個(gè)值(比如1.0),然后根據(jù)validation accuracy,將λ增大或者減小10倍,增減10倍是粗調(diào)節(jié),當(dāng)你確定了\(\lambda\)的合適的數(shù)量級(jí)后,比如\(\lambda= 0.01\),再進(jìn)一步地細(xì)調(diào)節(jié),比如調(diào)節(jié)為0.02,0.03,0.009之類。
參考文獻(xiàn)
- https://blog.csdn.net/jinping_shi/article/details/52433975
- 《百面機(jī)器學(xué)習(xí)》
轉(zhuǎn)載于:https://www.cnblogs.com/zingp/p/10375691.html
總結(jié)
以上是生活随笔為你收集整理的深入理解L1、L2正则化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 学习第四十七天shelve
- 下一篇: 从零开始的全栈工程师——js篇2.12(