關(guān)鍵詞:小隨機(jī)數(shù)初始化、Xavier initialization、Batch Normalization? 批量歸一化

全零初始化:錯(cuò)誤!
在訓(xùn)練完畢后,雖然不知道網(wǎng)絡(luò)中每個(gè)權(quán)重的最終值應(yīng)該是多少,但如果數(shù)據(jù)經(jīng)過(guò)了恰當(dāng)?shù)臍w一化的話,就可以假設(shè)所有權(quán)重?cái)?shù)值中大約一半為正數(shù),一半為負(fù)數(shù)。
如果權(quán)重初始值都為0,那么網(wǎng)絡(luò)中的每個(gè)神經(jīng)元都計(jì)算出同樣的輸出,然后它們就會(huì)在反向傳播中計(jì)算出同樣的梯度,從而進(jìn)行同樣的參數(shù)更新。那么這樣一個(gè)具有很多隱藏單元的網(wǎng)絡(luò)結(jié)構(gòu)就是完全多余的表達(dá),最終該網(wǎng)絡(luò)只能學(xué)到一種特征。這種現(xiàn)象稱為:對(duì)稱權(quán)重(Symmetric ways)
所有權(quán)重相同的問(wèn)題稱為對(duì)稱權(quán)重(Symmetric ways),隨機(jī)初始化解決的就是如何打破這種對(duì)稱性。

小隨機(jī)數(shù)初始化
實(shí)現(xiàn)方法:W = 0.01 * np.random.randn(D,H) 。其中randn函數(shù)是基于零均值和標(biāo)準(zhǔn)差的一個(gè)高斯分布來(lái)生成隨機(jī)數(shù)的。
根據(jù)這個(gè)式子,每個(gè)神經(jīng)元的權(quán)重向量都被初始化為一個(gè)隨機(jī)向量,而這些隨機(jī)向量又服從一個(gè)多變量高斯分布,這樣在輸入空間中,所有的神經(jīng)元的指向是隨機(jī)的。也可以使用均勻分布生成的隨機(jī)數(shù),但是從實(shí)踐結(jié)果來(lái)看,對(duì)于算法的結(jié)果影響極小。
實(shí)驗(yàn):使用tanh非線性神經(jīng)元,然后對(duì)于權(quán)重進(jìn)行小隨機(jī)數(shù)初始化

在第一層,權(quán)重基本符合高斯分布,但是從第三層開(kāi)始權(quán)重的mean和方差都開(kāi)始趨近于0,因?yàn)閠anh也會(huì)發(fā)生權(quán)重彌散現(xiàn)象,將實(shí)數(shù)縮小在(-1,1)的范圍內(nèi),隨著層數(shù)的增加,輸出的數(shù)越來(lái)越小,權(quán)重的方差也越來(lái)越小,那么在反向傳播時(shí),很小的輸出 * 很小的權(quán)重,后面的層基本就不在發(fā)生變化了。
如果使用?W = 1.0 * np.random.randn(D,H) 來(lái)初始化權(quán)重,幾乎所有的神經(jīng)元都將飽和(輸出-1或者1),在反向傳播時(shí),梯度為0,梯度彌散。
更優(yōu)方案:Xavier initialization
使用小隨機(jī)數(shù)初始化存在一個(gè)問(wèn)題,隨著輸入數(shù)據(jù)量的增長(zhǎng),隨機(jī)初始化的神經(jīng)元的輸出數(shù)據(jù)的分布中的方差也在增大。我們可以除以輸入數(shù)據(jù)量的平方根來(lái)調(diào)整其數(shù)值范圍,這樣神經(jīng)元輸出的方差就歸一化到1了。保證了網(wǎng)絡(luò)中所有神經(jīng)元起始時(shí)有近似同樣的輸出分布,實(shí)踐經(jīng)驗(yàn)證明,這樣做可以提高收斂的速度。
w = np.random.randn(fan_in,fan_out) / sqrt(fan_in)。fan_in 輸入數(shù)據(jù)量

優(yōu)化方案:ReLU - Xavier
由上圖可以看出,其實(shí)權(quán)重的方差隨著神經(jīng)網(wǎng)絡(luò)的層數(shù)的增加也在減少,這是在tanh 非線性神經(jīng)元的情況下,如果使用的是ReLU非線性神經(jīng)元的話,由于ReLU自身性質(zhì),一半的輸出會(huì)變成0,那么在反向傳播后,權(quán)重的方差會(huì)減半。所以一般會(huì)加上一個(gè)2倍,來(lái)進(jìn)行權(quán)重初始化
w = np.random.randn(fan_in,fan_out) / sqrt(2.0 / fan_in)

權(quán)重初始化是一個(gè)Data - Driven的過(guò)程,可以先用2-3個(gè)神經(jīng)元進(jìn)行嘗試,查看輸出是否符合高斯分布、權(quán)重的方差是否為0,權(quán)重是否爆炸等等。
Batch Normalization? 批量歸一化

初始化權(quán)重很難處理,我們希望激活層的輸出是符合高斯分布。那我們?cè)谌B接層與激活層之間,加上一個(gè)網(wǎng)絡(luò),對(duì)于每個(gè)維度的數(shù)據(jù)計(jì)算均值和方差,然后把他們批量歸一化為高斯分布的數(shù)據(jù)。
但這種做法有一個(gè)致命的缺點(diǎn),盡管這樣把每層的數(shù)據(jù)分布都固定了,但是這種分布不一定是前面一層的要學(xué)習(xí)到的數(shù)據(jù)分布,這樣強(qiáng)行歸一化就會(huì)破壞掉剛剛學(xué)習(xí)到的特征,BN算法的第二步就解決了這個(gè)缺點(diǎn)。?
BN算法在第二步(如下圖)中設(shè)置了兩個(gè)可學(xué)習(xí)的變量γ和β,然后用這兩個(gè)可學(xué)習(xí)的變量去還原上一層應(yīng)該學(xué)到的數(shù)據(jù)分布,添加這種操作的目的就是還原出上一層需要學(xué)習(xí)的數(shù)據(jù)分布,這樣BN就把原來(lái)不固定的數(shù)據(jù)分布全部轉(zhuǎn)換為固定的數(shù)據(jù)分布,而這種數(shù)據(jù)分布恰恰就是要學(xué)習(xí)到的分布,從而加速了網(wǎng)絡(luò)的訓(xùn)練。


以下轉(zhuǎn)載自:知乎- 魏秀參?
為什么要使用BN?
防止“梯度彌散”(0.9^30 = 0.04)。在BN中,是通過(guò)將activation的輸入規(guī)范為均值和方差一致的手段,使得原本會(huì)減小的activation的scale變大。
什么時(shí)候使用BN呢?
在神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí)遇到收斂速度很慢,或梯度爆炸等無(wú)法訓(xùn)練的狀況時(shí)可以嘗試BN來(lái)解決。另外,在一般使用情況下也可以加入BN來(lái)加快訓(xùn)練速度,提高模型精度。、
以下轉(zhuǎn)自:CSDN-lhanchao
BN算法在訓(xùn)練和測(cè)試時(shí)的應(yīng)用
BN算法在訓(xùn)練時(shí)的操作就如我們上面所說(shuō),首先提取每次迭代時(shí)的每個(gè)mini-batch的平均值和方差進(jìn)行歸一化,再通過(guò)兩個(gè)可學(xué)習(xí)的變量恢復(fù)要學(xué)習(xí)的特征。 但是在實(shí)際應(yīng)用時(shí)就沒(méi)有mini-batch了,那么BN算法怎樣進(jìn)行歸一化呢?
實(shí)際上在測(cè)試的過(guò)程中,BN算法的參數(shù)就已經(jīng)固定好了,首先進(jìn)行歸一化時(shí)
平均值 = 所有mini-batch的平均值的平均值
方差 ????= 每個(gè)batch的方差的無(wú)偏估計(jì)(無(wú)偏估計(jì)介紹見(jiàn)什么是無(wú)偏估計(jì)?——知乎) 、
BN算法在CNN中的應(yīng)用
BN算法在CNN中往往放在每個(gè)卷積層之后,ReLU操作之前。在CNN中操作時(shí),BN算法把每個(gè)特征圖看作一個(gè)神經(jīng)元,計(jì)算該特征圖對(duì)應(yīng)數(shù)據(jù)的均值和方差進(jìn)行歸一化,并且每個(gè)特征圖對(duì)應(yīng)兩個(gè)學(xué)習(xí)變量γ和β。
具體的算法和代碼可點(diǎn)擊鏈接查看CSDN-lhanchao