前言
本文主要深入介紹深度學習中的梯度消失和梯度爆炸的問題以及解決方案舔清。本文分為三部分丝里,第一部分主要直觀的介紹深度學習中為什么使用梯度更新,第二部分主要介紹深度學習中梯度消失及爆炸的原因体谒,第三部分對提出梯度消失及爆炸的解決方案杯聚。有基礎的同鞋可以跳著閱讀。
其中抒痒,梯度消失爆炸的解決方案主要包括以下幾個部分幌绍。
- 預訓練加微調(diào)
- 梯度剪切、權重正則(針對梯度爆炸)
- 使用不同的激活函數(shù)
- 使用batchnorm
- 使用殘差結構
- 使用LSTM網(wǎng)絡
第一部分:為什么要使用梯度更新規(guī)則
在介紹梯度消失以及爆炸之前故响,先簡單說一說梯度消失的根源—--深度神經(jīng)網(wǎng)絡和反向傳播傀广。目前深度學習方法中,深度神經(jīng)網(wǎng)絡的發(fā)展造就了我們可以構建更深層的網(wǎng)絡完成更復雜的任務彩届,深層網(wǎng)絡比如深度卷積網(wǎng)絡伪冰,LSTM等等,而且最終結果表明樟蠕,在處理復雜任務上糜值,深度網(wǎng)絡比淺層的網(wǎng)絡具有更好的效果。但是坯墨,目前優(yōu)化神經(jīng)網(wǎng)絡的方法都是基于反向傳播的思想寂汇,即根據(jù)損失函數(shù)計算的誤差通過梯度反向傳播的方式,指導深度網(wǎng)絡權值的更新優(yōu)化捣染。這樣做是有一定原因的骄瓣,首先,深層網(wǎng)絡由許多非線性層堆疊而來耍攘,每一層非線性層都可以視為是一個非線性函數(shù)
(非線性來自于非線性激活函數(shù))榕栏,因此整個深度網(wǎng)絡可以視為是一個復合的非線性多元函數(shù)
我們最終的目的是希望這個多元函數(shù)可以很好的完成輸入到輸出之間的映射,假設不同的輸入蕾各,輸出的最優(yōu)解是
扒磁,那么,優(yōu)化深度網(wǎng)絡就是為了尋找到合適的權值式曲,滿足
取得極小值點妨托,比如最簡單的損失函數(shù)
,假設損失函數(shù)的數(shù)據(jù)空間是下圖這樣的,我們最優(yōu)的權值就是為了尋找下圖中的最小值點吝羞,對于這種數(shù)學尋找最小值問題兰伤,采用梯度下降的方法再適合不過了。
image
第二部分:梯度消失钧排、爆炸
梯度消失與梯度爆炸其實是一種情況敦腔,看接下來的文章就知道了。兩種情況下梯度消失經(jīng)常出現(xiàn)恨溜,一是在深層網(wǎng)絡中符衔,二是采用了不合適的損失函數(shù)找前,比如sigmoid。梯度爆炸一般出現(xiàn)在深層網(wǎng)絡和權值初始化值太大的情況下判族,下面分別從這兩個角度分析梯度消失和爆炸的原因纸厉。
1.深層網(wǎng)絡角度
比較簡單的深層網(wǎng)絡如下:
image
圖中是一個四層的全連接網(wǎng)絡,假設每一層網(wǎng)絡激活后的輸出為
,其中
為第
層,
代表第
層的輸入五嫂,也就是第
層的輸出,
是激活函數(shù)肯尺,那么沃缘,得出
,簡單記為
则吟。
BP算法基于梯度下降策略槐臀,以目標的負梯度方向對參數(shù)進行調(diào)整,參數(shù)的更新為
氓仲,給定學習率
水慨,得出
。如果要更新第二隱藏層的權值信息敬扛,根據(jù)鏈式求導法則晰洒,更新梯度信息:
,很容易看出來
啥箭,即第二隱藏層的輸入谍珊。
所以說,
就是對激活函數(shù)進行求導急侥,如果此部分大于1砌滞,那么層數(shù)增多的時候,最終的求出的梯度更新將以指數(shù)形式增加坏怪,即發(fā)生梯度爆炸贝润,如果此部分小于1,那么隨著層數(shù)增多铝宵,求出的梯度更新信息將會以指數(shù)形式衰減打掘,即發(fā)生了梯度消失。如果說從數(shù)學上看不夠直觀的話鹏秋,下面幾個圖可以很直觀的說明深層網(wǎng)絡的梯度問題
(圖片內(nèi)容來自參考文獻1):
注:下圖中的隱層標號和第一張全連接圖隱層標號剛好相反胧卤。
圖中的曲線表示權值更新的速度,對于下圖兩個隱層的網(wǎng)絡來說拼岳,已經(jīng)可以發(fā)現(xiàn)隱藏層2的權值更新速度要比隱藏層1更新的速度慢
image
? ? 那么對于四個隱層的網(wǎng)絡來說枝誊,就更明顯了,第四隱藏層比第一隱藏層的更新速度慢了兩個數(shù)量級:
image
總結:從深層網(wǎng)絡角度來講惜纸,不同的層學習的速度差異很大叶撒,表現(xiàn)為網(wǎng)絡中靠近輸出的層學習的情況很好绝骚,靠近輸入的層學習的很慢,有時甚至訓練了很久祠够,前幾層的權值和剛開始隨機初始化的值差不多压汪。因此,梯度消失古瓤、爆炸止剖,其根本原因在于反向傳播訓練法則,屬于先天不足落君,另外多說一句穿香,Hinton提出capsule的原因就是為了徹底拋棄反向傳播,如果真能大范圍普及绎速,那真是一個革命皮获。
2.激活函數(shù)角度
其實也注意到了,上文中提到計算權值更新信息的時候需要計算前層偏導信息纹冤,因此如果激活函數(shù)選擇不合適洒宝,比如使用sigmoid,梯度消失就會很明顯了萌京,原因看下圖雁歌,左圖是sigmoid的損失函數(shù)圖,右邊是其倒數(shù)的圖像知残,如果使用sigmoid作為損失函數(shù)将宪,其梯度是不可能超過0.25的,這樣經(jīng)過鏈式求導之后橡庞,很容易發(fā)生梯度消失较坛,sigmoid函數(shù)數(shù)學表達式為:
sigmoid函數(shù)
sigmoid函數(shù)導數(shù)
同理,tanh作為損失函數(shù)扒最,它的導數(shù)圖如下丑勤,可以看出,tanh比sigmoid要好一些吧趣,但是它的倒數(shù)仍然是小于1的法竞。tanh數(shù)學表達為:
image
第三部分:梯度消失帘瞭、爆炸的解決方案
2.1 方案1-預訓練加微調(diào)
此方法來自Hinton在2006年發(fā)表的一篇論文郎楼,Hinton為了解決梯度的問題,提出采取無監(jiān)督逐層訓練方法犬庇,其基本思想是每次訓練一層隱節(jié)點俯渤,訓練時將上一層隱節(jié)點的輸出作為輸入呆细,而本層隱節(jié)點的輸出作為下一層隱節(jié)點的輸入,此過程就是逐層“預訓練”(pre-training)八匠;在預訓練完成后絮爷,再對整個網(wǎng)絡進行“微調(diào)”(fine-tunning)趴酣。Hinton在訓練深度信念網(wǎng)絡(Deep Belief Networks中,使用了這個方法坑夯,在各層預訓練完成后岖寞,再利用BP算法對整個網(wǎng)絡進行訓練。此思想相當于是先尋找局部最優(yōu)柜蜈,然后整合起來尋找全局最優(yōu)仗谆,此方法有一定的好處,但是目前應用的不是很多了淑履。
2.2 方案2-梯度剪切隶垮、正則
梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值鳖谈,然后更新梯度的時候,如果梯度超過這個閾值阔涉,那么就將其強制限制在這個范圍之內(nèi)缆娃。這可以防止梯度爆炸。
注:在WGAN中也有梯度剪切限制操作瑰排,但是和這個是不一樣的贯要,WGAN限制梯度更新信息是為了保證lipchitz條件。
另外一種解決梯度爆炸的手段是采用權重正則化(weithts regularization)比較常見的是
正則椭住,和
正則崇渗,在各個深度框架中都有相應的API可以使用正則化,比如在
中京郑,若搭建網(wǎng)絡的時候已經(jīng)設置了正則化參數(shù)宅广,則調(diào)用以下代碼可以直接計算出正則損失:
regularization_loss = tf.add_n(tf.losses.get_regularization_losses(scope='my_resnet_50'))
如果沒有設置初始化參數(shù),也可以使用以下代碼計算
正則損失:
l2_loss = tf.add_n([tf.nn.l2_loss(var)forvarintf.trainable_variables()if'weights'invar.name])
正則化是通過對網(wǎng)絡權重做正則限制過擬合些举,仔細看正則項在損失函數(shù)的形式:
其中跟狱,
是指正則項系數(shù),因此户魏,如果發(fā)生梯度爆炸驶臊,權值的范數(shù)就會變的非常大,通過正則化項叼丑,可以部分限制梯度爆炸的發(fā)生关翎。
注:事實上,在深度神經(jīng)網(wǎng)絡中鸠信,往往是梯度消失出現(xiàn)的更多一些纵寝。
2.3 方案3-relu、leakrelu星立、elu等激活函數(shù)
Relu:思想也很簡單店雅,如果激活函數(shù)的導數(shù)為1政基,那么就不存在梯度消失爆炸的問題了,每層的網(wǎng)絡都可以得到相同的更新速度闹啦,relu就這樣應運而生沮明。先看一下relu的數(shù)學表達式:
image
其函數(shù)圖像:
image
從上圖中,我們可以很容易看出窍奋,relu函數(shù)的導數(shù)在正數(shù)部分是恒等于1的荐健,因此在深層網(wǎng)絡中使用relu激活函數(shù)就不會導致梯度消失和爆炸的問題。
relu的主要貢獻在于:
-- 解決了梯度消失琳袄、爆炸的問題
-- 計算方便江场,計算速度快
-- 加速了網(wǎng)絡的訓練
同時也存在一些缺點:
-- 由于負數(shù)部分恒為0,會導致一些神經(jīng)元無法激活(可通過設置小學習率部分解決)
-- 輸出不是以0為中心的
盡管relu也有缺點窖逗,但是仍然是目前使用最多的激活函數(shù)
leakrelu
leakrelu就是為了解決relu的0區(qū)間帶來的影響址否,其數(shù)學表達為:
其中k是leak系數(shù),一般選擇0.01或者0.02碎紊,或者通過學習而來
image
leakrelu解決了0區(qū)間帶來的影響佑附,而且包含了relu的所有優(yōu)點
elu
elu激活函數(shù)也是為了解決relu的0區(qū)間帶來的影響,其數(shù)學表達為:
這里寫圖片描述
其函數(shù)及其導數(shù)數(shù)學形式為:
image
但是elu相對于leakrelu來說仗考,計算要更耗時間一些
2.4 解決方案4-batchnorm
Batchnorm是深度學習發(fā)展以來提出的最重要的成果之一了音同,目前已經(jīng)被廣泛的應用到了各大網(wǎng)絡中,具有加速網(wǎng)絡收斂速度秃嗜,提升訓練穩(wěn)定性的效果权均,Batchnorm本質(zhì)上是解決反向傳播過程中的梯度問題。batchnorm全名是batch normalization锅锨,簡稱BN叽赊,即批規(guī)范化,通過規(guī)范化操作將輸出信號x規(guī)范化保證網(wǎng)絡的穩(wěn)定性必搞。
具體的batchnorm原理非常復雜蛇尚,在這里不做詳細展開,此部分大概講一下batchnorm解決梯度的問題上顾画。具體來說就是反向傳播中取劫,經(jīng)過每一層的梯度會乘以該層的權重,舉個簡單例子:
正向傳播中
研侣,那么反向傳播中谱邪,
,反向傳播式子中有
的存在庶诡,所以
的大小影響了梯度的消失和爆炸惦银,batchnorm就是通過對每一層的輸出規(guī)范為均值和方差一致的方法,消除了
帶來的放大縮小的影響,進而解決梯度消失和爆炸的問題扯俱,或者可以理解為BN將輸出從飽和區(qū)拉倒了非飽和區(qū)书蚪。
有關batch norm詳細的內(nèi)容可以參考我的另一篇博客:
http://blog.csdn.net/qq_25737169/article/details/79048516
2.5 解決方案5-殘差結構
殘差結構說起殘差的話,不得不提這篇論文了:Deep Residual Learning for Image Recognition迅栅,關于這篇論文的解讀殊校,可以參考知乎鏈接:https://zhuanlan.zhihu.com/p/31852747這里只簡單介紹殘差如何解決梯度的問題。
事實上读存,就是殘差網(wǎng)絡的出現(xiàn)導致了image net比賽的終結为流,自從殘差提出后,幾乎所有的深度網(wǎng)絡都離不開殘差的身影让簿,相比較之前的幾層敬察,幾十層的深度網(wǎng)絡,在殘差網(wǎng)絡面前都不值一提尔当,殘差可以很輕松的構建幾百層莲祸,一千多層的網(wǎng)絡而不用擔心梯度消失過快的問題,原因就在于殘差的捷徑(shortcut)部分椭迎,其中殘差單元如下圖所示:
image
相比較于以前網(wǎng)絡的直來直去結構锐帜,殘差中有很多這樣的跨層連接結構,這樣的結構在反向傳播中具有很大的好處侠碧,見下式:
[圖片上傳失敗...(image-54f233-1530450385549)]
式子的第一個因子
表示的損失函數(shù)到達 L 的梯度抹估,小括號中的1表明短路機制可以無損地傳播梯度缠黍,而另外一項殘差梯度則需要經(jīng)過帶有weights的層弄兜,梯度不是直接傳遞過來的。殘差梯度不會那么巧全為-1瓷式,而且就算其比較小替饿,有1的存在也不會導致梯度消失。所以殘差學習會更容易贸典。
注:上面的推導并不是嚴格的證明视卢。
2.6 解決方案6-LSTM
LSTM全稱是長短期記憶網(wǎng)絡(long-short term memory networks),是不那么容易發(fā)生梯度消失的廊驼,主要原因在于LSTM內(nèi)部復雜的“門”(gates)据过,如下圖,LSTM通過它內(nèi)部的“門”可以接下來更新的時候“記住”前幾次訓練的”殘留記憶“妒挎,因此绳锅,經(jīng)常用于生成文本中。目前也有基于CNN的LSTM酝掩,感興趣的可以嘗試一下鳞芙。
參考資料:
1.《Neural networks and deep learning》
2.《機器學習》周志華
https://www.cnblogs.com/willnote/p/6912798.html
https://www.zhihu.com/question/38102762
http://www.reibang.com/p/9dc9f41f0b29
作者:機器學習算法工程師
鏈接:http://www.reibang.com/p/226ae95db20c
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯(lián)系作者獲得授權并注明出處。