日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

神经网络入门篇:详解随机初始化(Random+Initialization)

發布時間:2023/11/29 windows 29 coder
生活随笔 收集整理的這篇文章主要介紹了 神经网络入门篇:详解随机初始化(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。