1. 程式人生 > >深度學習中Xavier初始化

深度學習中Xavier初始化

“Xavier”初始化方法是一種很有效的神經網路初始化方法,方法來源於2010年的一篇論文《Understanding the difficulty of training deep feedforward neural networks》。

文章主要的目標就是使得每一層輸出的方差應該儘量相等。下面進行推導:每一層的權重應該滿足哪種條件才能實現這個目標。

和方差相關的定理

假設有隨機變數x和w,它們都服從均值為0,方差為σ的分佈,且獨立同分布,那麼:

  • wx就會服從均值為0,方差為σσ的分佈
  • wx+wx就會服從均值為0,方差為2σσ的分佈

文章實驗用的啟用函式是tanh啟用函式,函式形狀如下左圖,右圖是其導數的函式形狀。

啟用函式

從上圖可以看出,當x處於0附近時,其導數/斜率接近與1,可以近似將其看成一個線性函式,即f(x)=x。

假設輸入資料的均值為o,方差為\(\delta_x\),如果第一層是卷基層,卷基層共n個引數,\(n=C*k_h*k_w\),於是有:

\[z_j= \sum_{i}^{n}{w_i*x_i}\]

其中,忽略偏置b

假設x和w是獨立同分布,則\(Var(z)=n*\delta_x*\delta_w\),為了更好地表達,將層號放在變數上標處:
\[\delta_x^2=n^1*\delta_x^1*\delta_w^1\]

全連線和卷積層都可以看做是n個引數的線性變換,進而有:\(\delta_x^3=n^2*\delta_x^2*\delta_w^2\)

,如果k層的網路,有:
\[\delta_x^k=n^{k-1}*\delta_x^{k-1}*\delta_w^{k-1} =n^{k-1}*n^{k-2}*\delta_x^{k-2}*\delta_w^{k-2}*\delta_w^{k-1} =\delta_x^1*\prod_{i=1}^{k-1}{(n^i*\delta_w^i)}\]

從上式中可以看出,後面的連乘是很危險的,如果\(n^i*\delta_w^i\)總是大於1,最後的方差為越來越大;如果乘機小於1,最後的方差就越來越小。所以我們回頭再看第一個公式:
\[\delta_x^2=n^1*\delta_x^1*\delta_w^1\]


如果滿足\(\delta_x^2=\delta_x^1\),即保證輸出方差和輸出方差一直便可以避免上述問題,得到:
\[\delta_w^1=\frac{1}{n^1}\]

對於任意一層i,應該滿足:
\[\delta_w^i=\frac{1}{n^i}\]
\(n^i\)是w引數的輸入層。

反向傳播的情況

假設第k層的梯度為\(\frac{\partial{Loss}}{\partial{x_j^k}}\),對於第k-1層,有:
\[\frac{\partial{Loss}}{\partial{x_j^{k-1}}} = \sum_{i=1}^{n}{\frac{\partial{Loss}}{\partial{x_i^k}}*w_j^{ki}}\]

這裡的引數n表示的是輸出端的數目。

如果每層的方差服從均值為o,方差為某值的分佈,有:
\[Var(\frac{\partial{Loss}}{\partial{x_j^{k-1}}})= n^k*Var(\frac{\partial{Loss}}{\partial{x_i^k}})*\delta_w^k\]
對於k層的網路,可以推導得到:
\[Var(\frac{\partial{Loss}}{\partial{x_j^{1}}} =Var(\frac{\partial{Loss}}{\partial{x_i^k}})* \prod_{2}^{k}{(n^i*\delta_w^i)} \]
上式的連乘同樣危險,所以我們取\(Var(\frac{\partial{Loss}}{\partial{x_j^{k-1}}}) = Var(\frac{\partial{Loss}}{\partial{x_i^k}})\)
故:
\[\delta_w^k = \frac{1}{n^k}\]
這裡的n表示輸出的維度

為了均衡考慮,我們設定方差應該滿足
\[\delta_w^k=\frac{2}{n^k+n^{k+1}}\]

實際應用

論文提出使用均勻分佈進行初始化,我們設定權重要初始化的範圍是[-a,a]。而均勻分佈的方差為:

\[Var(uniform)=\frac{(a-(-a))^2}{12}=\frac{a^2}{3}=\delta_w^k\]

所以:
\[a=\sqrt{\frac{6}{n^k+n^{k+1}}}\]
這就是xavier初始化方法,即把引數初始化成下面範圍內的均勻分佈:
\[[-\sqrt{\frac{6}{n^k+n^{k+1}}}, \sqrt{\frac{6}{n^k+n^{k+1}}}]\]