編者按:DRDO研究人員Ayoosh Kathuria深入討論了激活函數(shù)如何隱式地改變傳入網(wǎng)絡(luò)層的數(shù)據(jù)分布,進而影響網(wǎng)絡(luò)的優(yōu)化過程。
這是優(yōu)化系列的第三篇,我們想要通過這一系列文章全面回顧深度學(xué)習(xí)中的優(yōu)化技術(shù)。到目前為止,我們已經(jīng)討論了:
用于對抗局部極小值、鞍點的mini batch梯度下降
動量、RMSProp、Adam等方法在原始梯度下降的基礎(chǔ)上加強了哪些方面,以應(yīng)對病態(tài)曲率問題。
分布,該死的分布,還有統(tǒng)計學(xué)
不同于之前的機器學(xué)習(xí)方法,神經(jīng)網(wǎng)絡(luò)并不依賴關(guān)于輸入數(shù)據(jù)的任何概率學(xué)或統(tǒng)計學(xué)假定。然而,為了確保神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)良好,最重要的因素之一是傳入神經(jīng)網(wǎng)絡(luò)層的數(shù)據(jù)需要具有特定的性質(zhì)。
數(shù)據(jù)分布應(yīng)該是零中心化(zero centered)的,也就是說,分布的均值應(yīng)該在零附近。不具有這一性質(zhì)的數(shù)據(jù)可能導(dǎo)致梯度消失和訓(xùn)練抖動。
分布最好是正態(tài)的,否則可能導(dǎo)致網(wǎng)絡(luò)過擬合輸入空間的某個區(qū)域。
在訓(xùn)練過程中,不同batch和不同網(wǎng)絡(luò)層的激活分布,應(yīng)該保持一定程度上的一致。如果不具備這一性質(zhì),那么我們說分布出現(xiàn)了內(nèi)部協(xié)方差偏移(Internal Covariate shift),這可能拖慢訓(xùn)練進程。
這篇文章將討論如何使用激活函數(shù)應(yīng)對前兩個問題。文末將給出一些選擇激活函數(shù)的建議。
梯度消失
梯度消失問題有豐富的文檔,隨著神經(jīng)網(wǎng)絡(luò)越來越深,這一問題越來越得到重視。下面我們將解釋梯度為什么會消失。讓我們想象一個最簡單的神經(jīng)網(wǎng)絡(luò),一組線性堆疊的神經(jīng)元。
實際上,上面的網(wǎng)絡(luò)很容易擴展成深度密集連接架構(gòu)。只需將網(wǎng)絡(luò)中的每個神經(jīng)元替換成一個使用sigmoid激活函數(shù)的全連接層。
sigmoid函數(shù)的圖像是這樣的。
看下sigmoid函數(shù)的斜率,我們會發(fā)現(xiàn)它在兩端趨向于零。sigmoid函數(shù)梯度圖像可以印證這一點。
求sigmoid激活層輸出在其權(quán)重上的導(dǎo)數(shù)時,我們可以看到,sigmoid函數(shù)的梯度是表達式中的一個因子,該梯度的取值范圍為0到1.
上式中的第二項就是sigmoid的導(dǎo)數(shù),值域為0到1.
回到我們的例子,讓我們求下神經(jīng)元A的梯度。應(yīng)用鏈式法則,我們得到:
上面的表達式中的每項都可以進一步分解為梯度的乘積,其中一項為sigmoid函數(shù)的梯度。例如:
現(xiàn)在,假設(shè)A之前不止3個神經(jīng)元,而是有50個神經(jīng)元。在實踐中,這完全是可能的,實際應(yīng)用中的網(wǎng)絡(luò)很容易到50層。
那么A的梯度表達式中就包含50項sigmoid梯度的乘積,每項的取值范圍為0到1,這也許會將A的梯度推向零。
讓我們做一個簡單的試驗。隨機取樣50個0到1之間的數(shù),然后將它們相乘。
import random
from functools import reduce
li = [random.uniform(0,1) for x in range(50)
print(reduce(lambda x,y: x*y, li))
你可以自己試驗一下。我試了很多次,從來沒能得到一個數(shù)量級大于10-18的數(shù)。如果這個值是神經(jīng)元A的梯度表達式中的一個因子,那么梯度幾乎就等于零。這意味著,在較深的架構(gòu)中,較深的神經(jīng)元基本不學(xué)習(xí),即使學(xué)習(xí),和較淺的網(wǎng)絡(luò)層中的神經(jīng)元相比,學(xué)習(xí)的速率極低。
這個現(xiàn)象就是梯度消失問題,較深的神經(jīng)元中的梯度變?yōu)榱?,或者說,消失了。這就導(dǎo)致神經(jīng)網(wǎng)絡(luò)中較深的層學(xué)習(xí)極為緩慢,或者,在最糟的情況下,根本不學(xué)習(xí)。
飽和神經(jīng)元
飽和神經(jīng)元會導(dǎo)致梯度消失問題進一步惡化。假設(shè),傳入帶sigmoid激活的神經(jīng)元的激活前數(shù)值ωTx + b非常高或非常低。那么,由于sigmoid在兩端處的梯度幾乎是0,任何梯度更新基本上都無法導(dǎo)致權(quán)重ω和偏置b發(fā)生變化,神經(jīng)元的權(quán)重變動需要很多步才會發(fā)生。也就是說,即使梯度原本不低,由于飽和神經(jīng)元的存在,最終梯度仍會趨向于零。
ReLU救星
在普通深度網(wǎng)絡(luò)設(shè)定下,ReLU激活函數(shù)的引入是緩解梯度消失問題的首個嘗試(LSTM的引入也是為了應(yīng)對這一問題,不過它的應(yīng)用場景是循環(huán)模型)。
當x > 0時,ReLU的梯度為1,x < 0時,ReLU的梯度為0. 這帶來了一些好處。ReLU函數(shù)梯度乘積并不收斂于0,因為ReLU的梯度要么是0,要么是1. 當梯度值為1時,梯度原封不動地反向傳播。當梯度值為0時,從這點往后不會進行反向傳播。
單邊飽和
sigmoid函數(shù)是雙邊飽和的,也就是說,正向和負向都趨向于零。ReLU則提供單邊飽和。
準確地說,ReLU的左半部分不叫飽和,飽和的情況下,函數(shù)值變動極小,而ReLU的左半部分根本不變。但兩者的作用是類似的。你也許會問,單邊飽和帶來了什么好處?
我們可以把深度網(wǎng)絡(luò)中的神經(jīng)元看成開關(guān),這些開關(guān)專門負責(zé)檢測特定特征。這些特征常常被稱為概念。高層網(wǎng)絡(luò)中的神經(jīng)元也許最終會專門檢測眼睛、輪胎之類的高層特征,而低層網(wǎng)絡(luò)中的神經(jīng)元最終專門檢測曲線、邊緣之類的低層特征。
當這樣的概念存在于神經(jīng)網(wǎng)絡(luò)的輸入時,我們想要激活相應(yīng)的神經(jīng)元,而激活的數(shù)量級則可以測量概念的程度。例如,如果神經(jīng)元檢測到了邊緣,它的數(shù)量級也許表示邊緣的銳利程度。
然而,神經(jīng)元的負值在這里就沒什么意義了。用負值編碼不存在的概念的程度感覺怪怪的。
以檢測邊緣的神經(jīng)元為例,相比激活值為5的神經(jīng)元,激活值為10的神經(jīng)元可能檢測到了更銳利的邊緣。但是區(qū)分激活值-5和-10的神經(jīng)元就沒什么意義了,因為負值表示根本不存在邊緣。因此,統(tǒng)一用零表示概念不存在是很方便的。ReLU的單邊飽和正符合這一點。
信息解纏和對噪聲的魯棒性
單邊飽和提高了神經(jīng)元對噪聲的魯棒性。為什么?假設(shè)神經(jīng)元的值是無界的,也就是在兩個方向上都不飽和。具有程度不同的概念的輸入產(chǎn)生神經(jīng)元正值輸出的不同。由于我們想要用數(shù)量級指示信號的強度,這很好。
然而,背景噪聲、神經(jīng)元不擅長檢測的概念(例如,包含弧線的區(qū)域傳入檢測線條的神經(jīng)元),會生成不同的神經(jīng)元負值輸出。這類不同可能給其他神經(jīng)元帶去大量無關(guān)、無用信息。這也可能導(dǎo)致單元間的相關(guān)性。例如,檢測線條的神經(jīng)元也許和檢測弧線的神經(jīng)元負相關(guān)。
而在神經(jīng)元單邊飽和(負向)的場景下,噪聲等造成的不同,也就是之前的負值輸出數(shù)量級的不同,被激活函數(shù)的飽和元素擠壓為零,從而防止噪聲產(chǎn)生無關(guān)信號。
稀疏性
ReLU函數(shù)在算力上也有優(yōu)勢?;赗eLU的網(wǎng)絡(luò)訓(xùn)練起來比較快,因為計算ReLU激活的梯度不怎么需要算力,而sigmoid梯度計算就需要指數(shù)運算。
ReLU歸零激活前的負值,這就隱式地給網(wǎng)絡(luò)引入了稀疏性,同樣節(jié)省了算力。
死亡ReLU問題
ReLU也有缺陷。雖然稀疏性在算力上有優(yōu)勢,但過多的稀疏性實際上會阻礙學(xué)習(xí)。激活前神經(jīng)元通常也包含偏置項,如果偏置項是一個過小的負數(shù),使得ωTx + b < 0,那么ReLU激活在反向傳播中的梯度就是0,使負的激活前神經(jīng)元無法更新。
如果學(xué)習(xí)到的權(quán)重和偏置使整個輸入域上的激活前數(shù)值都是負數(shù),那么神經(jīng)元就無法學(xué)習(xí),引起類似sigmoid的飽和現(xiàn)象。這稱為死亡ReLU問題。
零中心化激活
不管輸入是什么,ReLU只輸出非負激活。這可能是一個劣勢。
對基于ReLU的神經(jīng)網(wǎng)絡(luò)而言,網(wǎng)絡(luò)層ln的權(quán)重ωn的激活為
因此,對損失函數(shù)L而言:
上式中的I是一個指示函數(shù),傳入的ReLU值為正數(shù)時輸出1,否則輸出0. 由于ReLU只輸出非負值,ωn中的每項權(quán)重的梯度更新正負都一樣。
這有什么問題?問題在于,由于所有神經(jīng)元的梯度更新的符號都一樣,網(wǎng)絡(luò)層ln中的所有權(quán)重在一次更新中,要么全部增加,要么全部減少。然而,理想情況的梯度權(quán)重更新也許是某些權(quán)重增加,另一些權(quán)重減少。ReLU下,這做不到。
假設(shè),根據(jù)理想的權(quán)重更新,有些權(quán)重需要減少。然而,如果梯度更新是正值,這些權(quán)重可能在當前迭代中變?yōu)檫^大的正值。下一次迭代,梯度可能會變成較小的負值以補償這些增加的權(quán)重,這也許會導(dǎo)致最終跳過需要少量負值或正值變動才能取到的權(quán)重。
這可能導(dǎo)致搜尋最小值時出現(xiàn)之字模式,拖慢訓(xùn)練速度。
Leaky ReLU和參數(shù)化ReLU
為了克服死亡ReLU問題,人們提出了Leaky ReLU。Leaky ReLU和普通ReLU幾乎完全一樣,除了x < 0時有一個很小的斜率。
在實踐中,這個很小的斜率α通常取0.01.
Leaky ReLU的優(yōu)勢在于反向傳播可以更新產(chǎn)生負的激活前值的權(quán)重,因為Leaky ReLU激活函數(shù)的負值區(qū)間的梯度是αex。YOLO(點擊閱讀)目標檢測算法就用了Leaky ReLU。
因為負的激活前值會生成負值而不是0,Leaky ReLU沒有ReLU中的權(quán)重只在一個方向上更新的問題。
α該取多大,人們做了很多試驗。有一種稱為隨機Leaky ReLU的方法,負值區(qū)間的斜率從均值為0、標準差為1的均勻分布中隨機抽取。
隨機ReLU的論文主張,隨機ReLU能得到比Leaky ReLU更好的結(jié)果,訓(xùn)練起來也更快,并通過經(jīng)驗方法得出,如果限定只使用單一的α值,那么1/5.5要比通常選擇的0.01效果要好。
隨機Leaky ReLU奏效的原因是負值區(qū)間斜率的隨機選擇給負的激活前值梯度帶來了隨機性。在優(yōu)化算法中引入的隨機性,或者說噪聲,有助于擺脫局部極小值和鞍點(在本系列的第一篇文章中,我們深入討論了這一主題)。
后來人們又進一步提出,α可以看作一個參數(shù),在網(wǎng)絡(luò)的訓(xùn)練過程中學(xué)習(xí)。采用這一方法的激活函數(shù)稱為參數(shù)化ReLU。
回顧下飽和
神經(jīng)元飽和看起來是一件很糟的事情,但ReLU中的單邊飽和未必不好。盡管前面提到的一些ReLU變體抑制了死亡ReLU問題,但卻喪失了單邊飽和的益處。
指數(shù)線性單元和偏置偏移
基于上面的討論,看起來一個完美的激活函數(shù)應(yīng)該同時具備以下兩個性質(zhì):
產(chǎn)生零中心化分布,以加速訓(xùn)練過程。
具有單邊飽和,以導(dǎo)向更好的收斂。
Leaky ReLU和PReLU(參數(shù)化ReLU)滿足第一個條件,不滿足第二個條件。而原始的ReLU滿足第二個條件,不滿足第一個條件。
同時滿足兩個條件的一個激活函數(shù)是指數(shù)線性單元(ELU)。
x > 0部分,ELU的梯度是1,x < 0部分的梯度則是α × ex。ELU激活函數(shù)的負值區(qū)域趨向于-α. α是一個超參數(shù),通常取1.
如何選擇激活函數(shù)
首先嘗試ReLU激活。盡管我們上面列出了ReLU的一些問題,但很多人使用ReLU取得了很好的結(jié)果。根據(jù)奧卡姆剃刀原則,先嘗試更簡單的方案比較好。相比ReLU的有力挑戰(zhàn)者,ReLU的算力負擔最輕。如果你的項目需要從頭開始編程,那么ReLU的實現(xiàn)也特別簡單。
如果ReLU的效果不好,我會接著嘗試Leaky ReLU或ELU。我發(fā)現(xiàn)能夠產(chǎn)生零中心化激活的函數(shù)一般要比不能做到這點的函數(shù)效果好得多。ELU看起來很有吸引力,但是由于負的激活前值會觸發(fā)大量指數(shù)運算,基于ELU的網(wǎng)絡(luò)訓(xùn)練和推理都很緩慢。如果算力資源對你而言不成問題,或者網(wǎng)絡(luò)不是特別巨大,選擇ELU,否則,選擇Leaky ReLU。LReLU和ELU都增加了一個需要調(diào)整的超參數(shù)。
如果算力資源很充沛,時間很充裕,你可以將上述激活函數(shù)的表現(xiàn)與PReLU和隨機ReLU做下對比。如果出現(xiàn)了過擬合,那么隨機ReLU可能會有用。參數(shù)化ReLU加入了需要學(xué)習(xí)的一組參數(shù),所以,只在具備大量訓(xùn)練數(shù)據(jù)的情況下才考慮選用參數(shù)化ReLU。
結(jié)語
這篇文章討論了傳入什么樣的數(shù)據(jù)分布,有利于神經(jīng)網(wǎng)絡(luò)層恰當?shù)貙W(xué)習(xí)。激活函數(shù)隱式地歸一化這些分布,而一種稱為批歸一化(Batch Normalization)的技術(shù)明確地進行了這一操作。批歸一化是近年來深度學(xué)習(xí)領(lǐng)域的主要突破之一。不過,我們要到本系列的下一篇文章才會討論這一技術(shù),目前而言,你可以親自嘗試下在自己的網(wǎng)絡(luò)上使用不同的激活函數(shù)有什么效果!試驗愉快!
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4777瀏覽量
100974 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4344瀏覽量
62831 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5511瀏覽量
121356
原文標題:深度學(xué)習(xí)優(yōu)化算法入門:三、梯度消失和激活函數(shù)
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論