天天看點

神經網絡梯度消失和梯度爆炸及解決辦法

神經網絡梯度消失和梯度爆炸及解決辦法

關注微信公衆号【Microstrong】,我現在研究方向是機器學習、深度學習,分享我在學習過程中的讀書筆記!一起來學習,一起來交流,一起來進步吧!

本文同步更新在我的微信公衆号中,公衆号文章位址:https://mp.weixin.qq.com/s/6xHC5woJND14bozsBNaaXQ

目錄:

(1)    神經網絡梯度消失與梯度爆炸

(2)    幾種激活函數的比較

推薦閱讀:《神經網絡激活函數的作用是什麼?》

一、神經網絡梯度消失與梯度爆炸

(1)簡介梯度消失與梯度爆炸

層數比較多的神經網絡模型在訓練的時候會出現梯度消失(gradient vanishing problem)和梯度爆炸(gradient exploding problem)問題。梯度消失問題和梯度爆炸問題一般會随着網絡層數的增加變得越來越明顯。

例如,對于圖1所示的含有3個隐藏層的神經網絡,梯度消失問題發生時,靠近輸出層的hidden layer 3的權值更新相對正常,但是靠近輸入層的hidden layer1的權值更新會變得很慢,導緻靠近輸入層的隐藏層權值幾乎不變,扔接近于初始化的權值。這就導緻hidden layer 1 相當于隻是一個映射層,對所有的輸入做了一個函數映射,這時此深度神經網絡的學習就等價于隻有後幾層的隐藏層網絡在學習。梯度爆炸的情況是:當初始的權值過大,靠近輸入層的hidden layer 1的權值變化比靠近輸出層的hidden layer 3的權值變化更快,就會引起梯度爆炸的問題。

神經網絡梯度消失和梯度爆炸及解決辦法

(2)梯度不穩定問題

在深度神經網絡中的梯度是不穩定的,在靠近輸入層的隐藏層中或會消失,或會爆炸。這種不穩定性才是深度神經網絡中基于梯度學習的根本問題。

梯度不穩定的原因:前面層上的梯度是來自後面層上梯度的乘積。當存在過多的層時,就會出現梯度不穩定場景,比如梯度消失和梯度爆炸。

(3)産生梯度消失的根本原因

我們以圖2的反向傳播為例,假設每一層隻有一個神經元且對于每一層都可以用公式1表示,其中σ為sigmoid函數,C表示的是代價函數,前一層的輸出和後一層的輸入關系如公式1所示。我們可以推導出公式2。

神經網絡梯度消失和梯度爆炸及解決辦法

而sigmoid函數的導數

神經網絡梯度消失和梯度爆炸及解決辦法

如圖3所示。

神經網絡梯度消失和梯度爆炸及解決辦法

可見,

神經網絡梯度消失和梯度爆炸及解決辦法

的最大值為

神經網絡梯度消失和梯度爆炸及解決辦法

,而我們一般會使用标準方法來初始化網絡權重,即使用一個均值為0标準差為1的高斯分布。是以,初始化的網絡權值通常都小于1,進而有

神經網絡梯度消失和梯度爆炸及解決辦法

。對于2式的鍊式求導,層數越多,求導結果越小,最終導緻梯度消失的情況出現。

神經網絡梯度消失和梯度爆炸及解決辦法

圖4:梯度變化的鍊式求導分析

對于圖4,

神經網絡梯度消失和梯度爆炸及解決辦法

神經網絡梯度消失和梯度爆炸及解決辦法

有共同的求導項。可以看出,前面的網絡層比後面的網絡層梯度變化更小,故權值變化緩慢,進而引起了梯度消失問題。

(4)産生梯度爆炸的根本原因

神經網絡梯度消失和梯度爆炸及解決辦法

,也就是w比較大的情況。則前面的網絡層比後面的網絡層梯度變化更快,引起了梯度爆炸的問題。

(5)當激活函數為sigmoid時,梯度消失和梯度爆炸哪個更容易發生?

結論:梯度爆炸問題在使用sigmoid激活函數時,出現的情況較少,不容易發生。

量化分析梯度爆炸時x的取值範圍:因導數最大為0.25,故

神經網絡梯度消失和梯度爆炸及解決辦法

>4,才可能出現

神經網絡梯度消失和梯度爆炸及解決辦法

;按照

神經網絡梯度消失和梯度爆炸及解決辦法

可計算出x的數值變化範圍很窄,僅在公式3範圍内,才會出現梯度爆炸。畫圖如5所示,可見x的數值變化範圍很小;最大數值範圍也僅僅0.45,當

神經網絡梯度消失和梯度爆炸及解決辦法

=6.9時出現。是以僅僅在此很窄的範圍内會出現梯度爆炸的問題。

神經網絡梯度消失和梯度爆炸及解決辦法
神經網絡梯度消失和梯度爆炸及解決辦法

圖5:x的數值變化範圍

(6)如何解決梯度消失和梯度爆炸

梯度消失和梯度爆炸問題都是因為網絡太深,網絡權值更新不穩定造成的,本質上是因為梯度反向傳播中的連乘效應。對于更普遍的梯度消失問題,可以考慮一下三種方案解決:

1.    用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函數。

2.    用Batch Normalization。

3.    LSTM的結構設計也可以改善RNN中的梯度消失問題。

二、幾種激活函數的比較

由于使用sigmoid激活函數會造成神經網絡的梯度消失和梯度爆炸問題,是以許多人提出了一些改進的激活函數,如:用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函數。下面我們具體來分析一下這幾個激活函數的差別。

(1)  Sigmoid

Sigmoid是常用的非線性的激活函數,它的數學形式如公式4:

神經網絡梯度消失和梯度爆炸及解決辦法
神經網絡梯度消失和梯度爆炸及解決辦法

圖6:sigmoid函數圖像 

神經網絡梯度消失和梯度爆炸及解決辦法

 圖7:sigmoid導函數圖像

Sigmoid函數在曆史上曾經非常的常用,輸出值範圍為[0,1]之間的實數。然而現在它已經不太受歡迎,實際中很少使用。原因是sigmoid存在3個問題:

1.sigmoid函數飽和使梯度消失(Sigmoidsaturate and kill gradients)。

我們從圖7可以看到sigmoid的導數都是小于0.25的,那麼在進行反向傳播的時候,梯度相乘結果會慢慢的趨近于0。這樣,幾乎就沒有梯度信号通過神經元傳遞到前面層的梯度更新中,是以這時前面層的權值幾乎沒有更新,這就叫梯度消失。除此之外,為了防止飽和,必須對于權重矩陣的初始化特别留意。如果初始化權重過大,可能很多神經元得到一個比較小的梯度,緻使神經元不能很好的更新權重提前飽和,神經網絡就幾乎不學習。

2.sigmoid函數輸出不是“零為中心”(zero-centered)。

一個多層的sigmoid神經網絡,如果你的輸入x都是正數,那麼在反向傳播中w的梯度傳播到網絡的某一處時,權值的變化是要麼全正要麼全負。

神經網絡梯度消失和梯度爆炸及解決辦法

圖8:sigmoid輸出不是關于原點對稱的影響

解釋下:當梯度從上層傳播下來,w的梯度都是用x乘以f的梯度,是以如果神經元輸出的梯度是正的,那麼所有w的梯度就會是正的,反之亦然。在這個例子中,我們會得到兩種權值,權值範圍分别位于圖8中一三象限。當輸入一個值時,w的梯度要麼都是正的要麼都是負的,當我們想要輸入一三象限區域以外的點時,我們将會得到這種并不理想的曲折路線(zig zag path),圖中紅色曲折路線。假設最優化的一個w矩陣是在圖8中的第四象限,那麼要将w優化到最優狀态,就必須走“之字形”路線,因為你的w要麼隻能往下走(負數),要麼隻能往右走(正的)。優化的時候效率十分低下,模型拟合的過程就會十分緩慢。

如果訓練的資料并不是“零為中心”,我們将多個或正或負的梯度結合起來就會使這種情況有所緩解,但是收斂速度會非常緩慢。該問題相對于神經元飽和問題來說還是要好很多。具體可以這樣解決,我們可以按batch去訓練資料,那麼每個batch可能得到不同的信号或正或負,這個批量的梯度加起來後可以緩解這個問題。

3.指數函數的計算是比較消耗計算資源的。

(2) tanh

神經網絡梯度消失和梯度爆炸及解決辦法

圖9:tanh(x)的函數圖像

tanh函數跟sigmoid還是很像的,實際上,tanh是sigmoid的變形如公式5所示。tanh的具體公式如公式6所示。

神經網絡梯度消失和梯度爆炸及解決辦法

tanh與sigmoid不同的是,tanh是“零為中心”的。是以,實際應用中,tanh會比sigmoid更好一些。但是在飽和神經元的情況下,還是沒有解決梯度消失問題。

優點:

1.tanh解決了sigmoid的輸出非“零為中心”的問題。

缺點:

1.依然有sigmoid函數過飽和的問題。

2.依然指數運算。

(3)  ReLU

近年來,ReLU函數變得越來越受歡迎。全稱是Rectified Linear Unit,中文名字:修正線性單元。ReLU是Krizhevsky、Hinton等人在2012年《ImageNet Classification with Deep Convolutional Neural Networks》論文中提出的一種線性且不飽和的激活函數。它的數學表達式如7所示:

神經網絡梯度消失和梯度爆炸及解決辦法
神經網絡梯度消失和梯度爆炸及解決辦法

圖10:ReLU函數圖像

優點:

1.ReLU解決了梯度消失的問題,至少x在正區間内,神經元不會飽和。

2.由于ReLU線性、非飽和的形式,在SGD中能夠快速收斂。

3.計算速度要快很多。ReLU函數隻有線性關系,不需要指數計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快。

缺點:

1.ReLU的輸出不是“零為中心”(Notzero-centered output)。

2.随着訓練的進行,可能會出現神經元死亡,權重無法更新的情況。這種神經元的死亡是不可逆轉的死亡。

解釋:訓練神經網絡的時候,一旦學習率沒有設定好,第一次更新權重的時候,輸入是負值,那麼這個含有ReLU的神經節點就會死亡,再也不會被激活。因為:ReLU的導數在x>0的時候是1,在x<=0的時候是0。如果x<=0,那麼ReLU的輸出是0,那麼反向傳播中梯度也是0,權重就不會被更新,導緻神經元不再學習。

也就是說,這個ReLU激活函數在訓練中将不可逆轉的死亡,導緻了訓練資料多樣化的丢失。在實際訓練中,如果學習率設定的太高,可能會發現網絡中40%的神經元都會死掉,且在整個訓練集中這些神經元都不會被激活。是以,設定一個合适的較小的學習率,會降低這種情況的發生。為了解決神經元節點死亡的情況,有人提出了Leaky ReLU、P-ReLu、R-ReLU、ELU等激活函數。

(4)  Leaky ReLU

ReLU是将所有的負值設定為0,造成神經元節點死亡情況。相反,Leaky ReLU是給所有負值賦予一個非零的斜率。Leaky ReLU激活函數是在聲學模型(2013)中首次提出來的。它的數學表達式如公式8所示。

神經網絡梯度消失和梯度爆炸及解決辦法
神經網絡梯度消失和梯度爆炸及解決辦法

圖11:Leaky ReLU函數圖像

Leaky ReLU很好的解決了“dead ReLU”的問題。因為Leaky ReLU保留了x小于0時的梯度,在x小于0時,不會出現神經元死亡的問題。對于Leaky ReLU給出了一個很小的負數梯度值α,這個值是很小的常數。比如:0.01。這樣即修正了資料分布,又保留了一些負軸的值,使得負軸資訊不會全部丢失。但是這個α通常是通過先驗知識人工指派的。

優點:

1.神經元不會出現死亡的情況。

2.對于所有的輸入,不管是大于等于0還是小于0,神經元不會飽和。

2.由于Leaky ReLU線性、非飽和的形式,在SGD中能夠快速收斂。

3.計算速度要快很多。Leaky ReLU函數隻有線性關系,不需要指數計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快。

缺點:

1.Leaky ReLU函數中的α,需要通過先驗知識人工指派。

擴充材料:

1.Andrew L. Maas, Awni Y. Hannum and Andrew Y. Ng. Rectified NonlinearitiesImprove Neural Network Acoustic Models (PDF). ICML.2013. 該論文提出了Leaky ReLU函數。

2.He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 該論文介紹了用Leaky ReLU函數的好處。

(5)  PReLU

PReLU的英文全稱為“Parametric ReLU”,我翻譯為“帶參數的線性修正單元”。我們觀察Leaky ReLU可知,在神經網絡中通過損失函數對α求導數,我們是可以求得的。那麼,我們可不可以将它作為一個參數進行訓練呢?在Kaiming He的論文《Delving deepinto rectifiers: Surpassing human-level performance on imagenet classification》中指出,α不僅可以訓練,而且效果更好。

神經網絡梯度消失和梯度爆炸及解決辦法

圖12:PReLU函數圖像

神經網絡梯度消失和梯度爆炸及解決辦法

公式9非常簡單,

神經網絡梯度消失和梯度爆炸及解決辦法

,表示還未經過激活函數的神經元輸出。論文中指出,使用了Parametric ReLU後,最終效果比不用提高了1.03%。

擴充材料:

He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 該論文作者對比了PReLU和ReLU在ImageNet model A的訓練效果。

(6)  RReLU

RReLU的英文全稱是“Randomized Leaky ReLU”,中文名字叫“随機修正線性單元”。RReLU是Leaky ReLU的随機版本。它首次是在Kaggle的NDSB比賽中被提出來的。

神經網絡梯度消失和梯度爆炸及解決辦法

圖13:Randomized Leaky ReLU函數圖像

RReLU的核心思想是,在訓練過程中,α是從一個高斯分布

神經網絡梯度消失和梯度爆炸及解決辦法

中随機出來的值,然後再在測試過程中進行修正。數學表達式如10式所示。

神經網絡梯度消失和梯度爆炸及解決辦法

在測試階段,把訓練過程中所有的

神經網絡梯度消失和梯度爆炸及解決辦法

取個平均值。NDSB冠軍的α是從

神經網絡梯度消失和梯度爆炸及解決辦法

中随機出來的。那麼在測試階段,激活函數就是公式11。

神經網絡梯度消失和梯度爆炸及解決辦法

特點:

1.RReLU是Leaky ReLU的random版本,在訓練過程中,α是從一個高斯分布中随機出來的,然後再測試過程中進行修正。

2.數學形式與PReLU類似,但RReLU是一種非确定性激活函數,其參數是随機的。

(7)ReLU、Leaky ReLU、PReLU和RReLU的比較

神經網絡梯度消失和梯度爆炸及解決辦法

圖14:ReLU、Leaky ReLU、PReLU、RReLU函數圖像

  1. PReLU中的α是根據資料變化的;
  2. Leaky ReLU中的α是固定的;
  3. RReLU中的α是一個在給定範圍内随機抽取的值,這個值在測試環節就會固定下來。

擴充材料:

Xu B, Wang N, Chen T, et al. Empiricalevaluation of rectified activations in convolutional network[J]. arXiv preprintarXiv:1505.00853, 2015. 在這篇論文中作者對比了ReLU、LReLU、PReLU、RReLU在CIFAR-10、CIFAR-100、NDSB資料集中的效果。

(8)ELU

ELU的英文全稱是“Exponential Linear Units”,中文全稱是“指數線性單元”。它試圖将激活函數的輸出平均值接近零,進而加快學習速度。同時,它還能通過正值的辨別來避免梯度消失的問題。根據一些研究顯示,ELU分類精确度是高于ReLU的。公式如12式所示。

神經網絡梯度消失和梯度爆炸及解決辦法
神經網絡梯度消失和梯度爆炸及解決辦法

圖15:ELU與其他幾種激活函數的比較圖

優點:

  1. ELU包含了ReLU的所有優點。
  2. 神經元不會出現死亡的情況。
  3. ELU激活函數的輸出均值是接近于零的。

缺點:

  1. 計算的時候是需要計算指數的,計算效率低的問題。

擴充材料:

Clevert D A, Unterthiner T, Hochreiter S. Fastand accurate deep network learning by exponential linear units (elus)[J]. arXivpreprint arXiv:1511.07289, 2015. 這篇論文提出了ELU函數。

(9)Maxout

Maxout “Neuron” 是由Goodfellow等人在2013年提出的一種很有特點的神經元,它的激活函數、計算的變量、計算方式和普通的神經元完全不同,并有兩組權重。先得到兩個超平面,再進行最大值計算。激活函數是對ReLU和Leaky ReLU的一般化歸納,沒有ReLU函數的缺點,不會出現激活函數飽和神經元死亡的情況。Maxout出現在ICML2013上,作者Goodfellow将maxout和dropout結合,稱在MNIST,CIFAR-10,CIFAR-100,SVHN這4個資料集上都取得了start-of-art的識别率。Maxout公式如13所示。

神經網絡梯度消失和梯度爆炸及解決辦法

其中

神經網絡梯度消失和梯度爆炸及解決辦法

,假設w是2維的,那麼我們可以得出公式14。

神經網絡梯度消失和梯度爆炸及解決辦法

分析公式14可以注意到,ReLU和Leaky ReLU都是它的一個變形。比如

神經網絡梯度消失和梯度爆炸及解決辦法

的時候,就是ReLU。Maxout的拟合能力非常強,它可以拟合任意的凸函數。Goodfellow在論文中從數學的角度上也證明了這個結論,隻需要2個Maxout節點就可以拟合任意的凸函數,前提是“隐含層”節點的個數足夠多。

優點:

  1. Maxout具有ReLU的所有優點,線性、不飽和性。
  2. 同時沒有ReLU的一些缺點。如:神經元的死亡。

缺點:

  1. 從這個激活函數的公式14中可以看出,每個neuron将有兩組w,那麼參數就增加了一倍。這就導緻了整體參數的數量激增。

擴充材料:

Goodfellow I J, Warde-Farley D, Mirza M, et al.Maxout networks[J]. arXiv preprint arXiv:1302.4389, 2013. Goodfellow的這篇論文提出了Maxout,感興趣可以了解一下。

總結:怎麼選擇激活函數?

關于激活函數的選取,目前還不存在定論,在實踐過程中更多還是需要結合實際情況,考慮不同激活函數的優缺點綜合使用。我在這裡給大家一點在訓練模型時候的建議。

1.通常來說,不會把各種激活函數串起來在一個網絡中使用。

2.如果使用ReLU,那麼一定要小心設定學習率(learning rate),并且要注意不要讓網絡中出現很多死亡神經元。如果死亡神經元過多的問題不好解決,可以試試Leaky ReLU、PReLU、或者Maxout。

3.盡量不要使用sigmoid激活函數,可以試試tanh,不過個人感覺tanh的效果會比不上ReLU和Maxout。

Reference:

1.Andrew L. Maas, Awni Y. Hannum and Andrew Y. Ng. Rectified NonlinearitiesImprove Neural Network Acoustic Models (PDF). ICML.2013. 該論文提出了Leaky ReLU函數。

2.He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 該論文介紹了用Leaky ReLU函數的好處。

3.He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 該論文作者對比了PReLU和ReLU在ImageNet model A的訓練效果。

4.Xu B, Wang N, Chen T, et al. Empiricalevaluation of rectified activations in convolutional network[J]. arXiv preprintarXiv:1505.00853, 2015. 在這篇論文中作者對比了ReLU、LReLU、PReLU、RReLU在CIFAR-10、CIFAR-100、NDSB資料集中的效果。

5.Clevert D A, Unterthiner T, Hochreiter S. Fastand accurate deep network learning by exponential linear units (elus)[J]. arXivpreprint arXiv:1511.07289, 2015. 這篇論文提出了ELU函數。

6.Goodfellow I J, Warde-Farley D, Mirza M, et al.Maxout networks[J]. arXiv preprint arXiv:1302.4389, 2013. Goodfellow的這篇論文提出了Maxout,感興趣可以了解一下。

梯度消失和梯度彌散問題:

https://zhuanlan.zhihu.com/p/25631496

https://ziyubiti.github.io/2016/11/06/gradvanish/

https://blog.csdn.net/cppjava_/article/details/68941436

激活函數問題:

https://blog.csdn.net/hduxiejun/article/details/70815620

https://blog.csdn.net/cyh_24/article/details/50593400

https://blog.csdn.net/huplion/article/details/79121988

https://blog.csdn.net/bea_tree/article/details/51503258

https://livc.io/blog/176

https://www.cnblogs.com/chamie/p/8665251.html

激活函數輸出不是“零為中心”出現全正全負了解:https://www.zhihu.com/question/57194292

https://stats.stackexchange.com/questions/237169/why-are-non-zero-centered-activation-functions-a-problem-in-backpropagation

https://blog.csdn.net/heisejiuhuche/article/details/72514790

訓練的資料需要zero-centered:

1.神經網絡的訓練中,為什麼訓練的資料如果不是zero-centered,收斂速度會較慢? - 知乎https://www.zhihu.com/question/58582257

2.訓練深度神經網絡盡量使用zero-centered資料呢? - 知乎

https://www.zhihu.com/question/57194292

繼續閱讀