【深度学习理论】(4) 权重初始化,Batch Normalization
各位同學好,最近學習了CS231N斯坦福計算機視覺公開課,講的太精彩了,和大家分享一下。
1. 權重初始化
1.1 相同的初始化權重
神經網絡中的所有權重都能通過梯度下降和反向傳播來優化和更新。現在問題來了,如果每一層的權重全部初始化為同一個常數,不同層的常數可以不一樣,會發生什么呢。
這樣會導致同一層的所有神經元前向傳播和反向傳播完全相同。
如下圖,前向傳播過程中,每一個隱層接收到的輸入是一樣的(x1,x2,...),每個隱層神經元對應每個輸入神經元的權重又是相同的,那么每個隱層神經元的輸出是一樣的。那么它們反向傳播回來的梯度肯定是一樣的。
相當于隱含層只有一個節點有作用,其他隱層神經元的輸入和輸出都和它一樣,即使有五百個神經元,也只能學習到一個神經元的特征,這和只有一個神經元沒有區別。?
因此,多層神經網絡不能將權重初始化為同一個數,否則無法打破對稱性。
1.2 過小的初始化權重
那現在給每個權重隨機初始化,比如使用numpy的隨機標準正態分布(均值=0,方差=1),如下,Din代表上一層的神經元個數,Dout代表本層的神經元個數。乘以0.01進行幅度縮放。
# 生產Din行Dout列的矩陣,每個元素都服從標準正態分布
w = 0.01 * np.random.randn(Din, Dout)
現在使用6層神經網絡,每一層都有4096個神經元,使用雙曲正切tanh激活函數(輸出在-1到1之間),用直方圖表示每一層的輸出分布。如下圖,我們發現,越往后面的層,神經元的輸出就越接近于0,標準差越來越小接近0
每個神經元的輸出結果:,f代表激活函數。
對Wi求偏導數:,xi代表上一層神經元的輸出,由于神經元的輸出越來越接近0,那么偏導數非常接近0,此時會出現梯度消失現象
正是因為較小的權重初始化,使得隨著層數加深,每個神經元的輸出值越來越接近0,所有值都集中在0附近,那么求偏導數之后xi趨于0,梯度會等于0,梯度消失
1.3 過大的權重初始化
?那現在使用較大的權重初始化。乘以0.05進行幅度縮放。會發生什么呢
# 生產Din行Dout列的矩陣,每個元素都服從標準正態分布
w = 0.05 * np.random.randn(Din, Dout)
使用上面相同的網絡結構,現在使用6層神經網絡,每一層都有4096個神經元,使用雙曲正切tanh激活函數(輸出在-1到1之間),用直方圖表示每一層的輸出分布。如下圖,每一層的輸出都集中在飽和區(雙曲正切有-1和1的飽和區)
每個神經元的輸出結果:,f代表雙曲正切激活函數。
對Wi求偏導數:,xi代表上一層神經元的輸出,神經元的輸出越來越接近-1和1;代表雙曲正切函數的導數,由于此時曲線值都處于飽和區,導數非常接近0,此時會出現梯度消失現象
1.4 Xavier 初始化方法
為了避免由于過大或者過小的初始化權重產生的問題,Xaviver 初始化方法根據輸入維度來確定初始化權重,給輸入維度開平方根放在分母上,作為懲罰。如果輸入維度很大,那么分母就很大,權重初始化就比較小,自適應地調整權重的幅度。
在卷積神經網絡中,Din代表感受野的大小,Din=kernel_size^2 * input_channels
如下圖,每一層的輸出既沒有集中在飽和區也沒有集中在0附近,均勻分布在-1到1這個區間中。而且隨著層數加深,每一層的輸入和輸出很相似。
輸入的維度越多,表示輸入更繁雜變化更大,需要給一個更大的懲罰,權重初始化時的幅度就要越小。
1.5 Kaiming 初始化方法
由于 Xavier 初始化假設 w 和 x 關于0對稱,并且 Xavier 初始化方法沒有考慮激活函數。然而Xavier方法在ReLU方法里面就不成立了,因為ReLU激活函數輸出結果都是大于等于0的。如果在ReLU中使用Xavier初始化,神經網絡每層的輸出結果會集中到0附近,出現梯度消失的現象。
何凱明大神在ResNet中就使用了Kaiming初始化方法解決了上述問題。
(1)Kaiming 初始化方法把 Xavier 初始化方法用在了輸出關于0對稱的條件下面
(2)探討了不同的權重。如果想讓輸入和輸出的方差相同,① 若Wij服從正態分布,權重需要滿足以 0 為均值 d/2 為標準差的正太分布;② 若Wij服從均勻分布,權重需要服從??到??之間的均勻分布
如下圖,這樣每層輸出結果,在正值區域內就不會都局限在特別小的區域或飽和區域。
2. Batch Normalization
2.1 訓練階段
現在我們希望神經網絡層的中間結果服從標準正態分布,不希望輸出值全都聚集到0或都集中在飽和區。將中間層的輸出結果強行進行標準正態分布變換,就是Batch Normalization
現在一個batch中有N個數據,每個數據D維(D個特征)。相當于N行D列的矩陣。現在給每一列求均值,求得D個均值。也就是,求出一個batch的N個數據里面,每一個數據某一列的均值,即所有數據在某一列上的均值?。再求出所有數據再某一列上的方差 。最后對batch中的每個數據進行批歸一化。其中是非常小的數,保證分母不為0
有時強行轉成標準正態分布并不好,因此引入了兩個參數,,這兩個參數需要在網絡中學習,優化上面的批歸一化結果。
最終輸出結果為:
訓練階段的 Batch Normalization 的作用就是,把中間層的輸出結果盡可能的拉開,使梯度盡可能的暴露出來。
2.2 測試階段
測試階段是一個一個數據進行測試,batch_size=1,就不存在N個數據。因此在訓練過程中需要把每一批的數據的均值、標準差保存下來,最后求出一個全局的均值和標準差。在測試階段,就用訓練階段得到的全局的均值和標準差來進行 Batch Normalization
用訓練時的總均值、總方差來代替每個batch的均值、方差,其他步驟都和訓練階段相同。
2.3 在卷積神經網絡中的使用
在全連接神經網絡中,一批有N個數據,每個數據是D維,求出D個均值和方差。在網絡中學習?(分別有D個),最后批標準化的結果為:。每個維度單獨地進行歸一化后,再單獨地使用這兩個參數。
在卷積神經網絡中,一批有N個數據,每張圖片用C個卷積核,生成C個特征圖,每個特征圖的長寬分別是 H?*?W?。對每個通道都求出整個batch的均值和標準差,得到C個均值和C個標準差,然后每個通道又單獨地訓練出。每個通道單獨地進行歸一化后,再單獨地使用這兩個參數。
Batch Normalization 的作用
加快收斂;改善梯度(遠離飽和區);使用大學習率就不會出現梯度消失的情況;對初始化不敏感;起到正則化作用。
總結
以上是生活随笔為你收集整理的【深度学习理论】(4) 权重初始化,Batch Normalization的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习】(8) CNN中的通道注意力
- 下一篇: 【神经网络】(18) Efficient