“Xavier”初始化方法是一種很有效的神經網絡初始化方法,方法來源於2010年的一篇論文《Understanding the difficulty of training deep feedforward neural networks》。
文章主要的目標就是使得每一層輸出的方差應該盡量相等。下面進行推導:每一層的權重應該滿足哪種條件才能實現這個目標。
我們將用到以下和方差相關的定理:
假設有隨機變量x和w,它們都服從均值為0,方差為σ的分布,且獨立同分布,那么:
• w*x就會服從均值為0,方差為σ*σ的分布
• w*x+w*x就會服從均值為0,方差為2*σ*σ的分布
文章實驗用的激活函數是tanh激活函數,函數形狀如下左圖,右圖是其導數的函數形狀。
從上圖可以看出,當x處於0附近時,其導數/斜率接近與1,可以近似將其看成一個線性函數,即f(x)=x。
我們假設所有的輸入數據x滿足均值為0,方差為的分布,我們再將參數w以均值為0,方差為的方式進行初始化。我們假設第一層是卷積層,卷積層共有n個參數(n=channel*kernel_h*kernel_w),於是為了計算出一個線性部分的結果,我們有:
其中,忽略偏置b。
假設輸入x和權重w獨立同分布,我們可以得出z服從均值為0,方差為的分布,即
為了更好地表達,我們將層號寫在變量的上標處,
我們將卷積層和全連接層統一考慮成n個參數的一層,於是接着就有:
如果我們是一個k層的網絡(這里主要值卷積層+全連接層的總和數),我們就有
繼續展開,最終可以得到
從上式可以看出,后面的連乘是非常危險的,假如說總是大於1,那么隨着層數越深,數值的方差會越來越大;如果乘積小於1,那么隨着層數越深,數值的方差會越來越小。
我們再回頭看看這個公式,
如果,那么我們就能保證每層輸入與輸出的方差保持一致,那么應該滿足:
即對應任意第i層,要想保證輸入與輸出的方差保持一致,需要滿足:
------------------------------------------------------------------------------------------------
上面介紹的是前向傳播的情況,那么對於反向傳播,道理是一樣的。
假設我們還是一個k層的網絡,現在我們得到了第k層的梯度,那么對於第k-1層輸入的梯度,有
從上式可以看出K-1層一個數值的梯度,相當於上一層的n個參數的乘加。這個n個參數的計算方式和之前方式一樣,只是表示了輸出端的數據維度,在此先不去贅述了。
於是我們假設每一層的參數服從均值為0,方差為某值的分布,那么有如下公式:
對於這個k層網絡,我們又可以推導出一個的公式:
上式中連乘是非常危險的,前面說過,在此不在贅述(這就會造成梯度爆炸與梯度消失的問題,梯度爆炸與梯度消失可以參考這兩篇文章)。我們想要做到數值穩定,使得反向傳播前后的數值服從一個穩定的分布,即
那么需要滿足如下條件:
-----------------------------------------------------------------
如果仔細看一下前向傳播與反向傳播的兩個公式,我們就會發現兩個n實際上不是同一個n。對於全連接來說,前向操作時,n表示了輸入的維度,而后向操作時,n表示了輸出的維度。而輸出的維度也可以等於下一層的輸入維度。所以兩個公式實際上可以寫作:
於是為了均衡考量,最終我們的權重方差應滿足:
下面就是對這個方差的具體使用了。論文提出使用均勻分布進行初始化,我們設定權重要初始化的范圍是[-a,a]。而均勻分布的方差為:
由此可以求得
上面就是xavier初始化方法,即把參數初始化成下面范圍內的均勻分布。
轉載自:
CNN數值——xavier(上):https://zhuanlan.zhihu.com/p/22028079
CNN數值——xavier(下): https://zhuanlan.zhihu.com/p/22044472
深度學習——Xavier初始化方法:https://blog.csdn.net/shuzfan/article/details/51338178