神經網路梯度消失和梯度爆炸及解決辦法
關注微信公眾號【Microstrong】,我現在研究方向是機器學習、深度學習,分享我在學習過程中的讀書筆記!一起來學習,一起來交流,一起來進步吧!
目錄:
(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,從而有
圖4:梯度變化的鏈式求導分析
對於圖4,和有共同的求導項。可以看出,前面的網路層比後面的網路層梯度變化更小,故權值變化緩慢,從而引起了梯度消失問題。
(4)產生梯度爆炸的根本原因
當,也就是w比較大的情況。則前面的網路層比後面的網路層梯度變化更快,引起了梯度爆炸的問題。
(5)當啟用函式為sigmoid時,梯度消失和梯度爆炸哪個更容易發生?
結論:梯度爆炸問題在使用sigmoid啟用函式時,出現的情況較少,不容易發生。
量化分析梯度爆炸時x的取值範圍:因導數最大為0.25,故>4,才可能出現;按照可計算出x的數值變化範圍很窄,僅在公式3範圍內,才會出現梯度爆炸。畫圖如5所示,可見x的數值變化範圍很小;最大數值範圍也僅僅0.45,當
圖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函式影象
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的效
關注微信公眾號【Microstrong】,我現在研究方向是機器學習、深度學習,分享我在學習過程中的讀書筆記!一起來學習,一起來交流,一起來進步吧!目錄:(1)神經網路梯度消失與梯度爆炸(2)幾種啟用函式的比較一、神經網路梯度消失與梯度爆炸(1)簡介梯度消失與梯度爆炸層數比較多 1、RNN模型結構
迴圈神經網路RNN(Recurrent Neural Network)會記憶之前的資訊,並利用之前的資訊影響後面結點的輸出。也就是說,迴圈神經網路的隱藏層之間的結點是有連線的,隱藏層的輸入不僅包括輸入層的輸出,還包括上時刻隱藏層的輸出。下圖為RNN模型結構圖:
2、R
我選取了原文的部分內容進行轉載。之前我搜索”梯度消失和梯度爆炸“的相關部落格,發現很多都解釋的不是很好,然後看到了 極客學院 的這篇介紹,感覺介紹的挺詳細,轉載一下,大家一起分享一下~
到現在為止,本書講神經網路看作是瘋狂的客戶。幾乎我們遇到的所有的網路 # 梯度在神經網路中的作用
在談梯度消失和梯度爆炸的問題之前,我們先來考慮一下為什麼我們要利用梯度,同時鋪墊一些公式,以便於後面的理解。
存在梯度消失和梯度爆炸問題的根本原因就是我們在深度神網路中利用反向傳播的思想來進行權重的更新。即根據損失函式計算出的誤差,然後通過梯度反向傳播來減小誤差、更新權重。
分享 之間 family -s info 小數 right 也會 使用 一、梯度消失、梯度爆炸產生的原因
假設存在一個網絡結構如圖:
其表達式為:
若要對於w1求梯度,根據鏈式求導法則,得到的解為:
通常,若使用的激活函數為sigmoid函數,其
1.為什麼使用梯度下降來優化神經網路引數?
反向傳播(用於優化神網引數):根據損失函式計算的誤差通過反向傳播的方式,指導深度網路引數的更新優化。
採取反向傳播的原因:首先,深層網路由許多線性層和非線性層堆疊而來,每一層非線性層都可以視為是一個非線性函式
1.梯度爆炸
1)原因
在深層網路或遞迴神經網路中,誤差梯度在更新中累積得到一個非常大的梯度,這樣的梯度會大幅度更新網路引數,進而導致網路不穩定。在極端情況下,權重的值變得特別大,以至於結果會溢位(
為什麼會梯度爆炸或梯度消失:
梯度爆炸指的是在訓練時,累計了很大的誤差導數,導致神經網路模型大幅更新。這樣模型會變得很不穩定,不能從訓練資料中很好的進行學習。極端情況下會得到nan.
會發生這個的原因是在神經網路層間不斷的以指數級在乘以導數。
補充:雅克比矩陣 -- 函式的一階偏導數以一
梯度消失
主要是因為網路層數太多,太深,導致梯度無法傳播。本質應該是啟用函式的飽和性。
DNN結果出現nan值?
梯度爆炸,導致結果不收斂。都是梯度太大惹的禍,所以可以通過減小學習率(梯度變化直接變小)、減小batch size(累積梯度更小)、 features規格化(避
神經網路的訓練過程通常分為兩個階段:前向傳播和反向傳播。
前向傳播如下圖所示,原理比較簡單
上一層的神經元與本層的神經元有連線,那麼本層的神經元的啟用等於上一層神經元對應的權值進行加權和運算,最後通過一個非線性函式(啟用函式)如ReLu,sigmoid等
前言
本文主要深入介紹深度學習中的梯度消失和梯度爆炸的問題以及解決方案。本文分為三部分,第一部分主要直觀的介紹深度學習中為什麼使用梯度更新,第二部分主要介紹深度學習中梯度消失及爆炸的原因,第三部分對提出梯度消失及爆炸的解決方案。有基礎的同鞋可以跳著閱讀。
其中,梯度消失爆
產生消失的梯度問題的原因
注:實際上就是梯度計算過程中,w值和啟用函式的導數值相乘大於1或者小於1的問題,如果是大於1,那麼經歷過很多個隱藏層梯度就會越來越大,即梯度爆炸,如果是小於1當然就是梯度消失啦!!!
所以w初始化大,w值和啟用函式的導數值相乘可能越來越大,造成梯
層數比較多的神經網路模型在訓練時也是會出現一些問題的,其中就包括梯度消失問題(gradient vanishing problem)和梯度爆炸問題(gradient exploding problem)。梯度消失問題和梯度爆炸問題一般隨著網路層數的增加會變得越來越明顯。
例
最近在專案中遇到UI字型不清楚的情況,看起來很模糊。在網上也看到了其他人的解決辦法:1.把字型的字號改大一些,然後通過R鍵,等比例縮放Text,來解決。因為字號較小,單位畫素較少,導致渲染的時候模糊。採用上面的辦法也試過了,但是還是無法解決字型模糊的問題。最後通過修改匯入的字
一 梯度消失產生的根源
神經網路中訓練模型包括前向傳播和反向傳播兩個過程,反向傳播通過損失函式計算的誤差通過梯度反向傳播的形式對引數進行更新。深度神經網路包括很多隱藏層,每一層都是非線性對映。那麼整個神經網路就是個非線性多遠函式複合計算最終結果。那麼對求損失函式最小值,就可
RNN
首先來看一下經典的RRN的結構圖,這裡
x
x
x 是輸入
梯度消失出現的原因經常是因為網路層次過深,以及啟用函式選擇不當,比如sigmoid函式。
梯度爆炸出現的原因也是網路層次過深,或者權值初始化值太大。
綜合來看,這兩種梯度問題產生的原因可以歸結為網路深度,以及反向傳播帶來的遺留問題。
反向傳播基於的是鏈式求導法則
前言本文主要深入介紹深度學習中的梯度消失和梯度爆炸的問題以及解決方案。本文分為三部分,第一部分主要直觀的介紹深度學習中為什麼使用梯度更新,第二部分主要介紹深度學習中梯度消失及爆炸的原因,第三部分對提出梯度消失及爆炸的解決方案。有基礎的同鞋可以跳著閱讀。 其中,梯度消失爆炸的解
1. LSTM避免RNN的梯度消失(gradient vanishing)
RNN的本質是在網路內部維護了一個狀態 StSt,其中 tt 表示時間且 StSt 可遞迴計算。
傳統的RNN總是用“覆寫”的方式計算狀態:St=f(St−1,xt)St=f(St−1,xt)
原文:連結
建議先看第一個
一,經典的RNN結構如下圖所示:
假設我們的時間序列只有三段, 為給定值,神經元沒有啟用函式,則RNN最簡單的前向傳播過程如下:
假設在t=3時刻,損失函式為 。
則對於一次訓練任務的損失函式為 ,即每一時刻 相關推薦
神經網路梯度消失和梯度爆炸及解決辦法
RNN神經網路產生梯度消失和梯度爆炸的原因及解決方案
深度神經網路為何很難訓練(包含梯度消失和梯度爆炸等)
梯度消失和梯度爆炸及解決方案
對於梯度消失和梯度爆炸的理解
梯度消失和梯度爆炸問題詳解
梯度消失和梯度爆炸
RNN 梯度消失和梯度爆炸
深度學習:梯度消失和梯度爆炸
機器學習總結(二):梯度消失和梯度爆炸
梯度消失和梯度爆炸情況詳解
梯度消失和梯度爆炸的原因和解決方案
梯度消失和梯度爆炸的解答
Unity中字型模糊和圖片模糊及解決辦法
關於神經網路中梯度消失以及梯度爆炸
RNN中梯度消失和爆炸的問題公式推導
梯度消失,梯度爆炸及表現
[深度學習] 梯度消失與梯度爆炸的原因及解決方法
LSTM解決梯度消失和爆炸情況
RNN梯度消失和爆炸