這幾種常用的權(quán)重初始化方法你都掌握了嗎?
來(lái)源:投稿 作者:175
編輯:學(xué)姐
在深度學(xué)習(xí)中,權(quán)重的初始值非常重要,權(quán)重初始化方法甚至關(guān)系到模型能否收斂。本文主要介紹兩種權(quán)重初始化方法。
為什么需要隨機(jī)初始值
我們知道,神經(jīng)網(wǎng)絡(luò)一般在初始化權(quán)重時(shí)都是采用隨機(jī)值。如果不用隨機(jī)值,全部設(shè)成一樣的值會(huì)發(fā)生什么呢?
極端情況,假設(shè)全部設(shè)成0。顯然,如果某層的權(quán)重全部初始化為0,類似該層的神經(jīng)元全部被丟棄(dropout)了,就不會(huì)有信息傳播到下一層。
如果全部設(shè)成同樣的非零值,那么在反向傳播中,所有的權(quán)重都會(huì)進(jìn)行相同的更新,權(quán)重被更新為相同的值,并擁有了對(duì)稱(重復(fù))的值。不管怎樣進(jìn)行迭代(sgd),都不會(huì)打破這種對(duì)稱性,隱藏層好像只有一個(gè)神經(jīng)元,我們無(wú)法實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的表達(dá)能力。只有我們前面介紹的Dropout
可以打破這種對(duì)稱性。
為了打破權(quán)重的對(duì)稱結(jié)構(gòu),必須隨機(jī)生成初始值。
隱藏層激活值的分布
觀察隱藏層激活值的分布,可以獲得一些啟發(fā)。
這里通過(guò)一個(gè)實(shí)驗(yàn)來(lái)看權(quán)重初始值是如何影響隱藏層的激活值分布的。
向一個(gè)5層神經(jīng)網(wǎng)絡(luò)(激活函數(shù)使用sigmoid函數(shù))傳入隨機(jī)生成的輸入數(shù)據(jù),用直方圖繪制各層激活值的數(shù)據(jù)分布。

這里假設(shè)神經(jīng)網(wǎng)絡(luò)有5層,每層有100個(gè)單元。然后,用高斯分布隨機(jī)生成1000個(gè)數(shù)據(jù)作為輸入數(shù)據(jù),并把它們傳給5層神經(jīng)網(wǎng)絡(luò)。這里權(quán)重的初始化也通過(guò)均值為0方差為1的高斯分布。
各層的激活值呈偏向0和1的分布。這里使用的sigmoid函數(shù)
是S型函數(shù),隨著輸出不斷地靠近0(或者靠近1,在S線的兩端),它的梯度逐漸接近0。因此,偏向于0或1的數(shù)據(jù)分布會(huì)造成反向傳播中梯度的值不斷變小,最后消失。
我們知道,在L2正則化話會(huì)使權(quán)重參數(shù)變小,那么我們這里在初始參數(shù)的時(shí)候,直接設(shè)定一個(gè)較小的值會(huì)不會(huì)好一點(diǎn)。我們只要改下上面代碼的27/28行。

這次雖然沒(méi)有偏向0和1,不會(huì)發(fā)生梯度消失的問(wèn)題。但是激活值的分布有所偏向,這里集中于0.5附近。這樣模型的表現(xiàn)力會(huì)大打折扣。
下面我們來(lái)了解比較常用的Xavier初始值和He初始值,看它們會(huì)對(duì)激活值的分布產(chǎn)生什么影響。
Xavier初始化
Xavier初始化的思想很簡(jiǎn)單,即盡可能保持所有層之間輸入輸出的方差一致。



對(duì)于兩獨(dú)立隨機(jī)變量有:

如果同時(shí)X,Y的均值為零,有:

基于以上條件,那么:

其中,基于假設(shè)1有:

類似地,有:

和:

基于以上,我們有:



如果我們考慮整個(gè)網(wǎng)絡(luò),并用L代表輸出層的話。那么輸出層的方差與輸入層方差的關(guān)系為:

從這可以看出,我們輸出和輸入的方差變化取決于:

上面是正向傳播過(guò)程,下面我們考慮反向傳播過(guò)程。
網(wǎng)上大多數(shù)只有正向傳播的證明,反向傳播稍微復(fù)雜一點(diǎn),但也不是無(wú)法證明的。
為了簡(jiǎn)化表示,我們引入一個(gè)記號(hào):

其中C為損失。
先看第l層:







如果我們考慮整個(gè)網(wǎng)絡(luò),并用L代表輸出層,x代表輸入向量。那么輸出的梯度和輸入的梯度的關(guān)系為:


證明完畢。

因?yàn)榫鶆蚍植嫉姆讲顬?

令方差等于上面的調(diào)和平均數(shù)有:

雖然在上面的推理中,我們假設(shè)激活函數(shù)為恒等函數(shù)(“不存在非線性”)在神經(jīng)網(wǎng)絡(luò)中很容易被違反, 但Xavier初始化方法在實(shí)踐中被證明是有效的。
繼續(xù)上面的實(shí)驗(yàn),我們采用Xavier初始化方法,這里輸入和輸出大小一致,因此取
就可以了:

可以看到,輸出值在5層之后依然保持良好的分布。我們這里使用的激活函數(shù)為sigmoid
,那如果換成ReLU
會(huì)怎樣呢?

前面幾層看起來(lái)還可以,隨著層數(shù)的加深,偏向一點(diǎn)點(diǎn)變大。當(dāng)層加深后,激活值的偏向變大,就容易出現(xiàn)梯度消失的問(wèn)題。
那么怎么辦呢?Kaiming
初始化的提出就是為了解決這個(gè)問(wèn)題。
Kaiming初始化
Kaiming初始化是由何凱明大神提出的,又稱為He
初始化。主要針對(duì)ReLU
激活函數(shù):

基于上面公式(4)(6),有:

再根據(jù)方差的公式:

公式(26)可以轉(zhuǎn)換為:


上式最后幾步基于W的均值為零,所以。
所以,由公式(27)有。
把x,y用原來(lái)的式子表示,并將(29)代入式(28)得:

為了讓和
的方差一致,需要有:

即

類似的,計(jì)算反向傳播(注意要考慮ReLU的導(dǎo)數(shù))可以得到

但是Kaiming初始化沒(méi)有像Xaiver初始化
那樣取兩者的調(diào)和平均數(shù),而是根據(jù)需要任取一個(gè)即可,就像Pytorch的實(shí)現(xiàn)那樣根據(jù)需要取輸入還是輸出大小。
同理如果采用均勻分布的話,那么
,這里n要么是輸入大小,要么是輸出大小。
繼續(xù)上面的實(shí)驗(yàn),采用He初始化方法:

而當(dāng)初始值為He初始值時(shí),各層中分布的廣度相同。由于即便層加深,數(shù)據(jù)的廣度也能保持不變,因此逆向傳播時(shí),也會(huì)傳遞合適的值。
代碼實(shí)現(xiàn)
代碼實(shí)現(xiàn)就很簡(jiǎn)單了,代碼地址:
?? https://github.com/nlp-greyfoss/metagrad
我們通過(guò)調(diào)用實(shí)現(xiàn)的kaiming_normal_
就可以采用Kaiming初始化了。
References
https://www.deeplearning.ai/ai-notes/initialization/
關(guān)于【學(xué)姐帶你玩AI】公眾號(hào)
回復(fù)“機(jī)器學(xué)習(xí)”免費(fèi)獲取機(jī)器學(xué)習(xí)實(shí)戰(zhàn)導(dǎo)學(xué)資料
包含電子書+課件+思維導(dǎo)圖……