【轉載自 https://blog.csdn.net/program_developer/article/details/80032376】
一、神經網絡梯度消失與梯度爆炸
(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:
Sigmoid函數在歷史上曾經非常的常用,輸出值范圍為[0,1]之間的實數。然而現在它已經不太受歡迎,實際中很少使用。原因是sigmoid存在3個問題:
1.sigmoid函數飽和使梯度消失(Sigmoidsaturate and kill gradients)。
我們從圖7可以看到sigmoid的導數都是小於0.25的,那么在進行反向傳播的時候,梯度相乘結果會慢慢的趨近於0。這樣,幾乎就沒有梯度信號通過神經元傳遞到前面層的梯度更新中,因此這時前面層的權值幾乎沒有更新,這就叫梯度消失。除此之外,為了防止飽和,必須對於權重矩陣的初始化特別留意。如果初始化權重過大,可能很多神經元得到一個比較小的梯度,致使神經元不能很好的更新權重提前飽和,神經網絡就幾乎不學習。
2.sigmoid函數輸出不是“零為中心”(zero-centered)。
一個多層的sigmoid神經網絡,如果你的輸入x都是正數,那么在反向傳播中w的梯度傳播到網絡的某一處時,權值的變化是要么全正要么全負。
解釋下:當梯度從上層傳播下來,w的梯度都是用x乘以f的梯度,因此如果神經元輸出的梯度是正的,那么所有w的梯度就會是正的,反之亦然。在這個例子中,我們會得到兩種權值,權值范圍分別位於圖8中一三象限。當輸入一個值時,w的梯度要么都是正的要么都是負的,當我們想要輸入一三象限區域以外的點時,我們將會得到這種並不理想的曲折路線(zig zag path),圖中紅色曲折路線。假設最優化的一個w矩陣是在圖8中的第四象限,那么要將w優化到最優狀態,就必須走“之字形”路線,因為你的w要么只能往下走(負數),要么只能往右走(正的)。優化的時候效率十分低下,模型擬合的過程就會十分緩慢。
如果訓練的數據並不是“零為中心”,我們將多個或正或負的梯度結合起來就會使這種情況有所緩解,但是收斂速度會非常緩慢。該問題相對於神經元飽和問題來說還是要好很多。具體可以這樣解決,我們可以按batch去訓練數據,那么每個batch可能得到不同的信號或正或負,這個批量的梯度加起來后可以緩解這個問題。
3.指數函數的計算是比較消耗計算資源的。
(2) tanh
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所示:
優點:
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所示。
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》中指出,α不僅可以訓練,而且效果更好。
公式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函數圖像
PReLU中的α是根據數據變化的;
Leaky ReLU中的α是固定的;
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與其他幾種激活函數的比較圖
優點:
ELU包含了ReLU的所有優點。
神經元不會出現死亡的情況。
ELU激活函數的輸出均值是接近於零的。
缺點:
計算的時候是需要計算指數的,計算效率低的問題。
擴展材料:
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節點就可以擬合任意的凸函數,前提是“隱含層”節點的個數足夠多。
優點:
Maxout具有ReLU的所有優點,線性、不飽和性。
同時沒有ReLU的一些缺點。如:神經元的死亡。
缺點:
從這個激活函數的公式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
---------------------
作者:Microstrong0305
來源:CSDN
原文:https://blog.csdn.net/program_developer/article/details/80032376