今兒調(diào)模型大佬又給支了一招,叫Batch Normalization(下面簡稱BN),雖然還沒有深刻理解這玩意是什么,但是是真的挺有效的,哈哈。因此本文只是總結(jié)一下BN的具體操作流程以及如何用tensorflow來實(shí)現(xiàn)BN,對于BN更深層次的理解,為什么要BN,BN是否真的有效大家可以參考知乎上的回答:https://www.zhihu.com/question/38102762
1、BN的流程
傳統(tǒng)的神經(jīng)網(wǎng)絡(luò),只是在將樣本x進(jìn)入到輸入層之前對x進(jìn)行0-1標(biāo)準(zhǔn)化處理(減均值,除標(biāo)準(zhǔn)差),以降低樣本間的差異性,如下圖所示:。
BN是在此基礎(chǔ)上,不僅僅只對輸入層的輸入數(shù)據(jù)x進(jìn)行標(biāo)準(zhǔn)化,還對每個隱藏層的輸入進(jìn)行標(biāo)準(zhǔn)化,如下圖所示:
可以看到,由標(biāo)準(zhǔn)化的x得到第二層的輸入h1的時候,經(jīng)歷了如下的步驟:
1、第一層的權(quán)重項(xiàng)w 和 輸入x想成,得到s1
2、對s1進(jìn)行0-1均值方差標(biāo)準(zhǔn)化,得到s2
3、設(shè)置兩個參數(shù)γ 和 β ,計(jì)算γ * s1 + β 得到s3。注意,這里的γ 和 β是網(wǎng)絡(luò)要學(xué)習(xí)的變量。
4、將s3經(jīng)過激活函數(shù)激活之后得到h1
哎,BN的流程原來是這樣的。。早上的時候看的太快,以為就是對每一層的輸入做一個0-1標(biāo)準(zhǔn)化,再加一個γ 和 β呢。唉,得好好反思反思,明天罰自己減一個雞腿。廢話不多說,我們來看看實(shí)現(xiàn)吧。
2、tensorflow實(shí)現(xiàn)BN
tensorflow實(shí)現(xiàn)BN是很簡單的,只需要兩個函數(shù)就可以。
tf.nn.moments
該函數(shù)的樣例如下:
batch_mean, batch_var = tf.nn.moments(data, [0])
可以看到,我們輸入的第一個參數(shù)是我們的data,一定要記住,這個data是w*x之后的。第二個參數(shù)是我們要在哪一維做標(biāo)準(zhǔn)化,如果是二維數(shù)據(jù),通常每一列代表的是一個特征,因此我們一般選擇axis=[0],如果你想對所有的數(shù)據(jù)做一個標(biāo)準(zhǔn)化,那么axis=[0,1]。
tf.nn.batch_normalization
該函數(shù)的樣例如下:
tf.nn.batch_normalization(
data,
mean,
variance,
offset,
scale,
variance_epsilon,
name=None
)
我們需要輸入我們的data,即w*x,然后還有剛剛用moments函數(shù)得到的均值和方差,scala和offset即前文提到的的γ 和 β ,這是兩個Variable。
完整事例
最后來看一個完整事例吧:
batch_mean, batch_var = tf.nn.moments(data, [0])
scale2 = tf.Variable(tf.ones([units]))
beta2 = tf.Variable(tf.zeros([units]))
data = tf.nn.batch_normalization(data, batch_mean, batch_var, beta2, scale2,variance_epsilon=1e-3)