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