- 一種難以訓練的情況 - Feature Scaling 不一致,這使得每個方向的 Gradient 有的很大有的很小
- 橫的是總共有的特徵
$x^1$ to$x^R$ - 縱的是 Instance 的數量,姑且稱作
$n_{1}$ to$n_{n}$ - 從單個 instance -
$n_{i}$ 針對 feature level 做 normalization (平均為 0 ,標準差為 1 ),可以使得 Feature Scaling 一致,消除 Gradient 有的很大有的很小的狀況 - 調整後通常 loss 更快收斂
- 整個 dataset 做 normalization,
$m$ ,$\sigma$ 向量長度為$N$ (資料筆數)
- 每一次經過轉換,這裡是 DNN,其實也可以想成 feature transform,
$z^1$ to$z^R$ 也是一種特徵,輸入接下來的網路,因此也需要做 normalization - activation 之前或之後,其實差不多,都可以試試看,但如果用的是 sigmoid,0附近的 gradient 會比較大
-
和 Input Feature Normalization 不相同的是,
$\mu$ ,$\sigma$ depends on$z$ ,所以$\mu$,$\sigma$ 也會改變,也是 network 參數的一部分 -
然而, Network 沒辦法一次吃全部的資料進行訓練 (GPU) ,必定是吃一個 batch, 一個 batch 的資料
-
所以, Netowrk 一次只會吃進一個 batch 的資料,對 64 筆 data 的 feature dimension 做 normalization
-
因為是 Batch normalization,所以如果你的 batch 是 1,就沒有意義,適用於 batch 較大的時候
-
$\mu$ ,$\sigma$ 都是一個 vector,長度是 batch size-
$\mu$ - 代表每一個 instance 中 feature component 的平均值 -
$\sigma$ - 代表每一個 instance 中 feature component 的標準差
-
-
64 個 examples 怎麼做 - 因為 GPU 的限制,所以沒有辦法做整個 dataset 的 feature normalization,只能以 batch 做抽樣作為近似
- feature 經過 normalize , 設計上也怕實際資料分布並非 mean = 0, std = 1,所以設定
$\gamma$ ,$\beta$ ,做線性組合,初始值會是 1 vector & 0 vector
- Production 沒辦法累積到一個 batch 才做計算 (如果是 realtime service)
- 每一次 batch 都會得到一個
$\mu$ ,$\sigma$ ,訓練完成後會把$\mu_{t}$ ,$\sigma_{t}$ 存起來,基本上是 moving average,視為訓練資料的整理分佈,給 inference 的時候使用
- 收斂更快,同樣的 Accuracy
-
原論文 - 2015 - 觀點被打臉
-
新論文 - How Does Batch Normalization Help Optimization?
- Error Surface 變得更平緩 - 有理論的支持以及實驗的支持
-
讓 Error Surface 變得更平緩,也可以有其他方法,論文又提到,可以再去看
NLP中 batch normalization与 layer normalization
BN : $\mu_{N1}$, $\sigma_{N1}$
- 發展背景 (MLP, CV), 2015
- batch size 夠大 (64, 128),且資料集有做 shuufle,效果比較顯著,反之 batch size 小,就沒什麼用
- BN 有效的一個原因,特徵值域會被拉成靠近 0 , 許多 activation 的 func 在 0 附近的 gradient 都比較大(例如 sigmoid, tanh),且原始資料 (未做過) BN,當數值過大,進入 activation func 的飽和域,會產生梯度消失
- seqeutial data 表現得不好,探究原因是,輸入一個 cube,BN 物理意義 是在每一個 Sequence 中的不同 instance 中做 normalization,硬是把 Sequence 中的 Token 切成不同的群體了
LN : $\mu_{C1}$, $\sigma_{C1}$
- 發展背景(NLP), 2016
- 拿 BN 做 NLP,發現效果奇爛,改成 LN,在一個句子中做 Normalization
- 後續 NLP NN 並沒有調整這個架構,持續用到 Attention Model (Transformer)
- NLP 的 inputs 會對不同 instance (句子) 做 padding,因此會有一些句子的 token padding 成 zero vector,估計也是 BN 玩壞掉的原因
- Lee
- Feature Scaling 不同得feature,會需要不同的learning rate,變得較不好訓練
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- 2015
- 18008 citations
Hidden Layer?
-
$a^{1}$ 其實是layer2的feature,我們可以想像網路前面幾層是feature extractor,同理,每一層的input都可以是下一層的feature - 這種做法對NN很有幫助,解決了一個稱作Internal Covariate Shift的問題(原論文聲稱)
- 如果對於每一個layer,input feature都是mean是0 variance是1,那麼training就會更容易一點
- 當網路越深層,ICS越大
- 而因為layer的weight一直改變,導致我們無法很輕易地得知每一次中間輸出的參數的mean跟variance,因此解決這個問題的技術就是Batch mormalization
- 一批有3筆資料for example
可以apply在activation func的input也可以apply在activation func的output,現存比較多的是apply在activation func的input
- 其實我們不喜歡input值落在activation func的平緩處,因為這樣會有梯度消失的問題,因此先做normalization就比較容易在把值控制在附近,那些地方的微分值會比較大
- 換句話說,對於容易梯度爆炸以及梯度消失的值,透過Batch Normalization,可以收縮到較好的微分值之處,這使得訓練變得更容易,也讓網路可以訓練更多層
- 其實我們希望的是該batch可以代表整個training set的statitsic,所以當你batch size太小時,就別用了!
- 注意
sigma是elementwise的?
- 這樣怎麼train?
- 事實上$\mu$和$\sigma$也是變數,不能被視為const,BP需要通過他們,從$z$到$z'$中間也必須視為一個網路
- 當你改動了$W_1$等同於改動了$z_1$等同於改動了$\mu$,
$\sigma$
- 如果你使用的activation func gradient最大不是在0,或是mean和vatiance不是0跟1,在其他的地方會表現得更好,那麼你可以改動他,做一個線性轉換
- 意思就是說,你的activation function如果比較特別,才做這個轉換(即$\gamma, \beta$)Linear transform
- 這裡需要注意的是$\gamma, \beta$是可以手動設計的,$\mu, \sigma$是根據data去learning出來的
- 事實上我們需要的是training set的stats,如果遇到整個training set太大,或是你的training是online的,那就很困擾
- 通常預測一直也只預測一筆data....
- 可以取最靠近training結束時的mean和variance來代表整個training set的參數
- 為什為什麼不取$\mu_1
to\mu_300$的的平均? - 因為$\mu$不斷的在變化,到了最後Accuracy效果最好,這時候是對z做估算最好的值 - 或者是我還是全部都取,但是越接近training結束時的weights越大
- 讓訓練變簡單 - which means 可以設大一點的learning rate
- 更少產生梯度爆炸和梯度消失
- 原本如果使用sigmoid func,那麼很容易產生前面兩個結果,不過用了BN,如果你的activation func是sigmoid或是tanh,那麼就會特別有幫助(對那種有平坦區的activation function特別有效)
- 對參數的initialization影響更小($w$乘上了$k$倍,normalization之後就是沒差的)
- BN也可以視為一種regularization,因為遇到outlier會更robust
- BN主要是在training效果不好的時候作用較大,如果單純是testing的時候效果不好,有別的方法不見得要用BN
- 這張圖是要說啥呢,是要說有BN可以把learning rate條大一點,藍色虛線就是調了5倍的learning rate,但是藍色實線 learning rate 30倍沒有比較好XD
- 如果是BN + sigmoid 會得到粉紅色線
- 藍色則是使用relu activation function
- Batch normalization在testing時使用training的stats,但是如果測試時目標離training時較不同(transfer task),表現較差
- 如果特定的training process,無法用較大的batch數,那麼也會很差(例如object detection),Group Normalization有解決方法
- Resource
- 照理來說,BN的$\mu, \sigma$是用於估計training dataset的,transfer learning會apply在不同的dataset上,因此$\mu, \sigma$也需要適應到新的資料集上,合理的做法是fine-tune時$\mu, \sigma$可以繼續更新,並使用moving average的方式update,這個功能在tensorflow 1.x之中並沒有實作,在tensorflow 2裡面才有實作,因此除了Alexnet, VGG之外,其他有BN層的network要fine tune要記得在tensorflow 2裡面操作




















