動手學深度學習 | 批量歸一化 | 26
批量歸一化
現在卷積神經網基本都是要使用到BN層的。BN層的思想不新,但是這個特定的層確實是最近幾年才出來的,而且大家會發現效果很好。而且當大家要把網路做深的時候,這就是一個不可避免的層了。
梯度在上面的層會大,越往下面梯度會越來越小。
這就導致了一個很大的問題,就是上面的層梯度較大,那麼權重更新比較快,也就是收斂的快;但是下面的層因為梯度小,所以引數更新的慢,收斂的慢。但是因為底部的層是抽取比較底層的特徵,所以每次底層的引數一更新,高層的引數又需要重新訓練(底層的資訊一變,那麼上面就白學了)。
批量歸一化:我們能不能在學習底部的時候避免變化頂部層?
我們講數值穩定性的時候,為什麼引數會變?是因為不同層之間的方差和均值的整個分佈會變化。
那麼簡單的辦法是說,假設把分佈給固定住,就不管那一層,輸出也好,梯度也好,假設都符合某個分佈,那麼相對來說就會比較穩定。
BN的想法就是希望讓層和層之間的分佈保持一致。
批量的均值:
批量的方差:
這裡最後加一個很小的值就是為避免其方差為0。
\(x_{i+1}\)也就是下一層的輸出,保持在和\(x_i\)在同一個分佈,其中還有兩個可以學習的引數\(\gamma,\beta\),為什麼要有這兩個引數呢?因為如果均值為0,方差為1的效果不好的話,那麼可以再將這個均值和方差進行調整。
可以看看下面添加了BN層和未新增BN層的效果,前者的震動幅度較大,後者一開始損失什麼的基本就可以認為在“同一分佈”。後者收斂的速度更快,或者換句話說,未新增BN層可能過多幾個epoch(比如20個)也可以達到新增BN層少幾個epoch(比如10個)的效果。
程式碼
首先是簡潔實現
然後再是具體的實現程式碼
QA
- 在將xavier的時候,也講過類似normalization的東西,和BN什麼區別?
本質上沒有區別,是一個思想。就是模型的引數穩定了,收斂就不會慢。
xavier初始化是說在初始的時候,選取和合適的初始化引數能夠使得模型穩定,但是不能保證之後。BN層則是在訓練的時候,在每一層都進行一次“歸一化”。
- BN是不是和權重衰退的作用類似?
權重衰退可以認為是每次更新權重的時候都除了一個小值(就是不要讓權重的變化範圍太大)
但是BN卻不會太多的影響前一層的權重。
- BN能用在MLP中嗎?
可以的,但是如果網路不深的話其實作用不大。
一般都是網路較深的時候才會出現上層更新快,下層更新慢的問題。
也就是BN層一般用於深層網路,淺層的MLP加上BN效果不會見得很棒。
- 為什麼使用了BN收斂時間會變短?
因為BN可以讓梯度正大(就不會到底層的時候變的很小),那麼就可以適當增大學習率,加速收斂。
- 訓練時候如何對epoch,batch_size,lr的數值進行設定?
epoch數總是可以選擇大一點是沒有關係的,就是浪費點資源。
batch_size你要選到合適,不能選擇太大,也不能選擇太小,一般batch_size就調整到一個GPU效率比較高的情況。
lr是在batch_size後面在進行調整的。
- batch_size是把視訊記憶體佔滿好?還是利用率gpu-tuil 100%就可以了?還是需要同時達到100%?
利用率不要到100%,到90%就可以了。
或者這麼講,你去增加batch_size,去看看GPU每秒中能處理的樣本數,如果batch_size到一定程度沒有增加每秒處理樣本數的話,batch_size就可以停止了。