神經網絡中的權值初始化方法

1,概述 網絡

  神經網絡中的權值初始化方法有不少,可是這些方法的設計也是遵循一些邏輯的,而且也有本身的適用場景。首先咱們假定輸入的每一個特徵是服從均值爲0,方差爲1的分佈(通常輸入到神經網絡的數據都是要作歸一化的,就是爲了達到這個條件)。dom

  爲了使網絡中的信息更好的傳遞,每一層的特徵的方差應該儘量相等,若是保證這個特徵的方差是相等的呢。咱們能夠從初始化的權重值入手。函數

  首先來作一個公式推導:spa

  $var(s) = var(\sum_i^n w_i x_i)$設計

  $var(s) = \sum_i^n var(w_i x_i)$3d

  $var(s) = \sum_i^n E(w_i^2) E(x_i^2) - (E(x_i))^2 (E(w_i))^2$orm

  $var(s) = \sum_i^n (E(w_i))^2 var(x_i) + (E(x_i))^2 var(w_i) + var(x_i) var(w_i)$blog

  在這裏假定了x的均值爲0,對於初始化的權重一般均值也是選擇0,所以上面的式子能夠轉換成get

  $var(s) = \sum_i^n var(x_i) var(w_i)$it

  又由於x中每一個特徵咱們都假定方差爲1,所以上面的式子能夠改寫成

  $var(s) = n * var(w)$

  如今要使得$var(s) = 1$,則有

  $n * var(w) = 1$。

  $var(w) = \frac{1}{n}$。

  爲了確保量綱和指望一致,咱們將方差轉換成標準差,所以要確保標準差爲$\frac{1}{\sqrt{n}}$

2,初始化方法

  如今咱們來看看每種方法初始化時咱們該如何設置方差能保證輸入的分佈狀態不變。

  1)均勻分佈

  對於均勻分佈$U (a, b)$,其指望和方差分別爲$E(x) = \frac{(a+b)}{2},  D(x) = \frac{(b-a)^2}{12}$。

  假定均勻分佈爲$(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}})$,在這裏$d$爲神經元的個數,則有指望和方差爲:

  $E(x) = 0,  D(x) = \frac{1}{3d}$

  代入到$var(s) = n * var(w)$中,能夠獲得:

  $var(s) = \frac{1}{3}$,所以爲了保證最終的方差爲1,所以方差須要乘以3,標準差則須要乘以$\sqrt{3}$。所以通常均勻分佈的初始化值能夠選擇$(-\sqrt{\frac{3}{d}},\sqrt{\frac{3}{d}})$。

  在xavier uniform init(glorot uniform),也就是 tf.glorot_uniform_initializer()方法中初始化值爲$(-\sqrt{\frac{6}{(d_{in}+d_{out})}},\sqrt{\frac{6}{d_{in}+d_{out}}})$。在一個二維矩陣中$d_{in}, d_{out}$分別表示矩陣的第一個維度和第二個維度。

  見下面一個例子,對於tf.glorot_uniform_initializer()方法:

    

  能夠看到通過一層神經網絡以後,x的指望和方差基本不變。對於均勻分佈tf.random_uniform_initializer(),當咱們將參數初始化爲$(-\sqrt{\frac{3}{d}},\sqrt{\frac{3}{d}})$。其結果以下:

    

   2)正態分佈

  正態分佈會直接給出指望和標準差,因此這個不用多說。爲了保證$var(s) = 1$,咱們須要讓$var(w) = \frac{1}{d}$,則標準差爲$\sqrt{\frac{1}{d}}$。

  tf.random_normal_initializer(),咱們將其標準差設置爲$\sqrt{\frac{1}{d}}$。結果以下:

    

   xavier normal init(glorot normal),也就是tf.glorot_normal_initializer(),其標準差爲$\sqrt{\frac{2}{(d_{in} + d_{out})}}$,其結果以下:

    

  3)常數初始化

    常數初始化時指望爲常數值n,方差爲0。

    tf.zeros_initializer(),以0初始化會致使輸出x爲0。

      

    tf.ones_initializer(),以1初始化方差會很大

       

     tf.constant_initializer(),同上

      

 

 3,引入激活函數

   上面都是在線性運算的狀況下的結果,但實際應用中都是要引入激活函數的,這樣神經網絡才具備更強的表達能力。若是引入激活函數會怎麼樣?

   爲了觀看效果,咱們將網絡層數設置爲100層,權重初始化採用tf.glorot_normal_initializer()

  不加激活函數時:

    

  能夠看到不加激活函數,方差即便在100層時也基本保持不變。

  引入tanh函數,

    

  結果如上,方差會減少到0.005,所以在深層網絡中引入歸一化層確實是很重要的。

  引入relu函數:

    

  上面的結果很顯然relu函數並不適用tf.glorot_normal_initializer()。對於relu激活函數時,正態分佈的標準差一般爲$\sqrt{\frac{2}{d}}$,均勻分佈一般爲$(-\sqrt{\frac{6}{d}},\sqrt{\frac{6}{d}})$。所以更換下初始化參數,結果以下

    

   上面看結果就好不少了,方差在100層的輸出爲0.1,結果是比tanh要好的,此外這裏的指望再也不接近0,由於relu函數就是不像tanh那樣關於0對稱的。

  另外我還發現一個奇怪的事情,暫時沒法解釋,能夠給你們看下結果:

  當咱們直接用tf.random_normal_initializer()初始化時,此時方差爲1。

  不引入激活函數。

    

   100層後獲得的指望和方差都爲nan,應該是發生爆炸了。

  引入tanh函數:

    

   100層後居然能保持方差爲1。

  relu激活函數:

    

   指望和方差均爲0。

  從上面的結果看好像在用tanh作激活函數時,能夠直接將參數用0,1的正態分佈初始化。

 

 4,初始化的隨機性

  在實踐中還發現一個問題,就是參數的大小也會影響最終的結果,以relu激活函數爲例。爲了方便計算,x和w的維度一致

   全部維度爲512,兩次獲得的結果差別比較大:

    

    

   其實這個也好理解,自己x和w都是隨機初始化的,雖然分佈是同樣的,可是具體的值並不同,最終的結果也不同,因此說即便一樣的分佈初始化,有時候獲得的結果也會有所差別,這個差別多是收斂的速度,也多是最終的結果等等。

 

參考文獻:

神經網絡中的初始化

神經網絡中的權重初始化一覽:從基礎到Kaiming

相關文章
相關標籤/搜索