神经网络入门篇:详解随机初始化(Random+Initialization)
當(dāng)訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),權(quán)重隨機(jī)初始化是很重要的。對(duì)于邏輯回歸,把權(quán)重初始化為0當(dāng)然也是可以的。但是對(duì)于一個(gè)神經(jīng)網(wǎng)絡(luò),如果把權(quán)重或者參數(shù)都初始化為0,那么梯度下降將不會(huì)起作用。
來(lái)看看這是為什么。
有兩個(gè)輸入特征,\(n^{[0]} = 2\),2個(gè)隱藏層單元\(n^{[1]}\)就等于2。
因此與一個(gè)隱藏層相關(guān)的矩陣,或者說(shuō)\(W^{[1]}\)是2*2的矩陣,假設(shè)把它初始化為0的2*2矩陣,\(b^{[1]}\)也等于 \([0\;0]^T\),把偏置項(xiàng)\(b\)初始化為0是合理的,但是把\(w\)初始化為0就有問(wèn)題了。
那這個(gè)問(wèn)題如果按照這樣初始化的話,總是會(huì)發(fā)現(xiàn)\(a_{1}^{[1]}\) 和 \(a_{2}^{[1]}\)相等,這個(gè)激活單元和這個(gè)激活單元就會(huì)一樣。因?yàn)閮蓚€(gè)隱含單元計(jì)算同樣的函數(shù),當(dāng)做反向傳播計(jì)算時(shí),這會(huì)導(dǎo)致\(\text{dz}_{1}^{[1]}\) 和 \(\text{dz}_{2}^{[1]}\)也會(huì)一樣,對(duì)稱(chēng)這些隱含單元會(huì)初始化得一樣,這樣輸出的權(quán)值也會(huì)一模一樣,由此\(W^{[2]}\)等于\([0\;0]\);
圖1.11.1
但是如果這樣初始化這個(gè)神經(jīng)網(wǎng)絡(luò),那么這兩個(gè)隱含單元就會(huì)完全一樣,因此他們完全對(duì)稱(chēng),也就意味著計(jì)算同樣的函數(shù),并且肯定的是最終經(jīng)過(guò)每次訓(xùn)練的迭代,這兩個(gè)隱含單元仍然是同一個(gè)函數(shù),令人困惑。\(dW\)會(huì)是一個(gè)這樣的矩陣,每一行有同樣的值因此做權(quán)重更新把權(quán)重\(W^{[1]}\implies{W^{[1]}-adW}\)每次迭代后的\(W^{[1]}\),第一行等于第二行。
由此可以推導(dǎo),如果把權(quán)重都初始化為0,那么由于隱含單元開(kāi)始計(jì)算同一個(gè)函數(shù),所有的隱含單元就會(huì)對(duì)輸出單元有同樣的影響。一次迭代后同樣的表達(dá)式結(jié)果仍然是相同的,即隱含單元仍是對(duì)稱(chēng)的。通過(guò)推導(dǎo),兩次、三次、無(wú)論多少次迭代,不管訓(xùn)練網(wǎng)絡(luò)多長(zhǎng)時(shí)間,隱含單元仍然計(jì)算的是同樣的函數(shù)。因此這種情況下超過(guò)1個(gè)隱含單元也沒(méi)什么意義,因?yàn)樗麄冇?jì)算同樣的東西。當(dāng)然更大的網(wǎng)絡(luò),比如有3個(gè)特征,還有相當(dāng)多的隱含單元。
如果要初始化成0,由于所有的隱含單元都是對(duì)稱(chēng)的,無(wú)論運(yùn)行梯度下降多久,他們一直計(jì)算同樣的函數(shù)。這沒(méi)有任何幫助,因?yàn)橄胍獌蓚€(gè)不同的隱含單元計(jì)算不同的函數(shù),這個(gè)問(wèn)題的解決方法就是隨機(jī)初始化參數(shù)。應(yīng)該這么做:把\(W^{[1]}\)設(shè)為np.random.randn(2,2)(生成高斯分布),通常再乘上一個(gè)小的數(shù),比如0.01,這樣把它初始化為很小的隨機(jī)數(shù)。然后\(b\)沒(méi)有這個(gè)對(duì)稱(chēng)的問(wèn)題(叫做symmetry breaking problem),所以可以把 \(b\) 初始化為0,因?yàn)橹灰S機(jī)初始化\(W\)就有不同的隱含單元計(jì)算不同的東西,因此不會(huì)有symmetry breaking問(wèn)題了。相似的,對(duì)于\(W^{[2]}\)可以隨機(jī)初始化,\(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\)
也許會(huì)疑惑,這個(gè)常數(shù)從哪里來(lái),為什么是0.01,而不是100或者1000。通常傾向于初始化為很小的隨機(jī)數(shù)。因?yàn)槿绻?strong>tanh或者sigmoid激活函數(shù),或者說(shuō)只在輸出層有一個(gè)Sigmoid,如果(數(shù)值)波動(dòng)太大,當(dāng)計(jì)算激活值時(shí)\(z^{[1]} = W^{[1]}x + b^{[1]}\;,\;a^{[1]} = \sigma(z^{[1]})=g^{[1]}(z^{[1]})\)如果\(W\)很大,\(z\)就會(huì)很大或者很小,因此這種情況下很可能停在tanh/sigmoid函數(shù)的平坦的地方(見(jiàn)圖3.8.2),這些地方梯度很小也就意味著梯度下降會(huì)很慢,因此學(xué)習(xí)也就很慢。
回顧一下:如果\(w\)很大,那么很可能最終停在(甚至在訓(xùn)練剛剛開(kāi)始的時(shí)候)\(z\)很大的值,這會(huì)造成tanh/Sigmoid激活函數(shù)飽和在龜速的學(xué)習(xí)上,如果沒(méi)有sigmoid/tanh激活函數(shù)在整個(gè)的神經(jīng)網(wǎng)絡(luò)里,就不成問(wèn)題。但如果做二分類(lèi)并且的輸出單元是Sigmoid函數(shù),那么不會(huì)想讓初始參數(shù)太大,因此這就是為什么乘上0.01或者其他一些小數(shù)是合理的嘗試。對(duì)于\(w^{[2]}\)一樣,就是np.random.randn((1,2)),猜會(huì)是乘以0.01。
事實(shí)上有時(shí)有比0.01更好的常數(shù),當(dāng)訓(xùn)練一個(gè)只有一層隱藏層的網(wǎng)絡(luò)時(shí)(這是相對(duì)淺的神經(jīng)網(wǎng)絡(luò),沒(méi)有太多的隱藏層),設(shè)為0.01可能也可以。但當(dāng)訓(xùn)練一個(gè)非常非常深的神經(jīng)網(wǎng)絡(luò),可能要試試0.01以外的常數(shù)。無(wú)論如何它通常都會(huì)是個(gè)相對(duì)小的數(shù)。
好了,看完神經(jīng)網(wǎng)絡(luò)入門(mén)篇。就已經(jīng)知道如何建立一個(gè)一層的神經(jīng)網(wǎng)絡(luò)了,初始化參數(shù),用前向傳播預(yù)測(cè),還有計(jì)算導(dǎo)數(shù),結(jié)合反向傳播用在梯度下降中。
總結(jié)
以上是生活随笔為你收集整理的神经网络入门篇:详解随机初始化(Random+Initialization)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦见自己被别人咬了好不好
- 下一篇: Flask 运用Xterm实现交互终端