在總結正則化(Regularization)之前,我們先談一談正則化是什么,為什么要正則化。
個人認為正則化這個字眼有點太過抽象和寬泛,其實正則化的本質很簡單,就是對某一問題加以先驗的限制或約束以達到某種特定目的的一種手段或操作。在算法中使用正則化的目的是防止模型出現過擬合。一提到正則化,很多同學可能馬上會想到常用的L1范數和L2范數,在匯總之前,我們先看下LP范數是什么鬼。
LP范數
范數簡單可以理解為用來表征向量空間中的距離,而距離的定義很抽象,只要滿足非負、自反、三角不等式就可以稱之為距離。
LP范數不是一個范數,而是一組范數,其定義如下:
$$||x||_{p} = (\sum_{i}^{n}x_{i}^p)^{\frac{1}{p}}$$
$p$的范圍是$[1, \infty)$。$p$在$(0,1)$范圍內定義的並不是范數,因為違反了三角不等式。
根據$p$的變化,范數也有着不同的變化,借用一個經典的有關P范數的變化圖如下:
上圖表示了$p$從0到正無窮變化時,單位球(unit ball)的變化情況。在P范數下定義的單位球都是凸集,但是當$0<p<1$時,在該定義下的unit ball並不是凸集(這個我們之前提到,當$0<p<1$時並不是范數)。
那問題來了,L0范數是啥玩意?
L0范數表示向量中非零元素的個數,用公式表示如下:
$$||x||_{0} = \# (i | x_{i}\ne 0)$$
我們可以通過最小化L0范數,來尋找最少最優的稀疏特征項。但不幸的是,L0范數的最優化問題是一個NP hard問題(L0范數同樣是非凸的)。因此,在實際應用中我們經常對L0進行凸松弛,理論上有證明,L1范數是L0范數的最優凸近似,因此通常使用L1范數來代替直接優化L0范數。
L1范數
根據LP范數的定義我們可以很輕松的得到L1范數的數學形式:
$$||x||_{1} = \sum_{i}^{n} |x_{i}|$$
通過上式可以看到,L1范數就是向量各元素的絕對值之和,也被稱為是"稀疏規則算子"(Lasso regularization)。那么問題來了,為什么我們希望稀疏化?稀疏化有很多好處,最直接的兩個:
- 特征選擇
- 可解釋性
L2范數
L2范數是最熟悉的,它就是歐幾里得距離,公式如下:
$$||x||_{2} = \sqrt{\sum_{i}^{n}(x_{i})^2}$$
L2范數有很多名稱,有人把它的回歸叫“嶺回歸”(Ridge Regression),也有人叫它“權值衰減”(Weight Decay)。以L2范數作為正則項可以得到稠密解,即每個特征對應的參數$w$都很小,接近於0但是不為0;此外,L2范數作為正則化項,可以防止模型為了迎合訓練集而過於復雜造成過擬合的情況,從而提高模型的泛化能力。
L1范數和L2范數的區別
引入PRML一個經典的圖來說明下L1和L2范數的區別,如下圖所示:
- L1范數相當於加入了一個Laplacean先驗;
- L2范數相當於加入了一個Gaussian先驗。
如下圖所示:
Dropout
Dropout是深度學習中經常采用的一種正則化方法。它的做法可以簡單的理解為在DNNs訓練的過程中以概率$p$丟棄部分神經元,即使得被丟棄的神經元輸出為0。Dropout可以實例化的表示為下圖:
我們可以從兩個方面去直觀地理解Dropout的正則化效果:
- 在Dropout每一輪訓練過程中隨機丟失神經元的操作相當於多個DNNs進行取平均,因此用於預測時具有vote的效果。
- 減少神經元之間復雜的共適應性。當隱藏層神經元被隨機刪除之后,使得全連接網絡具有了一定的稀疏化,從而有效地減輕了不同特征的協同效應。也就是說,有些特征可能會依賴於固定關系的隱含節點的共同作用,而通過Dropout的話,就有效地組織了某些特征在其他特征存在下才有效果的情況,增加了神經網絡的魯棒性。
Batch Normalization
批規范化(Batch Normalization)嚴格意義上講屬於歸一化手段,主要用於加速網絡的收斂,但也具有一定程度的正則化效果。
這里借鑒下魏秀參博士的知乎回答中對covariate shift的解釋(這里)。
注以下內容引自魏秀參博士的知乎回答:
大家都知道在統計機器學習中的一個經典假設是“源空間(source domain)和目標空間(target domain)的數據分布(distribution)是一致的”。如果不一致,那么就出現了新的機器學習問題,如transfer learning/domain adaptation等。而covariate shift就是分布不一致假設之下的一個分支問題,它是指源空間和目標空間的條件概率是一致的,但是其邊緣概率不同。大家細想便會發現,的確,對於神經網絡的各層輸出,由於它們經過了層內操作作用,其分布顯然與各層對應的輸入信號分布不同,而且差異會隨着網絡深度增大而增大,可是它們所能“指示”的樣本標記(label)仍然是不變的,這便符合了covariate shift的定義。
BN的基本思想其實相當直觀,因為神經網絡在做非線性變換前的激活輸入值($X=WU+B$,$U$是輸入)隨着網絡深度加深,其分布逐漸發生偏移或者變動(即上述的covariate shift)。之所以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近(對於Sigmoid函數來說,意味着激活輸入值$X=WU+B$是大的負值或正值),所以這導致后向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂越來越慢的本質原因。而BN就是通過一定的規范化手段,把每層神經網絡任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標准正態分布,避免因為激活函數導致的梯度彌散問題。所以與其說BN的作用是緩解covariate shift,倒不如說BN可緩解梯度彌散問題。
歸一化、標准化 & 正則化
正則化我們以及提到過了,這里簡單提一下歸一化和標准化。
歸一化(Normalization):歸一化的目標是找到某種映射關系,將原數據映射到$[a,b]$區間上。一般$a,b$會取$[-1,1],[0,1]$這些組合。
一般有兩種應用場景:
- 把數變為(0, 1)之間的小數
- 把有量綱的數轉化為無量綱的數
常用min-max normalization:
$$x^{'} = \frac{x-\min(x)}{\max(x)-\min(x)}$$
標准化(Standardization):用大數定理將數據轉化為一個標准正態分布,標准化公式為:
$$x^{'}=\frac{x-\mu}{\sigma}$$
其中$\mu$是所有$x$的平均值,$\sigma$是這個特征的標准差。
歸一化和標准化的區別:
我們可以這樣簡單地解釋:
歸一化的縮放是“拍扁”統一到區間(僅由極值決定),而標准化的縮放是更加“彈性”和“動態”的,和整體樣本的分布有很大的關系。
值得注意:
歸一化:縮放僅僅跟最大、最小值的差別有關。
標准化:縮放和每個點都有關系,通過方差(variance)體現出來。與歸一化對比,標准化中所有數據點都有貢獻(通過均值和標准差造成影響)。
為什么要標准化和歸一化?
- 提升模型精度:歸一化后,不同維度之間的特征在數值上有一定比較性,可以大大提高分類器的准確性。
- 加速模型收斂:標准化后,最優解的尋優過程明顯會變得平緩,更容易正確的收斂到最優解。如下圖所示:
Reference
1. Andrew Ng深度學習教程
2. Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)