CNN和RNN中如何引入BatchNorm

CNN和RNN中如何引入BatchNorm


鏈接:http://blog.csdn.net/malefactor/article/details/51549771

Batch Normalization的基本思路和價值在之前一篇文章“Batch Normalization導讀”介紹了,此處不贅述,背景知識請參考上面文章。


看到BN後,很明顯能夠看到這等於往傳統的神經網絡中增加了一個BN層,而且位置處於神經元非線性變換前,基本大多數網絡結構都能很自然地融合進去,於是很自然的想法就是:如果用在CNN或者RNN效果會如何?是否也會增加收斂速度以及模型分類性能?CNN的使用方式在原始的Batch Normalization論文就說了,RNN則有相關後續研究跟進,目前看還沒有特別明確的結論。


|CNNBatchNorm


CNNDNN不一樣,某個卷積層包含多個FilterMap,而每個Filter Map其實是參數共享的,偵測同一類特徵,是通過在輸入圖像上的局部掃描的方式遍歷覆蓋整個輸入圖像的,但是單個Filter Map本身可能是二維甚至多維的,如果是二維的,那麼包含p*q個神經元。那麼此時要應用BN其實有兩種選擇:


一種是把一個FilterMap看成一個整體,可以想象成是一個Filter Map對應DNN隱層中的一個神經元,所以一個Filter Map的所有神經元共享一個ScaleShift參數,Mini-Batchm個實例的統計量均值和方差是在p*q個神經元裏共享,就是說從m*p*q個激活裏面算Filter Map全局的均值和方差,這體現了Filter Map的共享參數特性,當然在實際計算的時候每個神經元還是各算各的BN轉換值,只不過採用的統計量和Scale,shift參數用的都是共享的同一套值而已。


另外一種是FilterMap的每個神經元都看成獨立的,各自保存自己的ScaleShift參數,這樣一個Filter Map就有m*q*2個參數而不是大家共享這兩個參數,同樣地,均值和方差也是各算各的,意即每個神經元在m個實例的激活中計算統計量。


很明顯,第一種方法能夠體現卷積層FilterMap的思想本質,所以在CNN中用BN是採用第一種方式。在推理時,也是類似的改動,因爲推理時均值和方差是在所有訓練實例中算出的統計量,所以所有的神經元用的都一樣,區別主要在於Scale參數和Shift參數同一個Filter Map的神經元一樣共享同樣的參數來計算而已,而DNN中是每個神經元各自算各自的,僅此而已。


圖像處理等廣泛使用CNN的工作中很多都使用了BN了,實踐證明很好用。


|RNNBatchNorm

                                                    1 RNNBN方向


對於RNN來說,希望引入BN的一個很自然的想法是在時間序列方向展開的方向,即水平方向(圖1)在隱層神經元節點引入BN,因爲很明顯RNN在時間序列上展開是個很深的深層網絡,既然BN在深層DNNCNN都有效,很容易猜想這個方向很可能也有效。


另外一個角度看RNN,因爲在垂直方向上可以疊加RNN形成很深的Stacked  RNN,這也是一種深層結構,所以理論上在垂直方向也可以引入BN,也可能會有效。但是一般的直覺是垂直方向深度和水平方向比一般深度不會太深,所以容易覺得水平方向增加BN會比垂直方向效果好。


那麼事實如何呢?這些猜想是否正確呢?


目前在RNN中引入BN的有幾項工作,目前有些矛盾的結論,所以後面還需要更深入的實驗來下確定的結論。我們歸納下目前能下的一些結論。


Batch normalized recurrent neural networks”這個工作是最早嘗試將BN引入RNN的,它構建了5層的RNNLSTM,它的結論是:水平方向的BN對效果有損害作用,垂直方向BN能夠加快參數收斂速度,但是相對基準無BN對照組實驗看可能存在過擬合問題。但是這個過擬合是由於訓練數據規模不夠還是模型造成的並無結論。


Deep speech 2: End-to-end speech recognition in english and mandarin.”這個工作也嘗試將BN引入RNN,也得出了水平方向的BN不可行,垂直方向的BN對加快收斂速度和提升分類效果有幫助,這點和第一個工作結論一致。另外,新的結論是:在訓練數據足夠大的情況下,如果垂直方向網絡深度不深的話,垂直方向的BN效果也會有損害作用,這個其實和工作一的結論基本一致,也說明了這個過擬合不是訓練數據不夠導致的,而是淺層模型加入BN效果不好。但是如果垂直方向深度足夠深,那麼加入BN無論是訓練速度還是分類效果都獲得了提高。


Recurrent Batch Normalization”是最新的工作,164月份的論文。它的實驗結果推翻了上面兩個工作的結論。證明了水平方向BN是能夠加快訓練收斂速度以及同時提升模型泛化能力的。論文作者認爲前面兩個工作之所以BN在水平方向上不行,很可能主要是BNScale參數設置不太合理導致的,他們的結論是:Scale參數要足夠小才能獲得好的實驗效果,如果太大會阻礙信息傳播。


所以總結一下,目前能下的結論是:


  1. RNN垂直方向引入BN的話:如果層數不夠深(這個深度我感覺5層是個分界點,5層的時候效果不穩定,時好時壞,高於5層效果就是正面的了),那麼BN效果不穩定或者是損害效果,深度如果夠多的話,能夠加快訓練收斂速度和泛化性能。



 2.在隱層節點做BN的話:

這麼做肯定是不行的,就是說不能在垂直方向輸入和水平方向輸入激活加完後進行BN,這等於同時對水平和垂直方向做BN,垂直和水平方向必須分別做BN,就是說要這樣:


3.在水平方向做BN時,類似於CNN參數共享的做法是很容易產生的,因爲RNN也是在不同時間點水平展開後參數共享的,所以很容易產生的想法是BN的統計量也在不同時間序列間共享,實驗證明這是不行的,必須每個時間點神經元各自維護自己的統計量和參數。


4.在水平方向做BN時,Scale參數要足夠小,一般設置爲0.1OK

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章