深度學習中Xavier初始化

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

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

和方差相關的定理

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

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

文章實驗用的激活函數是tanh激活函數,函數形狀以下左圖,右圖是其導數的函數形狀。orm

激活函數

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

假設輸入數據的均值爲o,方差爲\(\delta_x\),若是第一層是卷基層,卷基層共n個參數,\(n=C*k_h*k_w\),因而有:form

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

其中,忽略偏置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)}\]network

從上式中能夠看出,後面的連乘是很危險的,若是\(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}}}]\]

相關文章
相關標籤/搜索