1. 程式人生 > >吳恩達深度學習筆記(21)-神經網路的權重初始化為什麼要隨機初始化?

吳恩達深度學習筆記(21)-神經網路的權重初始化為什麼要隨機初始化?

隨機初始化(Random+Initialization)

當你訓練神經網路時,權重隨機初始化是很重要的。

對於邏輯迴歸,把權重初始化為0當然也是可以的。

但是對於一個神經網路,如果你把權重或者引數都初始化為0,那麼梯度下降將不會起作用。

讓我們看看這是為什麼?

有兩個輸入特徵,n([0])=2,2個隱藏層單元n([1])就等於2。 因此與一個隱藏層相關的矩陣,或者說W([1])是2*2的矩陣,假設把它初始化為0的2*2矩陣,b([1])也等於 [0 0]^T,把偏置項b初始化為0是合理的,但是把w初始化為0就有問題了。

那這個問題如果按照這樣初始化的話,你總是會發現a_1^([1]) 和 a_2([1])相等,這個啟用單元和這個啟用單元就會一樣。因為兩個隱含單元計算同樣的函式,當你做反向傳播計算時,這會導致dz_1

([1]) 和 dz_2([1])也會一樣,對稱這些隱含單元會初始化得一樣,這樣輸出的權值也會一模一樣,由此W([2])等於[0 0];

在這裡插入圖片描述
如果你這樣初始化這個神經網路,那麼這兩個隱含單元就會完全一樣,因此他們完全對稱,也就意味著計算同樣的函式,並且肯定的是最終經過每次訓練的迭代,這兩個隱含單元仍然是同一個函式,令人困惑。

dW會是一個這樣的矩陣,每一行有同樣的值因此我們做權重更新

把權重W([1])⟹W([1])-adW每次迭代後的W^([1]),第一行等於第二行。

由此可以推導,如果你把權重都初始化為0,

那麼由於隱含單元開始計算同一個函式,所有的隱含單元就會對輸出單元有同樣的影響。

一次迭代後同樣的表示式結果仍然是相同的,即隱含單元仍是對稱的。

通過推導,兩次、三次、無論多少次迭代,不管你訓練網路多長時間,隱含單元仍然計算的是同樣的函式。

因此這種情況下超過1個隱含單元也沒什麼意義,因為他們計算同樣的東西。當然更大的網路,比如你有3個特徵,還有相當多的隱含單元。

如果你要初始化成0,由於所有的隱含單元都是對稱的,無論你執行梯度下降多久,他們一直計算同樣的函式。這沒有任何幫助,因為你想要兩個不同的隱含單元計算不同的函式,

這個問題的解決方法就是隨機初始化引數。

你應該這麼做:

把W^([1])設為np.random.randn(2,2)(生成高斯分佈),通常再乘上一個小的數,比如0.01,這樣把它初始化為很小的隨機數。

然後b沒有這個對稱的問題(叫做symmetry breaking problem),所以可以把 b 初始化為0,因為只要隨機初始化W你就有不同的隱含單元計算不同的東西,因此不會有symmetry breaking問題了。相似的,對於W([2])你可以隨機初始化,b([2])可以初始化為0。

W^[1] =np.random.randn(2,2) * 0.01 ,
b^([1])=np.zeros((2,1)) 
W^([2])=np.random.randn(2,2) * 0.01 , b^([2])=0

你也許會疑惑,這個常數從哪裡來,為什麼是0.01,而不是100或者1000。

我們通常傾向於初始化為很小的隨機數。因為如果你用tanh或者sigmoid啟用函式,或者說只在輸出層有一個Sigmoid,如果(數值)波動太大,

當你計算啟用值時z([1])=W([1]) x+b^([1]) , a([1])=σ(z([1]))=g^([1]) (z^([1]))

如果W很大,z就會很大。z的一些值a就會很大或者很小,因此這種情況下你很可能停在tanh/sigmoid函式的平坦的地方(見下圖),

在這裡插入圖片描述
這些地方梯度很小也就意味著梯度下降會很慢,因此學習也就很慢。

回顧一下:

如果w很大,那麼你很可能最終停在(甚至在訓練剛剛開始的時候)z很大的值,這會造成tanh/Sigmoid啟用函式飽和在龜速的學習上,

如果你沒有sigmoid/tanh啟用函式在你整個的神經網路裡,就不成問題。

但如果你做二分類並且你的輸出單元是Sigmoid函式,那麼你不會想讓初始引數太大,因此這就是為什麼乘上0.01或者其他一些小數是合理的嘗試。對於w^([2])一樣,就是np.random.randn((1,2)),我猜會是乘以0.01。

事實上有時有比0.01更好的常數,當你訓練一個只有一層隱藏層的網路時(相對淺的神經網路,沒有太多的隱藏層),設為0.01可能也可以。

但當你訓練一個非常非常深的神經網路,你可能會選擇一個不同於的常數而不是0.01。

那麼如何設定常數呢?這個等下一章深度學習網路時再做進一步說明!

點選關注,持續更新中……