神经网络入门篇:详解随机初始化(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]}\)相等,這個激活單元和這個激活單元就會一樣。因為兩個隱含單元計算同樣的函數,當做反向傳播計算時,這會導致\(\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以外的常數。無論如何它通常都會是個相對小的數。
好了,看完神經網絡入門篇。就已經知道如何建立一個一層的神經網絡了,初始化參數,用前向傳播預測,還有計算導數,結合反向傳播用在梯度下降中。
總結
以上是生活随笔為你收集整理的神经网络入门篇:详解随机初始化(Random+Initialization)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦见自己被别人咬了好不好
- 下一篇: Flask 运用Xterm实现交互终端