https://blog.csdn.net/program_developer/article/details/80032376
一、神經(jīng)網(wǎng)絡(luò)梯度消失與梯度爆炸
(1)簡介梯度消失與梯度爆炸
層數(shù)比較多的神經(jīng)網(wǎng)絡(luò)模型在訓(xùn)練的時候會出現(xiàn)梯度消失(gradient vanishing problem)和梯度爆炸(gradient exploding problem)問題。梯度消失問題和梯度爆炸問題一般會隨著網(wǎng)絡(luò)層數(shù)的增加變得越來越明顯。
例如,對于圖1所示的含有3個隱藏層的神經(jīng)網(wǎng)絡(luò),梯度消失問題發(fā)生時,靠近輸出層的hidden layer 3的權(quán)值更新相對正常,但是靠近輸入層的hidden layer1的權(quán)值更新會變得很慢,導(dǎo)致靠近輸入層的隱藏層權(quán)值幾乎不變,扔接近于初始化的權(quán)值。這就導(dǎo)致hidden layer 1 相當(dāng)于只是一個映射層,對所有的輸入做了一個函數(shù)映射,這時此深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)就等價于只有后幾層的隱藏層網(wǎng)絡(luò)在學(xué)習(xí)。梯度爆炸的情況是:當(dāng)初始的權(quán)值過大,靠近輸入層的hidden layer 1的權(quán)值變化比靠近輸出層的hidden layer 3的權(quán)值變化更快,就會引起梯度爆炸的問題。
(2)梯度不穩(wěn)定問題
在深度神經(jīng)網(wǎng)絡(luò)中的梯度是不穩(wěn)定的,在靠近輸入層的隱藏層中或會消失,或會爆炸。這種不穩(wěn)定性才是深度神經(jīng)網(wǎng)絡(luò)中基于梯度學(xué)習(xí)的根本問題。
梯度不穩(wěn)定的原因:前面層上的梯度是來自后面層上梯度的乘積。當(dāng)存在過多的層時,就會出現(xiàn)梯度不穩(wěn)定場景,比如梯度消失和梯度爆炸。
(3)產(chǎn)生梯度消失的根本原因
我們以圖2的反向傳播為例,假設(shè)每一層只有一個神經(jīng)元且對于每一層都可以用公式1表示,其中σ為sigmoid函數(shù),C表示的是代價函數(shù),前一層的輸出和后一層的輸入關(guān)系如公式1所示。我們可以推導(dǎo)出公式2。
而sigmoid函數(shù)的導(dǎo)數(shù)如圖3所示。
可見,的最大值為,而我們一般會使用標(biāo)準(zhǔn)方法來初始化網(wǎng)絡(luò)權(quán)重,即使用一個均值為0標(biāo)準(zhǔn)差為1的高斯分布。因此,初始化的網(wǎng)絡(luò)權(quán)值通常都小于1,從而有。對于2式的鏈?zhǔn)角髮?dǎo),層數(shù)越多,求導(dǎo)結(jié)果越小,最終導(dǎo)致梯度消失的情況出現(xiàn)。
圖4:梯度變化的鏈?zhǔn)角髮?dǎo)分析
對于圖4,和有共同的求導(dǎo)項。可以看出,前面的網(wǎng)絡(luò)層比后面的網(wǎng)絡(luò)層梯度變化更小,故權(quán)值變化緩慢,從而引起了梯度消失問題。
(4)產(chǎn)生梯度爆炸的根本原因
當(dāng),也就是w比較大的情況。則前面的網(wǎng)絡(luò)層比后面的網(wǎng)絡(luò)層梯度變化更快,引起了梯度爆炸的問題。
(5)當(dāng)激活函數(shù)為sigmoid時,梯度消失和梯度爆炸哪個更容易發(fā)生?
結(jié)論:梯度爆炸問題在使用sigmoid激活函數(shù)時,出現(xiàn)的情況較少,不容易發(fā)生。
量化分析梯度爆炸時x的取值范圍:因?qū)?shù)最大為0.25,故>4,才可能出現(xiàn);按照可計算出x的數(shù)值變化范圍很窄,僅在公式3范圍內(nèi),才會出現(xiàn)梯度爆炸。畫圖如5所示,可見x的數(shù)值變化范圍很小;最大數(shù)值范圍也僅僅0.45,當(dāng)=6.9時出現(xiàn)。因此僅僅在此很窄的范圍內(nèi)會出現(xiàn)梯度爆炸的問題。
圖5:x的數(shù)值變化范圍
(6)如何解決梯度消失和梯度爆炸
梯度消失和梯度爆炸問題都是因為網(wǎng)絡(luò)太深,網(wǎng)絡(luò)權(quán)值更新不穩(wěn)定造成的,本質(zhì)上是因為梯度反向傳播中的連乘效應(yīng)。對于更普遍的梯度消失問題,可以考慮一下三種方案解決:
1.????用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函數(shù)。
2.????用Batch Normalization。
3.????LSTM的結(jié)構(gòu)設(shè)計也可以改善RNN中的梯度消失問題。
二、幾種激活函數(shù)的比較
由于使用sigmoid激活函數(shù)會造成神經(jīng)網(wǎng)絡(luò)的梯度消失和梯度爆炸問題,所以許多人提出了一些改進(jìn)的激活函數(shù),如:用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函數(shù)。下面我們具體來分析一下這幾個激活函數(shù)的區(qū)別。
(1)??Sigmoid
Sigmoid是常用的非線性的激活函數(shù),它的數(shù)學(xué)形式如公式4:
圖6:sigmoid函數(shù)圖像?
?圖7:sigmoid導(dǎo)函數(shù)圖像
Sigmoid函數(shù)在歷史上曾經(jīng)非常的常用,輸出值范圍為[0,1]之間的實數(shù)。然而現(xiàn)在它已經(jīng)不太受歡迎,實際中很少使用。原因是sigmoid存在3個問題:
1.sigmoid函數(shù)飽和使梯度消失(Sigmoidsaturate and kill gradients)。
我們從圖7可以看到sigmoid的導(dǎo)數(shù)都是小于0.25的,那么在進(jìn)行反向傳播的時候,梯度相乘結(jié)果會慢慢的趨近于0。這樣,幾乎就沒有梯度信號通過神經(jīng)元傳遞到前面層的梯度更新中,因此這時前面層的權(quán)值幾乎沒有更新,這就叫梯度消失。除此之外,為了防止飽和,必須對于權(quán)重矩陣的初始化特別留意。如果初始化權(quán)重過大,可能很多神經(jīng)元得到一個比較小的梯度,致使神經(jīng)元不能很好的更新權(quán)重提前飽和,神經(jīng)網(wǎng)絡(luò)就幾乎不學(xué)習(xí)。
2.sigmoid函數(shù)輸出不是“零為中心”(zero-centered)。
一個多層的sigmoid神經(jīng)網(wǎng)絡(luò),如果你的輸入x都是正數(shù),那么在反向傳播中w的梯度傳播到網(wǎng)絡(luò)的某一處時,權(quán)值的變化是要么全正要么全負(fù)。
圖8:sigmoid輸出不是關(guān)于原點對稱的影響
解釋下:當(dāng)梯度從上層傳播下來,w的梯度都是用x乘以f的梯度,因此如果神經(jīng)元輸出的梯度是正的,那么所有w的梯度就會是正的,反之亦然。在這個例子中,我們會得到兩種權(quán)值,權(quán)值范圍分別位于圖8中一三象限。當(dāng)輸入一個值時,w的梯度要么都是正的要么都是負(fù)的,當(dāng)我們想要輸入一三象限區(qū)域以外的點時,我們將會得到這種并不理想的曲折路線(zig zag path),圖中紅色曲折路線。假設(shè)最優(yōu)化的一個w矩陣是在圖8中的第四象限,那么要將w優(yōu)化到最優(yōu)狀態(tài),就必須走“之字形”路線,因為你的w要么只能往下走(負(fù)數(shù)),要么只能往右走(正的)。優(yōu)化的時候效率十分低下,模型擬合的過程就會十分緩慢。
如果訓(xùn)練的數(shù)據(jù)并不是“零為中心”,我們將多個或正或負(fù)的梯度結(jié)合起來就會使這種情況有所緩解,但是收斂速度會非常緩慢。該問題相對于神經(jīng)元飽和問題來說還是要好很多。具體可以這樣解決,我們可以按batch去訓(xùn)練數(shù)據(jù),那么每個batch可能得到不同的信號或正或負(fù),這個批量的梯度加起來后可以緩解這個問題。
3.指數(shù)函數(shù)的計算是比較消耗計算資源的。
3.指數(shù)函數(shù)的計算是比較消耗計算資源的。
(2)?tanh
圖9:tanh(x)的函數(shù)圖像
tanh函數(shù)跟sigmoid還是很像的,實際上,tanh是sigmoid的變形如公式5所示。tanh的具體公式如公式6所示。
tanh與sigmoid不同的是,tanh是“零為中心”的。因此,實際應(yīng)用中,tanh會比sigmoid更好一些。但是在飽和神經(jīng)元的情況下,還是沒有解決梯度消失問題。
優(yōu)點:
1.tanh解決了sigmoid的輸出非“零為中心”的問題。
缺點:
1.依然有sigmoid函數(shù)過飽和的問題。
2.依然指數(shù)運(yùn)算。
(3)??ReLU
近年來,ReLU函數(shù)變得越來越受歡迎。全稱是Rectified Linear Unit,中文名字:修正線性單元。ReLU是Krizhevsky、Hinton等人在2012年《ImageNet Classification with Deep Convolutional Neural Networks》論文中提出的一種線性且不飽和的激活函數(shù)。它的數(shù)學(xué)表達(dá)式如7所示:
圖10:ReLU函數(shù)圖像
優(yōu)點:
1.ReLU解決了梯度消失的問題,至少x在正區(qū)間內(nèi),神經(jīng)元不會飽和。
2.由于ReLU線性、非飽和的形式,在SGD中能夠快速收斂。
3.計算速度要快很多。ReLU函數(shù)只有線性關(guān)系,不需要指數(shù)計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快。
缺點:
1.ReLU的輸出不是“零為中心”(Notzero-centered output)。
2.隨著訓(xùn)練的進(jìn)行,可能會出現(xiàn)神經(jīng)元死亡,權(quán)重?zé)o法更新的情況。這種神經(jīng)元的死亡是不可逆轉(zhuǎn)的死亡。
解釋:訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時候,一旦學(xué)習(xí)率沒有設(shè)置好,第一次更新權(quán)重的時候,輸入是負(fù)值,那么這個含有ReLU的神經(jīng)節(jié)點就會死亡,再也不會被激活。因為:ReLU的導(dǎo)數(shù)在x>0的時候是1,在x<=0的時候是0。如果x<=0,那么ReLU的輸出是0,那么反向傳播中梯度也是0,權(quán)重就不會被更新,導(dǎo)致神經(jīng)元不再學(xué)習(xí)。
也就是說,這個ReLU激活函數(shù)在訓(xùn)練中將不可逆轉(zhuǎn)的死亡,導(dǎo)致了訓(xùn)練數(shù)據(jù)多樣化的丟失。在實際訓(xùn)練中,如果學(xué)習(xí)率設(shè)置的太高,可能會發(fā)現(xiàn)網(wǎng)絡(luò)中40%的神經(jīng)元都會死掉,且在整個訓(xùn)練集中這些神經(jīng)元都不會被激活。所以,設(shè)置一個合適的較小的學(xué)習(xí)率,會降低這種情況的發(fā)生。為了解決神經(jīng)元節(jié)點死亡的情況,有人提出了Leaky ReLU、P-ReLu、R-ReLU、ELU等激活函數(shù)。
(4)??Leaky ReLU
ReLU是將所有的負(fù)值設(shè)置為0,造成神經(jīng)元節(jié)點死亡情況。相反,Leaky ReLU是給所有負(fù)值賦予一個非零的斜率。Leaky ReLU激活函數(shù)是在聲學(xué)模型(2013)中首次提出來的。它的數(shù)學(xué)表達(dá)式如公式8所示。
圖11:Leaky ReLU函數(shù)圖像
Leaky ReLU很好的解決了“dead ReLU”的問題。因為Leaky ReLU保留了x小于0時的梯度,在x小于0時,不會出現(xiàn)神經(jīng)元死亡的問題。對于Leaky ReLU給出了一個很小的負(fù)數(shù)梯度值α,這個值是很小的常數(shù)。比如:0.01。這樣即修正了數(shù)據(jù)分布,又保留了一些負(fù)軸的值,使得負(fù)軸信息不會全部丟失。但是這個α通常是通過先驗知識人工賦值的。
優(yōu)點:
1.神經(jīng)元不會出現(xiàn)死亡的情況。
2.對于所有的輸入,不管是大于等于0還是小于0,神經(jīng)元不會飽和。
2.由于Leaky ReLU線性、非飽和的形式,在SGD中能夠快速收斂。
3.計算速度要快很多。Leaky ReLU函數(shù)只有線性關(guān)系,不需要指數(shù)計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快。
缺點:
1.Leaky ReLU函數(shù)中的α,需要通過先驗知識人工賦值。
擴(kuò)展材料:
1.Andrew L. Maas, Awni Y. Hannum and?Andrew Y. Ng.?Rectified NonlinearitiesImprove Neural Network Acoustic Models?(PDF).?ICML.2013. 該論文提出了Leaky ReLU函數(shù)。
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函數(shù)的好處。
(5)??PReLU
PReLU的英文全稱為“Parametric ReLU”,我翻譯為“帶參數(shù)的線性修正單元”。我們觀察Leaky ReLU可知,在神經(jīng)網(wǎng)絡(luò)中通過損失函數(shù)對α求導(dǎo)數(shù),我們是可以求得的。那么,我們可不可以將它作為一個參數(shù)進(jìn)行訓(xùn)練呢?在Kaiming He的論文《Delving deepinto rectifiers: Surpassing human-level performance on imagenet classification》中指出,α不僅可以訓(xùn)練,而且效果更好。
圖12:PReLU函數(shù)圖像
公式9非常簡單,,表示還未經(jīng)過激活函數(shù)的神經(jīng)元輸出。論文中指出,使用了Parametric ReLU后,最終效果比不用提高了1.03%。
擴(kuò)展材料:
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的訓(xùn)練效果。
(6)??RReLU
RReLU的英文全稱是“Randomized Leaky ReLU”,中文名字叫“隨機(jī)修正線性單元”。RReLU是Leaky ReLU的隨機(jī)版本。它首次是在Kaggle的NDSB比賽中被提出來的。
圖13:Randomized Leaky ReLU函數(shù)圖像
RReLU的核心思想是,在訓(xùn)練過程中,α是從一個高斯分布中隨機(jī)出來的值,然后再在測試過程中進(jìn)行修正。數(shù)學(xué)表達(dá)式如10式所示。
在測試階段,把訓(xùn)練過程中所有的取個平均值。NDSB冠軍的α是從中隨機(jī)出來的。那么在測試階段,激活函數(shù)就是公式11。
特點:
1.RReLU是Leaky ReLU的random版本,在訓(xùn)練過程中,α是從一個高斯分布中隨機(jī)出來的,然后再測試過程中進(jìn)行修正。
2.數(shù)學(xué)形式與PReLU類似,但RReLU是一種非確定性激活函數(shù),其參數(shù)是隨機(jī)的。
(7)ReLU、Leaky ReLU、PReLU和RReLU的比較
圖14:ReLU、Leaky ReLU、PReLU、RReLU函數(shù)圖像
PReLU中的α是根據(jù)數(shù)據(jù)變化的;
Leaky ReLU中的α是固定的;
RReLU中的α是一個在給定范圍內(nèi)隨機(jī)抽取的值,這個值在測試環(huán)節(jié)就會固定下來。
擴(kuò)展材料:
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數(shù)據(jù)集中的效果。
(8)ELU
ELU的英文全稱是“Exponential Linear Units”,中文全稱是“指數(shù)線性單元”。它試圖將激活函數(shù)的輸出平均值接近零,從而加快學(xué)習(xí)速度。同時,它還能通過正值的標(biāo)識來避免梯度消失的問題。根據(jù)一些研究顯示,ELU分類精確度是高于ReLU的。公式如12式所示。
圖15:ELU與其他幾種激活函數(shù)的比較圖
優(yōu)點:
ELU包含了ReLU的所有優(yōu)點。
神經(jīng)元不會出現(xiàn)死亡的情況。
ELU激活函數(shù)的輸出均值是接近于零的。
缺點:
計算的時候是需要計算指數(shù)的,計算效率低的問題。
擴(kuò)展材料:
Clevert D A, Unterthiner T, Hochreiter S. Fastand accurate deep network learning by exponential linear units (elus)[J]. arXivpreprint arXiv:1511.07289, 2015. 這篇論文提出了ELU函數(shù)。
(9)Maxout
Maxout “Neuron” 是由Goodfellow等人在2013年提出的一種很有特點的神經(jīng)元,它的激活函數(shù)、計算的變量、計算方式和普通的神經(jīng)元完全不同,并有兩組權(quán)重。先得到兩個超平面,再進(jìn)行最大值計算。激活函數(shù)是對ReLU和Leaky ReLU的一般化歸納,沒有ReLU函數(shù)的缺點,不會出現(xiàn)激活函數(shù)飽和神經(jīng)元死亡的情況。Maxout出現(xiàn)在ICML2013上,作者Goodfellow將maxout和dropout結(jié)合,稱在MNIST,CIFAR-10,CIFAR-100,SVHN這4個數(shù)據(jù)集上都取得了start-of-art的識別率。Maxout公式如13所示。
其中,假設(shè)w是2維的,那么我們可以得出公式14。
分析公式14可以注意到,ReLU和Leaky ReLU都是它的一個變形。比如的時候,就是ReLU。Maxout的擬合能力非常強(qiáng),它可以擬合任意的凸函數(shù)。Goodfellow在論文中從數(shù)學(xué)的角度上也證明了這個結(jié)論,只需要2個Maxout節(jié)點就可以擬合任意的凸函數(shù),前提是“隱含層”節(jié)點的個數(shù)足夠多。
優(yōu)點:
Maxout具有ReLU的所有優(yōu)點,線性、不飽和性。
同時沒有ReLU的一些缺點。如:神經(jīng)元的死亡。
缺點:
從這個激活函數(shù)的公式14中可以看出,每個neuron將有兩組w,那么參數(shù)就增加了一倍。這就導(dǎo)致了整體參數(shù)的數(shù)量激增。
擴(kuò)展材料:
Goodfellow I J, Warde-Farley D, Mirza M, et al.Maxout networks[J]. arXiv preprint arXiv:1302.4389, 2013. Goodfellow的這篇論文提出了Maxout,感興趣可以了解一下。
總結(jié):怎么選擇激活函數(shù)?
關(guān)于激活函數(shù)的選取,目前還不存在定論,在實踐過程中更多還是需要結(jié)合實際情況,考慮不同激活函數(shù)的優(yōu)缺點綜合使用。我在這里給大家一點在訓(xùn)練模型時候的建議。
1.通常來說,不會把各種激活函數(shù)串起來在一個網(wǎng)絡(luò)中使用。
2.如果使用ReLU,那么一定要小心設(shè)置學(xué)習(xí)率(learning rate),并且要注意不要讓網(wǎng)絡(luò)中出現(xiàn)很多死亡神經(jīng)元。如果死亡神經(jīng)元過多的問題不好解決,可以試試Leaky ReLU、PReLU、或者M(jìn)axout。
3.盡量不要使用sigmoid激活函數(shù),可以試試tanh,不過個人感覺tanh的效果會比不上ReLU和Maxout。
---------------------
作者:Microstrong0305
來源:CSDN
原文:https://blog.csdn.net/program_developer/article/details/80032376
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!