【AI初识境】深度学习模型中的Normalization,你懂了多少?
文章首發于微信公眾號《有三AI》
【AI初識境】深度學習模型中的Normalization,你懂了多少?
這是《AI初識境》第6篇,這次我們說說Normalization。所謂初識,就是對相關技術有基本了解,掌握了基本的使用方法。
數據經過歸一化和標準化后可以加快梯度下降的求解速度,這就是Batch?Normalization等技術非常流行的原因,它使得可以使用更大的學習率更穩定地進行梯度傳播,甚至增加網絡的泛化能力。
今天就來說說和Batch?Normalization相關的概念。
作者&編輯??|?言有三
?
1?什么是歸一化/標準化
Normalization是一個統計學中的概念,我們可以叫它歸一化或者規范化,它并不是一個完全定義好的數學操作(如加減乘除)。它通過將數據進行偏移和尺度縮放調整,在數據預處理時是非常常見的操作,在網絡的中間層如今也很頻繁的被使用。
1.?線性歸一化
最簡單來說,歸一化是指將數據約束到固定的分布范圍,比如8位圖像的0~255像素值,比如0~1。
在數字圖像處理領域有一個很常見的線性對比度拉伸操作:
X=(x-xmin)/(xmax-mxin)
它常常可以實現下面的增強對比度的效果。
不過以上的歸一化方法有個非常致命的缺陷,當X最大值或者最小值為孤立的極值點,會影響性能。
2.?零均值歸一化/Z-score標準化
零均值歸一化也是一個常見的歸一化方法,被稱為標準化方法,即每一變量值與其平均值之差除以該變量的標準差。
經過處理后的數據符合均值為0,標準差為1的分布,如果原始的分布是正態分布,那么z-score標準化就將原始的正態分布轉換為標準正態分布,機器學習中的很多問題都是基于正態分布的假設,這是更加常用的歸一化方法。
以上兩種方法都是線性變換,對輸入向量X按比例壓縮再進行平移,操作之后原始有量綱的變量變成無量綱的變量。不過它們不會改變分布本身的形狀,下面以一個指數分布為例:
如果要改變分布本身的形狀,下面也介紹兩種。
3.正態分布Box-Cox變換
box-cox變換可以將一個非正態分布轉換為正態分布,使得分布具有對稱性,變換公式如下:
在這里lamda是一個基于數據求取的待定變換參數,Box-Cox的效果如下。
4.?直方圖均衡化
直方圖均衡也可以將某一個分布歸一化到另一個分布,它通過圖像的灰度值分布,即圖像直方圖來對圖像進行對比度進調整,可以增強局部的對比度。
它的變換步驟如下:
(1)計算概率密度和累積概率密度。
(2)創建累積概率到灰度分布范圍的單調線性映射T。
(3)根據T進行原始灰度值到新灰度值的映射。
直方圖均衡化將任意的灰度范圍映射到全局灰度范圍之間,對于8位的圖像就是(0,255),它相對于直接線性拉伸,讓分布更加均勻,對于增強相近灰度的對比度很有效,如下圖。
綜上,歸一化數據的目標,是為了讓數據的分布變得更加符合期望,增強數據的表達能力。
在深度學習中,因為網絡的層數非常多,如果數據分布在某一層開始有明顯的偏移,隨著網絡的加深這一問題會加劇(這在BN的文章中被稱之為internal?covariate?shift),進而導致模型優化的難度增加,甚至不能優化。所以,歸一化就是要減緩這個問題。
?
2?Batch?Normalization
1、基本原理
現在一般采用批梯度下降方法對深度學習進行優化,這種方法把數據分為若干組,按組來更新參數,一組中的數據共同決定了本次梯度的方向,下降時減少了隨機性。另一方面因為批的樣本數與整個數據集相比小了很多,計算量也下降了很多。
Batch?Normalization(簡稱BN)中的batch就是批量數據,即每一次優化時的樣本數目,通常BN網絡層用在卷積層后,用于重新調整數據分布。假設神經網絡某層一個batch的輸入為X=[x1,x2,...,xn],其中xi代表一個樣本,n為batch?size。
首先,我們需要求得mini-batch里元素的均值:
接下來,求取mini-batch的方差:
這樣我們就可以對每個元素進行歸一化。
最后進行尺度縮放和偏移操作,這樣可以變換回原始的分布,實現恒等變換,這樣的目的是為了補償網絡的非線性表達能力,因為經過標準化之后,偏移量丟失。具體的表達如下,yi就是網絡的最終輸出。
假如gamma等于方差,beta等于均值,就實現了恒等變換。
從某種意義上來說,gamma和beta代表的其實是輸入數據分布的方差和偏移。對于沒有BN的網絡,這兩個值與前一層網絡帶來的非線性性質有關,而經過變換后,就跟前面一層無關,變成了當前層的一個學習參數,這更加有利于優化并且不會降低網絡的能力。
對于CNN,BN的操作是在各個特征維度之間單獨進行,也就是說各個通道是分別進行Batch?Normalization操作的。
如果輸出的blob大小為(N,C,H,W),那么在每一層normalization就是基于N*H*W個數值進行求平均以及方差的操作,記住這里我們后面會進行比較。
2.BN帶來的好處。
(1)?減輕了對參數初始化的依賴,這是利于調參的朋友們的。
(2)?訓練更快,可以使用更高的學習率。
(3)?BN一定程度上增加了泛化能力,dropout等技術可以去掉。
3.BN的缺陷
從上面可以看出,batch?normalization依賴于batch的大小,當batch值很小時,計算的均值和方差不穩定。研究表明對于ResNet類模型在ImageNet數據集上,batch從16降低到8時開始有非常明顯的性能下降,在訓練過程中計算的均值和方差不準確,而在測試的時候使用的就是訓練過程中保持下來的均值和方差。
這一個特性,導致batch?normalization不適合以下的幾種場景。
(1)batch非常小,比如訓練資源有限無法應用較大的batch,也比如在線學習等使用單例進行模型參數更新的場景。
(2)rnn,因為它是一個動態的網絡結構,同一個batch中訓練實例有長有短,導致每一個時間步長必須維持各自的統計量,這使得BN并不能正確的使用。在rnn中,對bn進行改進也非常的困難。不過,困難并不意味著沒人做,事實上現在仍然可以使用的,不過這超出了咱們初識境的學習范圍。
4.BN的改進
針對BN依賴于batch的這個問題,BN的作者親自現身提供了改進,即在原來的基礎上增加了一個仿射變換。
其中參數r,d就是仿射變換參數,它們本身是通過如下的方式進行計算的
其中參數都是通過滑動平均的方法進行更新
所以r和d就是一個跟樣本有關的參數,通過這樣的變換來進行學習,這兩個參數在訓練的時候并不參與訓練。
在實際使用的時候,先使用BN進行訓練得到一個相對穩定的移動平均,網絡迭代的后期再使用剛才的方法,稱為Batch?Renormalization,當然r和d的大小必須進行限制。
?
3?Batch?Normalization的變種
Normalization思想非常簡單,為深層網絡的訓練做出了很大貢獻。因為有依賴于樣本數目的缺陷,所以也被研究人員盯上進行改進。說的比較多的就是Layer?Normalization與Instance?Normalization,GroupNormalization了。
前面說了Batch?Normalization各個通道之間是獨立進行計算,如果拋棄對batch的依賴,也就是每一個樣本都單獨進行normalization,同時各個通道都要用到,就得到了Layer?Normalization。
跟Batch?Normalization僅針對單個神經元不同,Layer?Normalization考慮了神經網絡中一層的神經元。如果輸出的blob大小為(N,C,H,W),那么在每一層Layer?Normalization就是基于C*H*W個數值進行求平均以及方差的操作。
Layer?Normalization把每一層的特征通道一起用于歸一化,如果每一個特征層單獨進行歸一化呢?也就是限制在某一個特征通道內,那就是instance?normalization了。
如果輸出的blob大小為(N,C,H,W),那么在每一層Instance?Normalization就是基于H*W個數值進行求平均以及方差的操作。對于風格化類的圖像應用,Instance?Normalization通常能取得更好的結果,它的使用本來就是風格遷移應用中提出。
Group?Normalization是Layer?Normalization和Instance?Normalization?的中間體,?Group?Normalization將channel方向分group,然后對每個Group內做歸一化,算其均值與方差。
如果輸出的blob大小為(N,C,H,W),將通道C分為G個組,那么Group??Normalization就是基于G*H*W個數值進行求平均以及方差的操作。我只想說,你們真會玩,要榨干所有可能性。
在Batch?Normalization之外,有人提出了通用版本Generalized?Batch?Normalization,有人提出了硬件更加友好的L1-Norm?Batch?Normalization等,不再一一講述。
另一方面,以上的Batch?Normalization,Layer?Normalization,Instance?Normalization都是將規范化應用于輸入數據x,Weight?normalization則是對權重進行規范化,感興趣的可以自行了解,使用比較少,也不在我們的討論范圍。
這么多的Normalization怎么使用呢?有一些基本的建議吧,不一定是正確答案。
(1)?正常的處理圖片的CNN模型都應該使用Batch?Normalization。只要保證batch?size較大(不低于32),并且打亂了輸入樣本的順序。如果batch太小,則優先用Group?Normalization替代。
(2)對于RNN等時序模型,有時候同一個batch內部的訓練實例長度不一(不同長度的句子),則不同的時態下需要保存不同的統計量,無法正確使用BN層,只能使用Layer?Normalization。
(3)?對于圖像生成以及風格遷移類應用,使用Instance?Normalization更加合適。
?
4?Batch?Normalization的思考
最后是關于Batch?Normalization的思考,應該說,normalization機制至今仍然是一個非常open的問題,相關的理論研究一直都有,大家最關心的是Batch?Normalization怎么就有效了。
之所以只說Batch?Normalization,是因為上面的這些方法的差異主要在于計算normalization的元素集合不同。Batch?Normalization是N*H*W,Layer?Normalization是C*H*W,Instance?Normalization是H*W,Group?Normalization是G*H*W。
關于Normalization的有效性,有以下幾個主要觀點:
(1)?主流觀點,Batch?Normalization調整了數據的分布,不考慮激活函數,它讓每一層的輸出歸一化到了均值為0方差為1的分布,這保證了梯度的有效性,目前大部分資料都這樣解釋,比如BN的原始論文認為的緩解了InternalCovariate?Shift(ICS)問題。
(2)?可以使用更大的學習率,文[2]指出BN有效是因為用上BN層之后可以使用更大的學習率,從而跳出不好的局部極值,增強泛化能力,在它們的研究中做了大量的實驗來驗證。
(3)?損失平面平滑。文[3]的研究提出,BN有效的根本原因不在于調整了分布,因為即使是在BN層后模擬ICS,也仍然可以取得好的結果。它們指出,BN有效的根本原因是平滑了損失平面。之前我們說過,Z-score標準化對于包括孤立點的分布可以進行更平滑的調整。
算了,讓大佬先上吧。
[1]?Ioffe?S,?Szegedy?C.?Batch?normalization:?Accelerating?deep?network?training?by?reducing?internalcovariate?shift[J].?arXiv?preprint?arXiv:1502.03167,?2015.
[2]?Bjorck?N,?Gomes?C?P,?Selman?B,?et?al.?Understanding?batch?normalization[C]//Advances?in?NeuralInformation?Processing?Systems.?2018:?7705-7716.
[3]?Santurkar?S,?Tsipras?D,?Ilyas?A,?et?al.?How?does?batch?normalization?help?optimization?[C]//Advances?inNeural?Information?Processing?Systems.?2018:?2488-2498.
最后發一個通知,2019年有三AI培養計劃出爐了,一個季度一期噢。
2019年有三AI“春季”劃,給我一個榮耀,還你一生榮耀
?
總結
BN層技術的出現確實讓網絡學習起來更加簡單了,降低了調參的工作量,不過它本身的作用機制還在被廣泛研究中。幾乎就像是深度學習中沒有open問題的一個縮影,BN到底為何,還無定論,如果你有興趣和時間,不妨也去踩一坑。
下期預告:論深度學習中的優化方法
?
轉載文章請后臺聯系
侵權必究
比如網絡loss不正常,怎么調都不管用。
比如訓練好好的,測試就是結果不對。
bug天天有,深度學習算法工程師遇到的特別多,如果你想交流更多,就來有三AI知識星球實時提問交流吧,大咖眾多,總有能解決你問題的。
初識境界到此基本就結束了,這一系列是為大家奠定扎實的深度學習基礎,希望學習完后大家能有收獲。
AI白身境系列完整閱讀:
第一期:【AI白身境】深度學習從棄用windows開始
第二期:【AI白身境】Linux干活三板斧,shell、vim和git
第三期:【AI白身境】學AI必備的python基礎
第四期:【AI白身境】深度學習必備圖像基礎
第五期:【AI白身境】搞計算機視覺必備的OpenCV入門基礎
第六期:【AI白身境】只會用Python?g++,CMake和Makefile了解一下
第七期:【AI白身境】學深度學習你不得不知的爬蟲基礎
第八期:?【AI白身境】深度學習中的數據可視化
第九期:【AI白身境】入行AI需要什么數學基礎:左手矩陣論,右手微積分
第十期:【AI白身境】一文覽盡計算機視覺研究方向
第十一期:【AI白身境】AI+,都加在哪些應用領域了
第十二期:【AI白身境】究竟誰是paper之王,全球前10的計算機科學家
AI初識境系列完整閱讀
第一期:【AI初識境】從3次人工智能潮起潮落說起
第二期:【AI初識境】從頭理解神經網絡-內行與外行的分水嶺
第三期:【AI初識境】近20年深度學習在圖像領域的重要進展節點
第四期:【AI初識境】激活函數:從人工設計到自動搜索
第五期:【AI初識境】什么是深度學習成功的開始?參數初始化
第六期:【AI初識境】深度學習模型中的Normalization,你懂了多少?
第七期:【AI初識境】為了圍剿SGD大家這些年想過的那十幾招
第八期:【AI初識境】被Hinton,DeepMind和斯坦福嫌棄的池化,到底是什么?
第九期:【AI初識境】如何增加深度學習模型的泛化能力
第十期:【AI初識境】深度學習模型評估,從圖像分類到生成模型
第十一期:【AI初識境】深度學習中常用的損失函數有哪些?
第十二期:【AI初識境】給深度學習新手開始項目時的10條建議
感謝各位看官的耐心閱讀,不足之處希望多多指教。后續內容將會不定期奉上,歡迎大家關注有三公眾號 有三AI!
總結
以上是生活随笔為你收集整理的【AI初识境】深度学习模型中的Normalization,你懂了多少?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【AI初识境】什么是深度学习成功的开始?
- 下一篇: 【AI初识境】为了围剿SGD大家这些年想