什么是梯度爆炸/梯度消失?
深度神經網絡訓練的時候,采用的是反向傳播方式,該方式使用鏈式求導,計算每層梯度的時候會涉及一些連乘操作,因此如果網絡過深。
那么如果連乘的因子大部分小於1,最后乘積的結果可能趨於0,也就是梯度消失,后面的網絡層的參數不發生變化.
那么如果連乘的因子大部分大於1,最后乘積可能趨於無窮,這就是梯度爆炸
如何防止梯度消失?
sigmoid容易發生,更換激活函數為 ReLU即可。
權重初始化用高斯初始化
如何防止梯度爆炸?
1 設置梯度剪切閾值,如果超過了該閾值,直接將梯度置為該值。
2 使用ReLU,maxout等替代sigmoid
區別:
- sigmoid函數值在[0,1],ReLU函數值在[0,+無窮],所以sigmoid函數可以描述概率,ReLU適合用來描述實數;
- sigmoid函數的梯度隨着x的增大或減小和消失,而ReLU不會。
- Relu會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性,並且減少了參數的相互依存關系,緩解了過擬合問題的發生
sigmoid導數最大為1/4
a的數值變化范圍很小,若x數值僅在[-4,4]窄范圍內會出現梯度消失,若大於4則梯度爆炸。
對於sigmoid更容易出現梯度消失。
Battch Normal
ref
解決了梯度消失與加速收斂(數據本身在0均值處)和internal covariate shift(內部神經元分布的改變) 數據分布不一致問題。
傳統的深度神經網絡在訓練是,每一層的輸入的分布都在改變,因此訓練困難,只能選擇用一個很小的學習速率,但是每一層用了BN后,可以有效的解決這個問題,學習速率可以增大很多倍.
-
通過將activation規范為均值和方差一致的手段使得原本會減小的activation的scale變大。
-
初始化的時候,我們的參數一般都是0均值的,因此開始的擬合y=Wx+b,基本過原點附近,如圖b紅色虛線。因此,網絡需要經過多次學習才能逐步達到如紫色實線的擬合,即收斂的比較慢。如果我們對輸入數據先作減均值操作,如圖c,顯然可以加快學習。更進一步的,我們對數據再進行去相關操作,使得數據更加容易區分,這樣又會加快訓練,如圖d。 通過把梯度映射到一個值大但次優的變化位置來阻止梯度過小變化。
-
統計機器學習中的一個經典假設是“源空間(source domain)和目標空間(target domain)的數據分布(distribution)是一致的”。如果不一致,那么就出現了新的機器學習問題,如,transfer learning/domain adaptation等。
covariate shift就是分布不一致假設之下的一個分支問題,它是指源空間和目標空間的條件概率是一致的,但是其邊緣概率不同,即:對所有\(x\in \mathcal{X},P_s(Y|X=x)=P_t(Y|X=x)\),但是\(P_s(X)\ne P_t(X)\).
對於神經網絡的各層輸出,由於它們經過了層內操作作用,其分布顯然與各層對應的輸入信號分布不同,而且差異會隨着網絡深度增大而增大,可是它們所能“指示”的樣本標記(label)仍然是不變的,這便符合了covariate shift的定義。由於是對層間信號的分析,也即是“internal”的來由。
因此至少0均值1方差的數據集可以減少樣本分布的變化問題 -
使用BN訓練時,一個樣本只與minibatch中其他樣本有相互關系;對於同一個訓練樣本,網絡的輸出會發生變化。這些效果有助於提升網絡泛化能力,像dropout一樣防止網絡過擬合,同時BN的使用,可以減少或者去掉dropout類似的策略。
BN(Batch Normalization)層的作用
- 加速收斂
- 控制過擬合,可以少用或不用Dropout和正則
- 降低網絡對初始化權重敏感
- 允許使用較大的學習率
在每一層輸入的時候,加個BN預處理操作。BN應作用在非線性映射前,即對x=Wu+b做規范化。在BN中,是通過將activation規范為均值和方差一致的手段使得原本會減小的activation的scale變大。可以說是一種更有效的local response normalization方法
PS:
Batch Norm會忽略圖像像素(或者特征)之間的絕對差異(因為均值歸零,方差歸一),而只考慮相對差異,所以在不需要絕對差異的任務中(比如分類),有錦上添花的效果。而對於圖像超分辨率這種需要利用絕對差異的任務,Batch Norm只會添亂。