經過1.10節的分析,我們知道過大或過小的權重設定可能會帶來梯度**或消失的問題,嚴重影響我們計算神經網路的速度,加大神經網路的訓練難度。那麼應該如何初始化權重呢?如下圖所示:
我們用單個神經元舉例, 這裡同樣不考慮b的情況(b=0),這時z=w1x1+w2x2+...+wnxn,當n很大時,我們希望能夠存在較小的wi,以避免z過大。面對這個問題,我們的直觀想法是希望w的取值能夠與n成反比,我們可以通過限制w的方差來限制w的大小。最簡單的思路就是,我們假設w的方差是1/n,如上圖所示,與n成反比。
基於這種思路,我們可以在初始化時使用圖中命令隨機生成w,np.random.randn(shape)保證我們隨機生成同樣維度的矩陣,且其元素均滿足0-1的均勻分布,而np.sqrt(1/n[l-1])是指1/n[l-1]的開方。我們知道,第l層的z值是由第l層的w和第(l-1)層的x求解而得,所以這裡影響第l層w的方差的n是指上一層的節點數。0-1均勻分布的方差我們知道是1/12,乘上np.sqrt(1/n[l-1]),我們知道w[l]方差變為1/12*(1/n[l-1]),與我們的期望值成正比,且與n[l-1]成反比,達到我們的要求。
方差設為1/n是我們對於這類問題的直覺,但實際證明,當我們採用的啟用函式是relu時,這時將w方差設為2/n[l-1]更加合理,除此之外,我們還可以在方差設定上做一些其他的優化,比如有一些學者提出對於啟用函式tanh我們可以將方差設定為1/n[l-1],還有學者提出將方差設定為2/(n[l-1]+n[l])。
tip:
除了限制初始權重方差,不要忘記對資料做標準化處理,雖然這樣做不會解決問題但確實可以降低梯度**和消失問題,因為這樣做給w設定了合理值,以致梯度沒有**或消失過快,因為我們知道w不能比1大太多,也不能比1小太多。
這些公式給出初始化權重矩陣的方差的預設值,是乙個起點,你也可以新增超引數去改變方差,用你自己的方法去優化這個方差,但這個調參效果一般,雖然能起到一定作用,但相比調優其他超引數的重要性,可以將這個優先順序放得低一些。
合理設定初始化權重矩陣,使其不會增長得太快,也不減小的太快(像梯度**和消失那樣),這也是提高神經網路訓練速度的方法。
深度學習 深度學習權重初始化
本文對cs231中的training neural networks的權重更新部分進行記錄 權重的初始化在深度神經網路中起著比較大的重要,算是乙個trick,但在實際應用上確是個大殺器。1.如果一開始把網路中的權重初始化為0,會發生什麼?因為權重初始為0,由於網路中的神經元的更新機制完全相同,由於網...
解析深度學習神經網路權重初始化
以全連線模型為例 輸入資料為a 784 的陣列,模型共2層神經元,第一層100個,第二層即輸出層為10個神經元,則第一層的權重有 784,100 個,截距有 100 個,第二層有 100,10 個權重,截距 10 個,用w1表示第一層權重矩陣,b1表示截距行向量,w2表示第二層權重矩陣,b2表示截距...
2016 3 25 初始化權重
初始化權重 在網路的初始時刻,如果神經元的權重都是隨便初始化的,那麼啟用的下一層的神經元的均值尾 0,但是方差就是巨大的,這會導致 neural saturation 的情況,所以在初始化的時候就根據神經元的聯入的樹木來進行計算,使得最後基本上 w的求和之後的結果均值為 0,方差為1.所以初始化權重...