當我們需要解決一個非常複雜的問題,例如在高分辨率圖像中檢測數百種類型的對象,我們可能需要訓練一個非常深的DNN,可能需要幾十層或者上百層,每層包含數百個神經元,通過成千上萬個連接進行連接,我們會遇到以下問題:
首先,梯度消失或梯度爆炸
其次,訓練緩慢
第三,訓練參數大於訓練集的風險
梯度消失的原因:
生物神經元似乎是用 Sigmoid(S 型)激活函數活動的,因此研究人員在很長一段時間內堅持 Sigmoid 函數。但事實證明,Relu 激活函數通常在 ANN 工作得更好。這是生物研究誤導的例子之一。
當神經網絡有很多層,每個隱藏層都使用Sigmoid函數作爲激勵函數時,很容易引起梯度消失的問題
我們知道Sigmoid函數有一個缺點:當x較大或較小時,導數接近0;並且Sigmoid函數導數的最大值是0.25
我們將問題簡單化來說明梯度消失問題,假設輸入只有一個特徵,沒有偏置單元,每層只有一個神經元:
我們先進行前向傳播,這裏將Sigmoid激勵函數寫爲s(x):
z1 = w1*x
a1 = s(z1)
z2 = w2*a1
a2 = s(z2)
...
zn = wn*an-1 (這裏n-1是下標)
an = s(zn)
根據鏈式求導和反向傳播,我們很容易得出,其中C是代價函數
如果我們使用標準方法來初始化網絡中的權重,那麼會使用一個均值爲0標準差爲1的高斯分佈。因此所有的權重通常會滿足|wj|<1,而s‘是小於0.25的值,那麼當神經網絡特別深的時候,梯度呈指數級衰減,導數在每一層至少會被壓縮爲原來的1/4,當z值絕對值特別大時,導數趨於0,正是因爲這兩個原因,從輸出層不斷向輸入層反向傳播訓練時,導數很容易逐漸變爲0,使得權重和偏差參數無法被更新,導致神經網絡無法被優化,訓練永遠不會收斂到良好的解決方案。 這被稱爲梯度消失問題。
那麼我們繼續推廣到每層有多個神經元時,有其中a是Sigmoid函數的輸出,那麼它的範圍就是-1<a<1,那麼我們只考慮δ,有那麼很容易得出當參數|θ|<1時,容易引發梯度消失。
梯度爆炸的原因:
當我們將w初始化爲一個較大的值時,例如>10的值,那麼從輸出層到輸入層每一層都會有一個s‘(zn)*wn的增倍,當s‘(zn)爲0.25時s‘(zn)*wn>2.5,同梯度消失類似,當神經網絡很深時,梯度呈指數級增長,最後到輸入時,梯度將會非常大,我們會得到一個非常大的權重更新,這就是梯度爆炸的問題,在循環神經網絡中最爲常見.
解決方案:
好的參數初始化方式,如He初始化
非飽和的激活函數(如 ReLU)
批量規範化(Batch Normalization)
梯度截斷(Gradient Clipping)
更快的優化器
LSTM