1. 1範數和2範數
L1和L2正則化,其實就是在損失函數後面加一個1範數或2範數約束。
1-範數:
,1範數表示向量元素絕對值之和。
2-範數:
也稱歐幾里得範數。即向量元素絕對值的平方和再開方。
2. L1正則化
假設有如下帶L1正則化的損失函數:
令,則 J = J0 + L
其中J0爲原來損失函數,J爲加了L1正則項後的損失函數。α是正則化係數。注意到L1正則化是權值的絕對值之和,J是帶有絕對值符號的函數,因此J是不完全可微的。機器學習的任務就是要通過一些方法(比如梯度下降)求出損失函數的最小值。當我們在原始損失函數J0 後添加L1正則化項時,相當於對J0做了一個約束。此時我們的任務變成在L約束下求出J0取最小值的解。
考慮二維(即兩個變量:和 )的情況,即只有兩個權值和 。求解J0的過程可以畫出等值線(下圖彩色的圓),同時L1正則化的函數L也可以在二維平面上(解空間)畫出。
其中,彩色的圈是J0 的等值線,最裏面的是J0取得最小值時,和 的取值位置。當然有人問,爲什麼J0是圓,這個鏈接有寫,感興趣可以看一看:https://blog.csdn.net/peter_mama/article/details/104208172。 而L1正則項在平面上的圖形就是菱形。若沒有正則項(即菱形),那麼和 可以在解空間裏面 任意地取值:
有人問:爲什麼要搞個正則項,直接讓和 任意地取值,取到J0 的最小處不就最好嗎?
原因是:J0是表示模型對訓練集的損失值,如果和 直接去到J0的最小處(假設爲K點),則表示,模型對訓練集過擬合。因此我們加入正則項的目的是,防止模型過擬合。正則項規定,和 只能在菱形連取值。不能超過菱形。
因此,在圖中,當菱形和等值線首次相交的地方(上圖中的黑點),就是最優解。注意到這個頂點的值是,可以直觀想象,因爲LLL函數有很多『突出的角』(二維情況下四個,多維情況下更多),J0與這些角接觸的機率會遠大於與L其它部位接觸的機率,而在這些角上,會有很多權值等於0,這就是爲什麼L1正則化可以產生稀疏模型,進而可以用於特徵選擇。
而正則化前面的係數α,可以控制L圖形的大小。α越小,L的圖形越大(上圖中的菱形);α越大,L的圖形就越小,可以小到黑色方框只超出原點範圍一點點。
當α很小時,則以L1爲例,上圖的菱形區域將會覆蓋 J0 的最小處(K點),則表示能取到K點,則正則化失效,模型仍會過擬合。當α很大時,菱形區域很小,容易造成過擬合。
從梯度角度說明爲什麼L1容易稀疏:
那梯度下降法來訓練權重爲例:
切向量方向是當前運動方向,法向量是垂直切向量的。設最小點爲左圖紅色點,只有當法向量方向與 當前點與最小值方向 重合,那麼(w1,w2)點才停止運動,否則它還會沿着切向量方向運動,所以多數情況,對於L1來說,(w1,w2)點都是會運動到菱形的端點(0,w2)的,所以L1正則化,容易-產生稀疏的權重。
總結L1:
1. L1正則化的特點是,優化時,會有很多權值等於0,使得特徵矩陣稀疏化,進而可以用於特徵選擇。
2. 由於L1正則化容易產生權值稀疏,所以 L1也能有解決過擬合的效果。
3. L2正則化
L2正則化的損失函數:
正則化也有另外的一種表達形式:
和L1畫圖的方式一樣,當損失函數應用L2正則化時,圖如下:
可以看到與L1不同的是,L2在二維(兩個變量)的圖是個圓形。那麼損失函數 J 的最優點就是圓形和等值線重合的地方,如上圖黑點處。與L1相比,L2的“菱角”被磨平,因此L與J0相交時,和 等於0的機率小了很多。所以L2正則化是不具有稀疏性的。
L2正則化爲什麼可以獲得值很小的參數?
首先直觀看一個例子:
設輸入向量x=[1,1,1,1],兩個權重向量w_1=[1,0,0,0],w_2=[0.25,0.25,0.25,0.25]。則。兩個權重向量都得到同樣的內積,但是的L2懲罰是1.0,而 的L2懲罰是0.25。因此,根據L2懲罰來看,更好,因爲它的正則化損失更小。從直觀上來看,這是因爲的權重值更小且更分散。所以L2正則化傾向於是特徵分散,更小。
理論:
以線性迴歸中的梯度下降法爲例。假設要求的參數爲θ,是我們的假設函數。線性迴歸一般使用平方差損失函數。單個樣本的平方差是,,如果考慮所有樣本,損失函數是對每個樣本的平方差求和,假設有mmm個樣本,線性迴歸的代價函數如下,爲了後續處理方便,乘以一個常數。
所以,未加正則項的損失函數如下:
在梯度下降算法中,需要先對參數求導,得到梯度。梯度本身是上升最快的方向,爲了讓損失儘可能小,沿梯度的負方向更新參數即可。
對於單個樣本,先對某個參數求導:
假設的表達式是:. 單個樣本對某個參數求導,有,最終(3.1)式結果如下:
在考慮所有樣本的情況,將每個樣本對的導數求和即可,得到下式:
梯度下降算法中,爲了儘快收斂,會沿梯度的負方向更新參數,因此在(3.3)式前添加一個負號,並乘以一個係數α(即學習率),得到最終用於迭代計算參數的形式:
上式是沒有添加L2正則化項的迭代公式.
如果在原始代價函數之後添加L2正則化,即:
求導後:
又在(3.2)已證:,所以有:
加入學習率α,得到最終加入L2正則後,用於迭代計算參數的形式:
我們可以看到,每次迭代時,都會先乘上一個小於1的參數,那麼就會變量越來越小。
有人問:如果λ很大,變成一個很大的負數怎麼辦?不就越來越小啦?,這個我們看看,如果λ很大,那麼正則化的區域就會非常小,由於L2正則化是一個圓,所以λ很大,那麼圓就很小,甚至接近0,所以多小都會有個極限的。
總結L2:
1. L2正則化傾向於是特徵(權重)分散,更小
2. 沒有特殊要求的情況下,能用L2就不用L1。
4. L2正則化在pytorch的應用
優化器採用Adam,並且設置參數weight_decay=10.0,即正則化項的權重等於10.0。
當weight_decay=0.0時,表示未使用正則化
optimizer = optim.Adam(model.parameters(),lr=learning_rate,weight_decay=10.0)
但是pytorch目前的接口只支持L2正則化,不支持L1正則化
如果要用L1正則化,則需要手動實現:
regularization_loss = 0
for param in model.parameters():
regularization_loss += torch.sum(abs(param))
classify_loss = criterion(pred,target)
loss = classify_loss + lamda * regularization_loss
optimizer.zero_grad()
loss.backward()
optimizer.step()
5. 結論性語言:
1. L1正則化容易產生稀疏權重矩陣,利於特徵選擇。也有一定的正則化能力;
2. L2正則化則傾向於生成權值較小的且分散的權值矩陣。生成的權值小的好處是,抗干擾性強,如果權值很大,那麼可能數據移動(變化)了一點點,就會產生很大的偏差。有利於提高魯棒性;
3. L1和L2都有提高泛化性能力,因爲都是要解決過擬合問題;
4. 沒有特殊要求,能用L2就用L2;
5. L1正則化符合拉普拉斯分佈,L2正則化符合高斯分佈;
6. Reference
https://blog.csdn.net/jinping_shi/article/details/52433975
https://blog.csdn.net/lxlhexl/article/details/90712302
https://blog.csdn.net/liuweiyuxiang/article/details/99984288