這是《AI初識境》第6篇,,這次我們說說Normalization,。所謂初識,就是對相關(guān)技術(shù)有基本了解,,掌握了基本的使用方法,。 數(shù)據(jù)經(jīng)過歸一化和標(biāo)準(zhǔn)化后可以加快梯度下降的求解速度,這就是Batch Normalization等技術(shù)非常流行的原因,,它使得可以使用更大的學(xué)習(xí)率更穩(wěn)定地進(jìn)行梯度傳播,,甚至增加網(wǎng)絡(luò)的泛化能力。 今天就來說說和Batch Normalization相關(guān)的概念,。 作者&編輯 | 言有三 1 什么是歸一化/標(biāo)準(zhǔn)化 Normalization是一個統(tǒng)計學(xué)中的概念,,我們可以叫它歸一化或者規(guī)范化,它并不是一個完全定義好的數(shù)學(xué)操作(如加減乘除),。它通過將數(shù)據(jù)進(jìn)行偏移和尺度縮放調(diào)整,,在數(shù)據(jù)預(yù)處理時是非常常見的操作,在網(wǎng)絡(luò)的中間層如今也很頻繁的被使用,。 1. 線性歸一化 最簡單來說,,歸一化是指將數(shù)據(jù)約束到固定的分布范圍,比如8位圖像的0~255像素值,,比如0~1,。 在數(shù)字圖像處理領(lǐng)域有一個很常見的線性對比度拉伸操作: X=(x-xmin)/(xmax-mxin) 它常常可以實(shí)現(xiàn)下面的增強(qiáng)對比度的效果,。 不過以上的歸一化方法有個非常致命的缺陷,,當(dāng)X最大值或者最小值為孤立的極值點(diǎn),會影響性能,。 2. 零均值歸一化/Z-score標(biāo)準(zhǔn)化 零均值歸一化也是一個常見的歸一化方法,,被稱為標(biāo)準(zhǔn)化方法,即每一變量值與其平均值之差除以該變量的標(biāo)準(zhǔn)差,。 經(jīng)過處理后的數(shù)據(jù)符合均值為0,,標(biāo)準(zhǔn)差為1的分布,如果原始的分布是正態(tài)分布,,那么z-score標(biāo)準(zhǔn)化就將原始的正態(tài)分布轉(zhuǎn)換為標(biāo)準(zhǔn)正態(tài)分布,,機(jī)器學(xué)習(xí)中的很多問題都是基于正態(tài)分布的假設(shè),這是更加常用的歸一化方法,。 以上兩種方法都是線性變換,,對輸入向量X按比例壓縮再進(jìn)行平移,操作之后原始有量綱的變量變成無量綱的變量,。不過它們不會改變分布本身的形狀,,下面以一個指數(shù)分布為例: 如果要改變分布本身的形狀,下面也介紹兩種,。 3.正態(tài)分布Box-Cox變換 box-cox變換可以將一個非正態(tài)分布轉(zhuǎn)換為正態(tài)分布,,使得分布具有對稱性,變換公式如下: 在這里lamda是一個基于數(shù)據(jù)求取的待定變換參數(shù),,Box-Cox的效果如下,。 4. 直方圖均衡化 直方圖均衡也可以將某一個分布?xì)w一化到另一個分布,它通過圖像的灰度值分布,,即圖像直方圖來對圖像進(jìn)行對比度進(jìn)調(diào)整,,可以增強(qiáng)局部的對比度。 它的變換步驟如下: (1)計算概率密度和累積概率密度,。 (2)創(chuàng)建累積概率到灰度分布范圍的單調(diào)線性映射T,。 (3)根據(jù)T進(jìn)行原始灰度值到新灰度值的映射。 直方圖均衡化將任意的灰度范圍映射到全局灰度范圍之間,,對于8位的圖像就是(0,255),,它相對于直接線性拉伸,讓分布更加均勻,,對于增強(qiáng)相近灰度的對比度很有效,,如下圖。 綜上,,歸一化數(shù)據(jù)的目標(biāo),,是為了讓數(shù)據(jù)的分布變得更加符合期望,增強(qiáng)數(shù)據(jù)的表達(dá)能力,。 在深度學(xué)習(xí)中,,因為網(wǎng)絡(luò)的層數(shù)非常多,,如果數(shù)據(jù)分布在某一層開始有明顯的偏移,隨著網(wǎng)絡(luò)的加深這一問題會加劇(這在BN的文章中被稱之為internal covariate shift),,進(jìn)而導(dǎo)致模型優(yōu)化的難度增加,,甚至不能優(yōu)化。所以,,歸一化就是要減緩這個問題,。 2 Batch Normalization 1、基本原理 現(xiàn)在一般采用批梯度下降方法對深度學(xué)習(xí)進(jìn)行優(yōu)化,,這種方法把數(shù)據(jù)分為若干組,,按組來更新參數(shù),一組中的數(shù)據(jù)共同決定了本次梯度的方向,,下降時減少了隨機(jī)性,。另一方面因為批的樣本數(shù)與整個數(shù)據(jù)集相比小了很多,計算量也下降了很多,。 Batch Normalization(簡稱BN)中的batch就是批量數(shù)據(jù),,即每一次優(yōu)化時的樣本數(shù)目,通常BN網(wǎng)絡(luò)層用在卷積層后,,用于重新調(diào)整數(shù)據(jù)分布,。假設(shè)神經(jīng)網(wǎng)絡(luò)某層一個batch的輸入為X=[x1,x2,...,xn],其中xi代表一個樣本,,n為batch size,。 首先,我們需要求得mini-batch里元素的均值: 接下來,,求取mini-batch的方差: 這樣我們就可以對每個元素進(jìn)行歸一化,。 最后進(jìn)行尺度縮放和偏移操作,這樣可以變換回原始的分布,,實(shí)現(xiàn)恒等變換,,這樣的目的是為了補(bǔ)償網(wǎng)絡(luò)的非線性表達(dá)能力,因為經(jīng)過標(biāo)準(zhǔn)化之后,,偏移量丟失,。具體的表達(dá)如下,yi就是網(wǎng)絡(luò)的最終輸出,。 假如gamma等于方差,,beta等于均值,就實(shí)現(xiàn)了恒等變換,。 從某種意義上來說,,gamma和beta代表的其實(shí)是輸入數(shù)據(jù)分布的方差和偏移。對于沒有BN的網(wǎng)絡(luò),這兩個值與前一層網(wǎng)絡(luò)帶來的非線性性質(zhì)有關(guān),,而經(jīng)過變換后,,就跟前面一層無關(guān),變成了當(dāng)前層的一個學(xué)習(xí)參數(shù),,這更加有利于優(yōu)化并且不會降低網(wǎng)絡(luò)的能力,。 對于CNN,BN的操作是在各個特征維度之間單獨(dú)進(jìn)行,,也就是說各個通道是分別進(jìn)行Batch Normalization操作的。 如果輸出的blob大小為(N,C,H,W),,那么在每一層normalization就是基于N*H*W個數(shù)值進(jìn)行求平均以及方差的操作,,記住這里我們后面會進(jìn)行比較。 2.BN帶來的好處,。 (1) 減輕了對參數(shù)初始化的依賴,,這是利于調(diào)參的朋友們的。 (2) 訓(xùn)練更快,,可以使用更高的學(xué)習(xí)率,。 (3) BN一定程度上增加了泛化能力,dropout等技術(shù)可以去掉,。 3.BN的缺陷 從上面可以看出,,batch normalization依賴于batch的大小,當(dāng)batch值很小時,,計算的均值和方差不穩(wěn)定,。研究表明對于ResNet類模型在ImageNet數(shù)據(jù)集上,batch從16降低到8時開始有非常明顯的性能下降,,在訓(xùn)練過程中計算的均值和方差不準(zhǔn)確,,而在測試的時候使用的就是訓(xùn)練過程中保持下來的均值和方差。 這一個特性,,導(dǎo)致batch normalization不適合以下的幾種場景,。 (1)batch非常小,比如訓(xùn)練資源有限無法應(yīng)用較大的batch,,也比如在線學(xué)習(xí)等使用單例進(jìn)行模型參數(shù)更新的場景,。 (2)rnn,因為它是一個動態(tài)的網(wǎng)絡(luò)結(jié)構(gòu),,同一個batch中訓(xùn)練實(shí)例有長有短,,導(dǎo)致每一個時間步長必須維持各自的統(tǒng)計量,這使得BN并不能正確的使用,。在rnn中,,對bn進(jìn)行改進(jìn)也非常的困難。不過,困難并不意味著沒人做,,事實(shí)上現(xiàn)在仍然可以使用的,,不過這超出了咱們初識境的學(xué)習(xí)范圍。 4.BN的改進(jìn) 針對BN依賴于batch的這個問題,,BN的作者親自現(xiàn)身提供了改進(jìn),,即在原來的基礎(chǔ)上增加了一個仿射變換。 其中參數(shù)r,,d就是仿射變換參數(shù),,它們本身是通過如下的方式進(jìn)行計算的 其中參數(shù)都是通過滑動平均的方法進(jìn)行更新 所以r和d就是一個跟樣本有關(guān)的參數(shù),通過這樣的變換來進(jìn)行學(xué)習(xí),,這兩個參數(shù)在訓(xùn)練的時候并不參與訓(xùn)練,。 在實(shí)際使用的時候,先使用BN進(jìn)行訓(xùn)練得到一個相對穩(wěn)定的移動平均,,網(wǎng)絡(luò)迭代的后期再使用剛才的方法,,稱為Batch Renormalization,當(dāng)然r和d的大小必須進(jìn)行限制,。 3 Batch Normalization的變種 Normalization思想非常簡單,,為深層網(wǎng)絡(luò)的訓(xùn)練做出了很大貢獻(xiàn)。因為有依賴于樣本數(shù)目的缺陷,,所以也被研究人員盯上進(jìn)行改進(jìn),。說的比較多的就是Layer Normalization與Instance Normalization,Group Normalization了,。 前面說了Batch Normalization各個通道之間是獨(dú)立進(jìn)行計算,,如果拋棄對batch的依賴,也就是每一個樣本都單獨(dú)進(jìn)行normalization,,同時各個通道都要用到,,就得到了Layer Normalization。 跟Batch Normalization僅針對單個神經(jīng)元不同,,Layer Normalization考慮了神經(jīng)網(wǎng)絡(luò)中一層的神經(jīng)元,。如果輸出的blob大小為(N,C,H,W),那么在每一層Layer Normalization就是基于C*H*W個數(shù)值進(jìn)行求平均以及方差的操作,。 Layer Normalization把每一層的特征通道一起用于歸一化,,如果每一個特征層單獨(dú)進(jìn)行歸一化呢?也就是限制在某一個特征通道內(nèi),,那就是instance normalization了,。 如果輸出的blob大小為(N,C,H,W),那么在每一層Instance Normalization就是基于H*W個數(shù)值進(jìn)行求平均以及方差的操作,。對于風(fēng)格化類的圖像應(yīng)用,,Instance Normalization通常能取得更好的結(jié)果,它的使用本來就是風(fēng)格遷移應(yīng)用中提出。 Group Normalization是Layer Normalization和Instance Normalization 的中間體,, Group Normalization將channel方向分group,,然后對每個Group內(nèi)做歸一化,算其均值與方差,。 如果輸出的blob大小為(N,C,H,W),,將通道C分為G個組,那么Group Normalization就是基于G*H*W個數(shù)值進(jìn)行求平均以及方差的操作,。我只想說,,你們真會玩,要榨干所有可能性,。 在Batch Normalization之外,,有人提出了通用版本Generalized Batch Normalization,有人提出了硬件更加友好的L1-Norm Batch Normalization等,,不再一一講述。 另一方面,,以上的Batch Normalization,,Layer Normalization,Instance Normalization都是將規(guī)范化應(yīng)用于輸入數(shù)據(jù)x,,Weight normalization則是對權(quán)重進(jìn)行規(guī)范化,,感興趣的可以自行了解,使用比較少,,也不在我們的討論范圍,。 這么多的Normalization怎么使用呢?有一些基本的建議吧,,不一定是正確答案,。 (1) 正常的處理圖片的CNN模型都應(yīng)該使用Batch Normalization。只要保證batch size較大(不低于32),,并且打亂了輸入樣本的順序,。如果batch太小,則優(yōu)先用Group Normalization替代,。 (2)對于RNN等時序模型,,有時候同一個batch內(nèi)部的訓(xùn)練實(shí)例長度不一(不同長度的句子),則不同的時態(tài)下需要保存不同的統(tǒng)計量,,無法正確使用BN層,,只能使用Layer Normalization。 (3) 對于圖像生成以及風(fēng)格遷移類應(yīng)用,,使用Instance Normalization更加合適,。 4 Batch Normalization的思考 最后是關(guān)于Batch Normalization的思考,應(yīng)該說,normalization機(jī)制至今仍然是一個非常open的問題,,相關(guān)的理論研究一直都有,,大家最關(guān)心的是Batch Normalization怎么就有效了。 之所以只說Batch Normalization,,是因為上面的這些方法的差異主要在于計算normalization的元素集合不同,。Batch Normalization是N*H*W,Layer Normalization是C*H*W,,Instance Normalization是H*W,,Group Normalization是G*H*W。 關(guān)于Normalization的有效性,,有以下幾個主要觀點(diǎn): (1) 主流觀點(diǎn),,Batch Normalization調(diào)整了數(shù)據(jù)的分布,不考慮激活函數(shù),,它讓每一層的輸出歸一化到了均值為0方差為1的分布,,這保證了梯度的有效性,目前大部分資料都這樣解釋,,比如BN的原始論文認(rèn)為的緩解了Internal Covariate Shift(ICS)問題,。 (2) 可以使用更大的學(xué)習(xí)率,文[2]指出BN有效是因為用上BN層之后可以使用更大的學(xué)習(xí)率,,從而跳出不好的局部極值,,增強(qiáng)泛化能力,在它們的研究中做了大量的實(shí)驗來驗證,。 (3) 損失平面平滑,。文[3]的研究提出,BN有效的根本原因不在于調(diào)整了分布,,因為即使是在BN層后模擬ICS,,也仍然可以取得好的結(jié)果。它們指出,,BN有效的根本原因是平滑了損失平面,。之前我們說過,Z-score標(biāo)準(zhǔn)化對于包括孤立點(diǎn)的分布可以進(jìn)行更平滑的調(diào)整,。 算了,,讓大佬先上吧。 [1] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015. [2] Bjorck N, Gomes C P, Selman B, et al. Understanding batch normalization[C]//Advances in Neural Information Processing Systems. 2018: 7705-7716. [3] Santurkar S, Tsipras D, Ilyas A, et al. How does batch normalization help optimization?[C]//Advances in Neural Information Processing Systems. 2018: 2488-2498. 最后發(fā)一個通知,,2019年有三AI培養(yǎng)計劃出爐了,,一個季度一期噢。 BN層技術(shù)的出現(xiàn)確實(shí)讓網(wǎng)絡(luò)學(xué)習(xí)起來更加簡單了,,降低了調(diào)參的工作量,不過它本身的作用機(jī)制還在被廣泛研究中,。幾乎就像是深度學(xué)習(xí)中沒有open問題的一個縮影,,BN到底為何,還無定論,,如果你有興趣和時間,,不妨也去踩一坑。 下期預(yù)告:論深度學(xué)習(xí)中的優(yōu)化方法 轉(zhuǎn)載文章請后臺聯(lián)系 侵權(quán)必究 |
|