TensorFlow的batch_normalization
批量標(biāo)準(zhǔn)化(batch normalization簡稱BN)主要是為了克服當(dāng)神經(jīng)網(wǎng)絡(luò)層數(shù)加深而導(dǎo)致難以訓(xùn)練而誕生的。當(dāng)深度神經(jīng)網(wǎng)絡(luò)隨著網(wǎng)絡(luò)深度加深,訓(xùn)練起來會越來越困難,收斂速度會很慢,還會產(chǎn)生梯度消失問題(vanishing gradient problem)。
在統(tǒng)計機(jī)器學(xué)習(xí)領(lǐng)域中有一個ICS(Internal Covariate Shift)理論:源域(source domain)和目標(biāo)域(target domain)的數(shù)據(jù)分布是一致的。也就是訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)滿足相同的分布,這是通過訓(xùn)練數(shù)據(jù)獲得的模型在測試數(shù)據(jù)上有一個好的效果的保證。
Covariate Shift是指訓(xùn)練數(shù)據(jù)的樣本和測試數(shù)據(jù)的樣本分布不一致時,訓(xùn)練獲取的模型無法很好的泛化。它是分布不一致假設(shè)之下的一個分支問題,也就是指源域和目標(biāo)域的條件概率是一致的,但是其邊緣概率不同。對于神經(jīng)網(wǎng)絡(luò)而言,神經(jīng)網(wǎng)絡(luò)的各層輸出,在經(jīng)過了層內(nèi)操作后,各層輸出分布會隨著輸入分布的變化而變化,而且差異會隨著網(wǎng)絡(luò)的深度增加而加大,但是每一層隨指向的樣本標(biāo)記是不會改變的。
解決Covariate Shift問題可以通過對訓(xùn)練樣本和測試樣本的比例對訓(xùn)練樣本做一個矯正,通過批量標(biāo)準(zhǔn)化來標(biāo)準(zhǔn)化某些層或所有層的輸入,從而固定每層輸入信號的均值與方差。
一、批量標(biāo)準(zhǔn)化的實現(xiàn)
批量標(biāo)準(zhǔn)化是在激活函數(shù)之前,對z=wx+b做標(biāo)準(zhǔn)化,使得輸出結(jié)果滿足標(biāo)準(zhǔn)的正態(tài)分布,即均值為0,方差為1。讓每一層的輸入有一個穩(wěn)定的分布便于網(wǎng)絡(luò)的訓(xùn)練。
二、批量標(biāo)準(zhǔn)化的優(yōu)點
1、加大探索的步長,加快模型收斂的速度
2、更容易跳出局部最小值
3、破壞原來的數(shù)據(jù)分布,在一定程度上可以緩解過擬合。
當(dāng)遇到神經(jīng)網(wǎng)絡(luò)收斂速度很慢或梯度爆炸等無法訓(xùn)練的情況時,可以嘗試使用批量標(biāo)準(zhǔn)化來解決問題。
三、TensorFlow的批量標(biāo)準(zhǔn)化實例
1、tf.nn.moments(x,axes,shift=None,name=None,keep_dims=False)
函數(shù)介紹:計算x的均值和方差
參數(shù)介紹:
- x:需要計算均值和方差的tensor
- axes:指定求解x某個維度上的均值和方差,如果x是一維tensor,則axes=[0]
- name:用于計算均值和方差操作的名稱
- keep_dims:是否產(chǎn)生與輸入相同相同維度的結(jié)果
2、tf.nn.batch_normalization(x,mean,variance,offset,scale,variance_epsilon,name=None)
函數(shù)介紹:計算batch normalization
參數(shù)介紹:
- x:輸入的tensor,具有任意的維度
- mean:輸入tensor的均值
- variance:輸入tensor的方差
- offset:偏置tensor,初始化為1
- scale:比例tensor,初始化為0
- variance_epsilon:一個接近于0的數(shù),避免除以0
總結(jié)
以上是生活随笔為你收集整理的TensorFlow的batch_normalization的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sorce insight 4.0 编辑
- 下一篇: 域内双向NAT技术