sigmoid函数解决溢出_梯度消失和梯度爆炸及解决方法
一、為什么會產生梯度消失和梯度爆炸?
目前優化神經網絡的方法都是基于BP,即根據損失函數計算的誤差通過梯度反向傳播的方式,指導深度網絡權值的更新優化。其中將誤差從末層往前傳遞的過程需要鏈式法則(Chain Rule)的幫助,因此反向傳播算法可以說是梯度下降在鏈式法則中的應用。
而鏈式法則是一個連乘的形式,所以當層數越深的時候,梯度將以指數形式傳播。梯度消失問題和梯度爆炸問題一般隨著網絡層數的增加會變得越來越明顯。在根據損失函數計算的誤差通過梯度反向傳播的方式對深度網絡權值進行更新時,得到的梯度值接近0或特別大,也就是梯度消失或爆炸。梯度消失或梯度爆炸在本質原理上其實是一樣的。
二、分析產生梯度消失和梯度爆炸的原因
【梯度消失】經常出現,產生的原因有:一是在深層網絡中,二是采用了不合適的損失函數,比如sigmoid。當梯度消失發生時,接近于輸出層的隱藏層由于其梯度相對正常,所以權值更新時也就相對正常,但是當越靠近輸入層時,由于梯度消失現象,會導致靠近輸入層的隱藏層權值更新緩慢或者更新停滯。這就導致在訓練時,只等價于后面幾層的淺層網絡的學習。
【梯度爆炸】一般出現在深層網絡和權值初始化值太大的情況下。在深層神經網絡或循環神經網絡中,誤差的梯度可在更新中累積相乘。如果網絡層之間的梯度值大于 1.0,那么重復相乘會導致梯度呈指數級增長,梯度變的非常大,然后導致網絡權重的大幅更新,并因此使網絡變得不穩定。
梯度爆炸會伴隨一些細微的信號,如:①模型不穩定,導致更新過程中的損失出現顯著變化;②訓練過程中,在極端情況下,權重的值變得非常大,以至于溢出,導致模型損失變成 NaN等等。
下面將從這3個角度分析一下產生這兩種現象的根本原因
(1)深層網絡
一個比較簡單的深層網絡如下:
由于深度網絡是多層非線性函數的堆砌,整個深度網絡可以視為是一個復合的非線性多元函數(這些非線性多元函數其實就是每層的激活函數),那么對loss function求不同層的權值偏導,相當于應用梯度下降的鏈式法則,鏈式法則是一個連乘的形式,所以當層數越深的時候,梯度將以指數傳播。
如果接近輸出層的激活函數求導后梯度值大于1,那么層數增多的時候,最終求出的梯度很容易指數級增長,就會產生梯度爆炸;相反,如果小于1,那么經過鏈式法則的連乘形式,也會很容易衰減至0,就會產生梯度消失。
從深層網絡角度來講,不同的層學習的速度差異很大,表現為網絡中靠近輸出的層學習的情況很好,靠近輸入的層學習的很慢,有時甚至訓練了很久,前幾層的權值和剛開始隨機初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向傳播訓練法則,屬于先天不足。
(2)激活函數
以下圖的反向傳播為例(假設每一層只有一個神經元且對于每一層
,其中為sigmoid函數)可以推導出:
原因看下圖,sigmoid導數的圖像。
如果使用sigmoid作為損失函數,其梯度是不可能超過0.25的,而我們初始化的網絡權值
通常都小于1,因此,因此對于上面的鏈式求導,層數越多,求導結果越小,因而很容易發生梯度消失。(3)初始化權重的值過大
如上圖所示,當
,也就是比較大的情況。根據鏈式相乘(反向傳播)可得,則前面的網絡層比后面的網絡層梯度變化更快,很容易發生梯度爆炸的問題。三、解決方法
梯度消失和梯度爆炸問題都是因為網絡太深,網絡權值更新不穩定造成的,本質上是因為梯度反向傳播中的連乘效應。解決梯度消失、爆炸主要有以下幾種方法:
(1) pre-training+fine-tunning
此方法來自Hinton在2006年發表的一篇論文,Hinton為了解決梯度的問題,提出采取無監督逐層訓練方法,其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成后,再對整個網絡進行“微調”(fine-tunning)。此思想相當于是先尋找局部最優,然后整合起來尋找全局最優,此方法有一定的好處,但是目前應用的不是很多了。
(2) 梯度剪切:對梯度設定閾值
梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然后更新梯度的時候,如果梯度超過這個閾值,那么就將其強制限制在這個范圍之內。這可以防止梯度爆炸。
(3) 權重正則化
另外一種解決梯度爆炸的手段是采用權重正則化(weithts regularization),正則化主要是通過對網絡權重做正則來限制過擬合。如果發生梯度爆炸,那么權值就會變的非常大,反過來,通過正則化項來限制權重的大小,也可以在一定程度上防止梯度爆炸的發生。比較常見的是 L1 正則和 L2 正則,在各個深度框架中都有相應的API可以使用正則化。
關于 L1 和 L2 正則化的詳細內容可以參考我之前的文章——欠擬合、過擬合及如何防止過擬合
(4) 選擇relu等梯度大部分落在常數上的激活函數
relu函數的導數在正數部分是恒等于1的,因此在深層網絡中使用relu激活函數就不會導致梯度消失和爆炸的問題。
關于relu等激活函數的詳細內容可以參考我之前的文章——溫故知新——激活函數及其各自的優缺點
(5) batch normalization
BN就是通過對每一層的輸出規范為均值和方差一致的方法,消除了權重參數放大縮小帶來的影響,進而解決梯度消失和爆炸的問題,或者可以理解為BN將輸出從飽和區拉倒了非飽和區。
關于Batch Normalization(BN)的詳細內容可以參考我之前的文章——常用的 Normalization 方法:BN、LN、IN、GN
(6) 殘差網絡的捷徑(shortcut)
說起殘差結構的話,不得不提這篇論文了:Deep Residual Learning for Image Recognition。論文鏈接:http://openaccess.thecvf.com/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf
相比較于以前直來直去的網絡結構,殘差中有很多這樣(如上圖所示)的跨層連接結構,這樣的結構在反向傳播中具有很大的好處,可以避免梯度消失。
(7) LSTM的“門(gate)”結構
LSTM全稱是長短期記憶網絡(long-short term memory networks),LSTM的結構設計可以改善RNN中的梯度消失的問題。主要原因在于LSTM內部復雜的“門”(gates),如下圖所示。
LSTM 通過它內部的“門”可以在接下來更新的時候“記住”前幾次訓練的”殘留記憶“。
總結
以上是生活随笔為你收集整理的sigmoid函数解决溢出_梯度消失和梯度爆炸及解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用python语言实现人工智能猴子摘香蕉
- 下一篇: 红黑树的删除_深入理解红黑树