人工智能-深度學習筆記7 神經網絡的初始化參數

先來複習下上篇筆記的激活函數,其作用,可以理解爲每個網絡之間的處理器,但它歸屬於上一個網絡,從上一個網絡出來,做一下處理,然後再將輸出的數據傳到下一個網絡或者輸出。

作用:提供非線性能力,增加運算簡單度,增強魯棒性(也就是神經網絡系統穩定性)。

性質:處處可微分,定義域爲負無窮到正無窮, 值域在(-1,1)之間比如(0,1)(-1,1)。

函數:sigmoid函數,tanh函數,Relu函數,Leaky Relu函數。

在激活函數的作用下神經網絡進行着梯度下降,前向和後向計算,在後向計算中無可厚非的就是梯度下降問題,如何找到極小值。首要做的就是權重的初始化,有幾點是需要注意的:

1.不能初始化爲0,因爲初始化了就無法學習了,同一層神經元都一樣,沒有區別,存在對稱性。

2.隨機生成正態分佈的靠近中間的數據,比如截斷正態分佈,但數據不要太大或者太小,太大了容易造成梯度飽和(想象激活函數圖像的兩端,基本是平緩的),梯度消失來了。

神經網絡的權重初始化爲什麼要隨機?

大家先看下圖示的計算:

圖示有兩個輸入特徵,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。

但這個常數從哪裏來,爲什麼是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激活函數飽和在龜速的學習上。

事實上有時有比0.01更好的常數,當訓練一個只有一兩層隱藏層的淺層神經網絡時,設爲0.01可能也是可以的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章