[DeepLearning]Batch normalization筆記
Batch normalizaion是normalization的一種。BN并不是在數(shù)據(jù)的預(yù)處理階段,而是運用在模型的層與層之間。BN是以batch的粒度進行的,它的作用是用來加快模型的計算速度,能夠在訓(xùn)練以及推理階段用一個相對較高的學(xué)習(xí)率來進行收斂。
在實際的運用中,我們通常將batch normalization層加在激活函數(shù)之前。
整個順序為
Linear transformation; z = g(w, x) + b
Batch normalization; z_n = gamma * (z - mean) / std + beta
Activation function; a = f(z_n)
其中mean為輸入的平均值(以batch作為粒度);std為輸入的標(biāo)準(zhǔn)差;gamma和beta為可學(xué)習(xí)參數(shù),它們的作用時在訓(xùn)練階段修改輸入的分布。
由于在測試/推理階段,輸入的數(shù)據(jù)只有一條,我們不能像在訓(xùn)練階段一樣通過mini-batch獲得對應(yīng)的mean和std。因此在測試/推理階段,我們使用exponentially weighted average來預(yù)估測試/推理階段的mean和std。即使用訓(xùn)練階段各個batch的mean和std來作為測試/推理階段的mean和std。
Exponentially weighted average, 也叫exponential moving average(EMA),是用來將最近的數(shù)據(jù)和以前的數(shù)據(jù)通過加權(quán)的方式來求取新的平均值。在BN的中,每訓(xùn)練一個batch,我們將當(dāng)前batch的mean和std和之前計算的mean和std做加權(quán)平均,通過這樣的方式我們來更新mean和std。因此我們在每訓(xùn)練一個新的batch,我們都會更新mean和std(也叫running mean和running std)。EMA的公式為:
EMA(t) = alpha * data(t) + (1 - alpha) * EMA(t-1)
其中t為時間;alpha是一個取值在0-1之間的一個數(shù),通過修改alpha可以改變新增的數(shù)據(jù)在平均值中的權(quán)重。在BN中alpha通常取0.9。
因此使用在測試/推理階段running_mean和running_std的計算為:
self.running_mean = 0.9 * self.running_mean + 0.1 * current_mean
self.running_std = 0.9 * self.running_std + 0.1 * current_std
在訓(xùn)練階段我們就能得到running mean和running std,然后我們使用這個running mean和running std作為測試/推理階段的mean和std。