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