神經網路入門篇:詳解隨機初始化(Random+Initialization)

Oten發表於2023-11-28

當訓練神經網路時,權重隨機初始化是很重要的。對於邏輯迴歸,把權重初始化為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]}\)相等,這個啟用單元和這個啟用單元就會一樣。因為兩個隱含單元計算同樣的函式,當做反向傳播計算時,這會導致\(\text{dz}_{1}^{[1]}\)\(\text{dz}_{2}^{[1]}\)也會一樣,對稱這些隱含單元會初始化得一樣,這樣輸出的權值也會一模一樣,由此\(W^{[2]}\)等於\([0\;0]\)

圖1.11.1

但是如果這樣初始化這個神經網路,那麼這兩個隱含單元就會完全一樣,因此他們完全對稱,也就意味著計算同樣的函式,並且肯定的是最終經過每次訓練的迭代,這兩個隱含單元仍然是同一個函式,令人困惑。\(dW\)會是一個這樣的矩陣,每一行有同樣的值因此做權重更新把權重\(W^{[1]}\implies{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]} = \sigma(z^{[1]})=g^{[1]}(z^{[1]})\)如果\(W\)很大,\(z\)就會很大或者很小,因此這種情況下很可能停在tanh/sigmoid函式的平坦的地方(見圖3.8.2),這些地方梯度很小也就意味著梯度下降會很慢,因此學習也就很慢。

回顧一下:如果\(w\)很大,那麼很可能最終停在(甚至在訓練剛剛開始的時候)\(z\)很大的值,這會造成tanh/Sigmoid啟用函式飽和在龜速的學習上,如果沒有sigmoid/tanh啟用函式在整個的神經網路裡,就不成問題。但如果做二分類並且的輸出單元是Sigmoid函式,那麼不會想讓初始引數太大,因此這就是為什麼乘上0.01或者其他一些小數是合理的嘗試。對於\(w^{[2]}\)一樣,就是np.random.randn((1,2)),猜會是乘以0.01。

事實上有時有比0.01更好的常數,當訓練一個只有一層隱藏層的網路時(這是相對淺的神經網路,沒有太多的隱藏層),設為0.01可能也可以。但當訓練一個非常非常深的神經網路,可能要試試0.01以外的常數。無論如何它通常都會是個相對小的數。

好了,看完神經網路入門篇。就已經知道如何建立一個一層的神經網路了,初始化引數,用前向傳播預測,還有計算導數,結合反向傳播用在梯度下降中。

相關文章