神經網絡權重初始化問題


之前看Andrew大神的視頻有介紹到神經網絡權重需要隨機初始化而不是全初始化為0的問題,其真正深層次的含義沒有弄明白,所以結合一些資料(cs231n課程)希望能讓自己之后再想到這個問題的時候能夠快速地明白過來。

另外這篇文章其實是一篇譯文,所以翻譯不是很確定的地方也將原文中的英文語句復制在句后,如果有更合適的翻譯也請留言告知一下,謝謝!

參考文獻: CS231n Convolutional Neural Networks for Visual Recognition

權重初始化

我們已經知道了如何構建神經網絡結構,也知道了怎么預處理數據。在我們真正開始訓練網絡之前,我們必須要知道如何去初始化神經網絡的參數。

陷阱: 都初始化為0

首先介紹一下我們不應該做的事情(即初始化為0)。需要注意的是我們並不知道在訓練神經網絡中每一個權重最后的值,但是如果進行了恰當的數據歸一化后,我們可以有理由認為有一半的權重是正的,另一半是負的。令所有權重都初始化為0這個一個聽起來還蠻合理的想法也許是一個我們假設中最好的一個假設了。但結果正確是一個錯誤(的想法),因為如果神經網絡計算出來的輸出值都一個樣,那么反向傳播算法計算出來的梯度值一樣,並且參數更新值也一樣(\(w=w-α*dw\))。更一般地說,如果權重初始化為同一個值,網絡就不可能不對稱(即是對稱的)。

為什么不能是對稱的?

答案參考【知乎:為什么神經網絡在考慮梯度下降的時候,網絡參數的初始值不能設定為全0,而是要采用隨機初始化思想?】

設想你在爬山,但身處直線形的山谷中,兩邊是對稱的山峰。
由於對稱性,你所在之處的梯度只能沿着山谷的方向,不會指向山峰;你走了一步之后,情況依然不變。
結果就是你只能收斂到山谷中的一個極大值,而走不到山峰上去。

初始化為小的隨機數

既然不能都初始化為0,那么很自然的我們會想到將權重初始化為非常接近0的小數(正如我們上面所討論的不能等於0)。將權重初始化為很小的數字是一個普遍的打破網絡對稱性的解決辦法。這個想法是,神經元在一開始都是隨機的、獨一無二的,所以它們會計算出不同的更新,並將自己整合到整個網絡的各個部分。一個權重矩陣的實現可能看起來像\(W=0.01 * np.random.randn(D,H)\),其中randn是從均值為0的單位標准高斯分布進行取樣。通過這個公式(函數),每個神經元的權重向量初始化為一個從多維高斯分布取樣的隨機向量,所以神經元在輸入空間中指向隨機的方向(so the neurons point in random direction in the input space.應該是指輸入空間對於隨機方向有影響)。其實也可以從均勻分布中來隨機選取小數,但是在實際操作中看起來似乎對最后的表現並沒有太大的影響。

警告:並不是數字越小就會表現的越好。比如,如果一個神經網絡層的權重非常小,那么在反向傳播算法就會計算出很小的梯度(因為梯度gradient是與權重成正比的)。在網絡不斷的反向傳播過程中將極大地減少“梯度信號”,並可能成為深層網絡的一個需要注意的問題。

用1/sqrt(n)校准方差

上述建議的一個問題是,隨機初始化神經元的輸出的分布有一個隨輸入量增加而變化的方差。結果證明,我們可以通過將其權重向量按其輸入的平方根(即輸入的數量)進行縮放,從而將每個神經元的輸出的方差標准化到1。也就是說推薦的啟發式方法(heuristic)是將每個神經元的權重向量按下面的方法進行初始化:\(w=np.random.randn(n)/sqrt(n)\),其中\(n\)表示輸入的數量。這保證了網絡中所有的神經元最初的輸出分布大致相同,並在經驗上提高了收斂速度。

\(w=np.random.randn(n)/sqrt(n)\)推導過程大致如下:
令權重\(w\)和輸入\(x\)的內積表達式為:\(s=\sum_{i}^{n}w_ix_i\),這就使得神經元在非線性之前得到了原始的激活。
計算\(s\)的方差:

\[\begin{align} Var(s) &= Var(\sum_{i}^{n}w_ix_i) \\ &= \sum_{i}^{n}Var(w_ix_i) \\ &= \sum_{i}^{n}{[E(w_i)]^2}Var(x_i) + E{[x_i]}^2Var(w_i) + Var(x_i)Var(w_i) \\ &= \sum_{i}^{n}Var(x_i)Var(w_i) \\ &= (nVar(w))Var(x) \end{align} \]

在最開始的兩步我們使用了方差的性質
在第三步我們我們假設輸入值和權重均值為0,所以\(E[x_i]=E[w_i]=0\)。注意到這不是一般的情況:比如ReLU的單元會有一個正的均值。
在最后一步我們假設所有的\(w_i,x_i\)都是同分布的(即\(w_1,w_2...\)是同分布,\(x_1,x_2,...\)是同分布,但是\(w\)\(x\)不是同分布)。
從這個推導中我們可以看到如果我們想讓\(s\)和所有的輸入都有相同的方差,那么需要保證在初始化的時候每個權重\(w\)的方差是\(\frac{1}{n}\)。並且因為\(Var(aX)=a^2Var(X)\)\(a\)是一個標量,\(X\)是一個隨機變量),這就意味着我們可以從單位高斯分布中取樣,然后通過\(a=\sqrt{\frac{1}{n}}\)進行縮放來使得權重的方差為\(\frac{1}{n}\)。也就是得到了最開始所介紹的初始化方法:\(w = np.random.randn(n) / sqrt(n)\)

Glorot等人所寫的文章Understanding the difficulty of training deep feedforward neural networks中有類似的分析。在這篇論文中,作者的結論是建議初始化的形式是\(Var(w)=\frac{2}{(n_{in}+n_{out})}\),其中\(n_in,n_out\)分別是上一層和下一層神經元的數量。這是基於一個折中的選擇和對反向傳播梯度等價分析后具有積極作用的辦法。(This is motivated by based on a compromise and an equivalent analysis of the backpropagated gradients)。關於這個話題的最新論文,由He等人所寫的Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification推導了ReLU神經元的權重初始化問題,得出的結論是神經元的方差需要是\(\frac{2.0}{n}\),即\(w = np.random.randn(n) / sqrt(2.0/n)\),這是目前在神經網絡中使用相關神經網絡的建議。

稀疏初始化(Sparse Initialazation)

另一種解決未校准方差問題的方法是把所有的權重矩陣都設為零,但是為了打破對稱性,每個神經元都是隨機連接地(從如上面所介紹的一個小的高斯分布中抽取權重)到它下面的一個固定數量的神經元。一個典型的神經元連接的數目可能是小到10個。

初始化偏差

將偏差初始化為零是可能的,也是很常見的,因為非對稱性破壞是由權重的小隨機數導致的。因為ReLU具有非線性特點,所以有些人喜歡使用將所有的偏差設定為小的常數值如0.01,因為這樣可以確保所有的ReLU單元在最開始就激活觸發(fire)並因此能夠獲得和傳播一些梯度值。然而,這是否能夠提供持續的改善還不太清楚(實際上一些結果表明這樣做反而使得性能更加糟糕),所以更通常的做法是簡單地將偏差初始化為0.

實際操作

通常的建議是使用ReLU單元以及 He等人 推薦的公式\(w = np.random.randn(n) * sqrt(2.0/n)\)

批量標准化

loffe和Ioffe最近開發的一項技術,稱為“Batch Normalization”,在訓練開始的時候,通過顯式地迫使網絡上的激活函數讓整個網絡上采用高斯分布來初始化神經網絡,從而緩解了許多頭痛的問題。(A recently developed technique by Ioffe and Szegedy called Batch Normalization alleviates a lot of headaches with properly initializing neural networks by explicitly forcing the activations throughout a network to take on a unit gaussian distribution at the beginning of the training.)。通過核心觀察證明這是可能的,因為標准化是一個簡單的可微分的操作(The core observation is that this is possible because normalization is a simple differentiable operation.)。在實際操作中,運用這項技術相當於在全連接層(或者卷積層,我們很快將會看到)后面嵌入BatchNorm層,並嵌在非線性(層)前。這里我們不會展開來講解這項技術,因為它已經在上面那提供鏈接的論文中詳細的介紹了,但是請注意,在神經網絡中使用批量標准化已經成為一種非常常見的做法。在實踐中,使用批量標准化的網絡對糟糕的初始化更加健壯。還要需要提到的是,批量標准化可以解釋為在網絡的每一層進行預處理,但它以可微分的方式整合到網絡中。完美!




微信公眾號:AutoML機器學習
MARSGGBO原創
如有意合作或學術討論歡迎私戳聯系~
郵箱:marsggbo@foxmail.com

2017-9-1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM