在總結正則化(Regularization)以前,咱們先談一談正則化是什麼,爲何要正則化。html
我的認爲正則化這個字眼有點太過抽象和寬泛,其實正則化的本質很簡單,就是對某一問題加以先驗的限制或約束以達到某種特定目的的一種手段或操做。在算法中使用正則化的目的是防止模型出現過擬合。一提到正則化,不少同窗可能立刻會想到經常使用的L1範數和L2範數,在彙總以前,咱們先看下LP範數是什麼鬼。算法
範數簡單能夠理解爲用來表徵向量空間中的距離,而距離的定義很抽象,只要知足非負、自反、三角不等式就能夠稱之爲距離。網絡
LP範數不是一個範數,而是一組範數,其定義以下:dom
$$||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範數是啥玩意?spa
L0範數表示向量中非零元素的個數,用公式表示以下:orm
$$||x||_{0} = \# (i | x_{i}\ne 0)$$
咱們能夠經過最小化L0範數,來尋找最少最優的稀疏特徵項。但不幸的是,L0範數的最優化問題是一個NP hard問題(L0範數一樣是非凸的)。所以,在實際應用中咱們常常對L0進行凸鬆弛,理論上有證實,L1範數是L0範數的最優凸近似,所以一般使用L1範數來代替直接優化L0範數。
根據LP範數的定義咱們能夠很輕鬆的獲得L1範數的數學形式:
$$||x||_{1} = \sum_{i}^{n} |x_{i}|$$
經過上式能夠看到,L1範數就是向量各元素的絕對值之和,也被稱爲是"稀疏規則算子"(Lasso regularization)。那麼問題來了,爲何咱們但願稀疏化?稀疏化有不少好處,最直接的兩個:
L2範數是最熟悉的,它就是歐幾里得距離,公式以下:
$$||x||_{2} = \sqrt{\sum_{i}^{n}(x_{i})^2}$$
L2範數有不少名稱,有人把它的迴歸叫「嶺迴歸」(Ridge Regression),也有人叫它「權值衰減」(Weight Decay)。以L2範數做爲正則項能夠獲得稠密解,即每一個特徵對應的參數$w$都很小,接近於0可是不爲0;此外,L2範數做爲正則化項,能夠防止模型爲了迎合訓練集而過於複雜形成過擬合的狀況,從而提升模型的泛化能力。
引入PRML一個經典的圖來講明下L1和L2範數的區別,以下圖所示:
以下圖所示:
Dropout是深度學習中常常採用的一種正則化方法。它的作法能夠簡單的理解爲在DNNs訓練的過程當中以機率$p$丟棄部分神經元,即便得被丟棄的神經元輸出爲0。Dropout能夠實例化的表示爲下圖:
咱們能夠從兩個方面去直觀地理解Dropout的正則化效果:
批規範化(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]$這些組合。
通常有兩種應用場景:
經常使用min-max normalization:
$$x^{'} = \frac{x-\min(x)}{\max(x)-\min(x)}$$
標準化(Standardization):用大數定理將數據轉化爲一個標準正態分佈,標準化公式爲:
$$x^{'}=\frac{x-\mu}{\sigma}$$
其中$\mu$是全部$x$的平均值,$\sigma$是這個特徵的標準差。
歸一化和標準化的區別:
咱們能夠這樣簡單地解釋:
歸一化的縮放是「拍扁」統一到區間(僅由極值決定),而標準化的縮放是更加「彈性」和「動態」的,和總體樣本的分佈有很大的關係。
值得注意:
歸一化:縮放僅僅跟最大、最小值的差異有關。
標準化:縮放和每一個點都有關係,經過方差(variance)體現出來。與歸一化對比,標準化中全部數據點都有貢獻(經過均值和標準差形成影響)。
爲何要標準化和歸一化?
1. Andrew Ng深度學習教程
2. Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)