Rethinking “Batch” in BatchNorm
Abstract
BatchNorm是現代卷積神經網絡的重要組成部分。它對“batches”而不是單個樣本進行操作的獨特特性,引入了與深度學習中大多數其他操作顯著不同的行為。因此,它會導致許多隱藏的警告,可能以微妙的方式對模型的性能產生負面影響。本文對視覺識別任務中的這類問題進行了深入的研究,指出解決這些問題的關鍵是在BatchNorm的“batch”概念中重新思考不同的選擇。通過提出這些警告和它們的緩解措施,我們希望這篇綜述能夠幫助研究人員更有效地使用BatchNorm。
1. Introduction
BatchNorm[33]是現代卷積神經網絡(CNNs)的一個重要組成部分。經驗證明,它可以降低模型對學習率和初始化的敏感性,並可以對各種網絡架構進行訓練。該方法提高了模型的收斂速度,並為抑制過擬合提供了正則化效果。由於這些吸引人的特性,自BatchNorm發明以來,它已經被包括在幾乎所有最先進的CNN架構中[24,28,70,58]。
盡管BatchNorm有很多優點,但是關於如何在不同的場景中應用BatchNorm還有很多微妙的選擇。做出次優選擇可能會降低模型的性能:模型仍然會進行訓練,但可能收斂到較低的准確性上。因此,在CNNs的設計中,BatchNorm有時被視為“necessary evil”[52]。本文的目標是總結在應用BatchNorm時可能會降臨到實踐者身上的陷阱,並提供克服這些陷阱的建議。
BatchNorm與其他深度學習算子的關鍵區別在於,它是對成批數據而不是單個樣本進行操作的。BatchNorm混合batch的信息以計算歸一化統計信息,而其他操作符獨立處理batch中的每個樣本。因此,BatchNorm的輸出不僅取決於單個樣本的性質,還取決於將樣本分組成batch的方式。為了展示一些樣本分組的不同方式,圖1(左)說明了BatchNorm操作的batch可能與隨機梯度下降(SGD)每一步中使用的mini-batch不同。圖1(右)進一步顯示了當樣本來自不同域時選擇BatchNorm的batch的額外選擇。
本文研究了BatchNorm中批處理的這些選擇。我們證明了天真地應用BatchNorm而不考慮batch構建的不同選擇會在許多方面產生負面影響,但是通過在batch概念中謹慎選擇,模型性能可以得到改善。
第3節討論了在推理過程中使用的歸一化統計信息,其中BatchNorm的“batch”表示的是整個訓練總體。我們重新討論在mini-batch統計中使用指數移動平均(exponential moving average,EMA)的常見選擇,並表明EMA可能給出不准確的估計,從而導致不穩定的驗證性能。我們還說明了PreciseBN是一種能更准確地估計總體統計數據的替代方法。
與大多數神經網絡操作符不同,BatchNorm在訓練和推理過程中表現不同:它在訓練過程中使用mini-batch統計數據,在推理過程中使用總體統計數據。第4節重點討論了這種設置可能導致的不一致性,並演示了在推理過程中使用mini-batch統計信息或在訓練過程中使用總體統計信息是有益的情況。
第5節檢查了BatchNorm的輸入來自不同領域的情況,其要么是由於使用多個數據集,要么是由於層共享。我們表明,在這樣的設置,batches的次優選擇可能導致域偏移。
BatchNorm在訓練期間使用mini-batch統計可能會導致訓練樣本之間的信息輕微泄漏。第六章研究了這種行為,並表明謹慎選擇標准化batches可以減輕這種潛在的有害影響。
在每一章節中,我們都用研究良好的視覺識別任務進行實驗,以證明使用BatchNorm看似標准的方法可能會導致次優行為,從而微妙地降低模型性能。在每種情況下,計算BatchNorm的標准化統計信息的另一種不常見的方法都會帶來顯著的改進。
本文綜述了目前存在的問題及解決辦法。我們將要討論的許多主題已經在之前的文獻中提到過;然而,它們分散在許多論文中,可能不會被廣泛欣賞。根據我們的經驗,BatchNorm的這些細微之處經常會在開發新模型時帶來麻煩。因此,我們的目標是收集大量關於BatchNorm的“dark knowledge”到一個地方,我們希望這篇綜述可以作為參考指南,幫助從業者避免BatchNorm造成的常見陷阱。
2. A Review of BatchNorm
在這里我們簡單地回顧一下Batch Normalization,主要集中於其在CNNs中的使用。BatchNorm的輸入x是形狀為(C,H,W),即有C個channels且空間大小為HxW的CNN特征。BatchNorm使用每個channels的統計數據,即均值和方差去歸一化輸入x來計算得到輸出y:
用來計算μ和σ2的機制可能不同。最常用的設置(其給了BatchNorm這個名字)是μ和σ2為mini-batch統計數據,即在訓練中N個特征組成的mini-batch的經驗均值和方差。mini-batch是一個形狀為(N,C,H,W)的4D tensor,即:
在推理中,μ和σ2不是從mini-batches中計算得到的,總體統計數據是從訓練集中估計得到的,並用於歸一化。
正如我們將在論文中看到的,關於什么是“batch”,也就是我們計算μ、σ2的數據是什么,可能有許多其他的選擇。在不同的場景中,batch的大小、batch的數據源或計算統計數據的算法可能會有所不同,從而導致不一致,最終影響模型的泛化。
我們在本文中對BatchNorm的定義與慣例略有不同:我們不把通常遵循歸一化的channel-wise仿射變換視為BatchNorm的一部分。我們的所有實驗都像往常一樣包含這個仿射變換,但我們把它看作是一個獨立的、常規的層,因為它獨立於樣本(它實際上相當於一個深度為1 × 1的卷積層)。這種區別將我們的注意力集中在BatchNorm中“batch”的獨特用法上。
通過排除仿射變換,總體統計成為BatchNorm唯一的可學習參數。然而,與神經網絡中的其他參數不同,梯度下降既不使用也不更新它們。相反,總體統計將使用其他算法(例如EMA)進行訓練,第3節將考慮替代算法。把總體統計的計算看作一種訓練形式,可以幫助我們用泛化的標准概念診斷這個過程。在第5節中,我們將看到缺乏訓練的總體統計數據會由於域偏移而影響泛化。
3. Whole Population as a Batch
在訓練期間,BatchNorm用mini-batch的樣本計算歸一化統計數據。然而,當模型用於測試時,通常不再有mini-batch的概念。最初的建議是[33],即在測試時,特征應該用總體統計量來歸一化,其是在整個訓練集上計算得到的。這里將
定義為使用整個數據作為“batch”計算得到的batch統計數據
。
由於是從數據中計算出來的,因此它們被認為是使用不同的算法對給定數據進行訓練得到的。這種訓練過程通常是無監督且便宜的,但它對模型的泛化是至關重要的。在本節中,我們將說明廣泛使用的EMA算法並不能總是准確地訓練總體統計數據,因此我們還將討論其他算法。
3.1. Inaccuracy of EMA
[33]提出了指數移動平均( exponential moving average,EMA)可以用來有效地計算總體統計。這種方法現在已經成為深度學習庫的標准。然而,我們將在本節中看到,盡管EMA普遍存在,但它可能不會產生一個良好的總體統計估計。
為了估計,EMAs在每個訓練迭代中都會進行更新:
其中是每次迭代的batch均值和方差,momentum為
因為以下的原因,指數平均可能趨向總體統計的次優估計:
- λ較大時統計收斂速度較慢。由於每次更新迭代只對EMA貢獻了一小部分(1−λ),因此需要大量的更新才能使EMA收斂到穩定的估計值。隨着模型的更新,情況變得更糟:EMA很大程度上是由過去的輸入特征主導的,隨着模型的發展,這些特征已經過時了。
- 當λ很小的時候,EMA統計被最近少量的mini-batches所主導,並且不能代表整個數據。
接下來,我們用標准的ImageNet分類來證明EMA的不准確性。我們在ImageNet[14]上訓練100個epoch的ResNet-50[24] ,所有實驗設置都遵循[18]:我們在256個GPU上使用8192的總mini-batch大小,因此BatchNorm在每個GPU上運行32個樣本。EMA使用每個GPU的統計數據進行更新,λ設置為0.9。我們在訓練期間經常保存模型的參數,以便繪制出我們從模型中隨機選擇的BatchNorm層的任意channel的EMA統計是如何演變的。此外,我們還將在“訓練模式”下保存的checkpoints向前運行以計算100個隨機mini-batches(每個也有32個樣本)的batch統計數據,這些數據與EMA統計數據一起繪制。從圖2的圖中可以看出,在訓練的早期階段,EMA並不能准確地代表mini-batch統計或總體統計。因此,使用EMA作為“總體統計”可能會損害模型的准確性。我們將在下一節中分析對模型精度的影響。
3.2. Towards Precise Population Statistics
理想情況下,我們希望根據其定義計算更精確的總體統計:使用整個訓練數據集作為一個batch去計算特征的平均值和方差。由於處理如此大的batch可能過於昂貴,我們的目標是通過以下兩個步驟來近似真實的總體統計數據:(1)將(固定)模型應用於許多mini-batches,以收集batch統計數據;(2)將每個batch的統計信息匯總為總體統計信息。
這種近似保持了真實總體統計數據不同於EMA的兩個重要屬性:(1)統計數據完全從一個固定的模型狀態計算出來,不像EMA使用模型的歷史狀態;(2)所有樣本權重均相等。接下來,我們將看到該方法能產生更好的統計數據,從而改進模型性能。我們還將討論它的實現細節,並表明這種近似方法與真正的總體統計數據一樣有效。
由於EMA現在已經成為了BatchNorm的實際標准,當BatchNorm層在推理中使用這個更精確的統計數據時,我們使用“PreciseBN”這個名稱,以避免與流行的BatchNorm實現混淆。但是,我們注意到這種方法實際上是[33]中原始BatchNorm的定義。PreciseBN的PyTorch實現在[1]中提供。
PreciseBN stabilizes inference results. 我們按照[18]中的配方在ImageNet上訓練ResNet-50,將常用的256大小的總batch size的數據 分布在8個GPU上運行。模型的評估在每個epoch上使用精確的統計和EMA。從圖3中繪制的error曲線可以看出,使用PreciseBN評價的驗證結果比使用EMA評價的驗證結果更好,也更穩定,說明EMA的不准確性對模型性能有負面影響。最終准確度列於表1的第1行。
(推理時使用PreciseBN會更加穩定)
(PreciseBN只需要103~104個樣本可以得到近似最優)
Large-batch training suffers more from EMA. 我們用8192這個更大的總batch size進行了同樣的實驗。遵循[18],基本學習率η線性增大到32倍。驗證error如圖4所示。
(大batch訓練對EMA影響更大)
圖4顯示,EMA在較大的batch size下產生了極高的方差驗證結果。[18]的圖4也觀察到了這一點。訓練的前30個epochs,即學習率最大時,該現象是最嚴重的,與我們在圖2(a)中的觀察相匹配。我們相信,在large-batch訓練中不穩定是由兩個因素導致的,其損害了EMA統計數據的收斂:(1)32倍的大學習率導致特性變化更顯著;(2)由於減少了總訓練迭代次數,EMA的更新次數減少了32倍。另一方面,PreciseBN產生穩定的精度。表1列出了它們在第30 epoch和第100 epoch的准確性。
PreciseBN only requires 103 ∼ 104 samples. 在實踐中,估計整個訓練集的均值和方差是昂貴的,而准確的總體統計可以從一個足夠大的子集獲得。在表1中,我們展示了error率在PreciseBN中使用的樣本數量不同時如何改變,使用了從以前的實驗中獲得的三個模型。結果表明,只需N = 103 ~ 104個樣本,PreciseBN就能獲得穩定的性能。如果我們在ImageNet訓練的每個epoch執行一次PreciseBN,我們估計使用PreciseBN只會增加0.5%的總訓練成本(假設每個epoch包含106張圖,后向傳播花銷和前向傳播相同,這樣每個epoch的額外訓練花銷為)。
PreciseBN雖然只需要103 ~ 104個樣本,但很難通過大量訓練和使用λ = 0的EMA來實現。我們在附錄A.1中對此進行了討論。
Aggregation of per-batch statistics. 即使,在一個batch中前向傳播足夠數量的樣本在計算上也是很有挑戰的。實際上,mini-batch size為B時,N個樣本需要被處理 k = N/B 次。這就提出了如何將每個batch的統計
聚合為
的問題。
我們在所有實驗中通過來聚合統計數據,其中
是k個batches的平均值。我們在附錄A.2中討論了一些可替代的聚合方法,但他們實際中的效果都差不多好。
Small batch causes accumulated errors. 在計算總體統計數據時,batch size B的選擇實際上很重要:不同的batch分組將改變標准化統計數據並影響輸出特征。這些特性之間的差異可能會累積到更深的BatchNorm層中,並導致不准確的統計數據。
為了驗證這一說法,我們使用PreciseBN評估相同的模型,使用相同的N = 104個樣本,但不同的batch size B來前向傳播這些樣本。表2的結果顯示,從小mini-batch size估計的總體統計是不准確的,並降低了准確性。在我們的實驗中,batch size B≥102就足夠了。
(小batch會產生統計量累積錯誤)
因為EMA必須使用與SGD相同的mini-batch來估計總體統計,我們的結果也表明,當使用小的batch size訓練時,EMA不能估計良好的總體統計。另一方面,PreciseBN中的batch size B可以獨立選擇,並且因為不需要反向傳播,所以需要更少的RAM。對於使用大小為2的normalization batch size(NBS)訓練的模型(表2中的第2行),正確使用PreciseBN比EMA提高了3.5%的准確性(PreciseBN穩定時為32.0,EMA為35.5)。
3.3. Discussions and Related Works
PreciseBN. 我們注意到,重新計算像PreciseBN這樣的總體統計實際上就是最初的BatchNorm[33]的公式定義,但它沒有被廣泛使用。本文深入分析了標准ImageNet分類任務下的EMA和PreciseBN,並在適當的情況下論證了PreciseBN的優勢。
我們證明,當模型不收斂時,尤其是在large-batch訓練期間,EMA無法精確估計總體統計數據。在這樣的情況下需要對模型進行評估時,應該使用PreciseBN。除了繪制驗證曲線,強化學習還需要在收斂前對模型進行評估。我們在附錄A.4回顧了[71]中的一個例子。即使當模型達到收斂時,我們也表明,如果用小batch size訓練模型,EMA會產生較差的估計。
然而,我們的實驗也表明,在給定足夠大的batch size和收斂模型時,EMA獲得的最終驗證誤差往往與來自PreciseBN的相同。因此,EMA方法仍然占主導地位,它的缺點經常被忽視。我們希望我們的分析可以幫助研究人員認識到EMA的問題,並在必要時使用PreciseBN。
Other advantages. 在存在其他train-test不一致的情況下,重新計算總體統計數據也很重要:[8,35]重新計算統計數據是因為模型權重在訓練后進行了平均。[42]重新計算總體方差,以補償dropout推理模式引起的“方差偏移”。[64,31,69]重新計算/重新校准總體統計數據,以補償測試時間量化導致的分布偏移。在不同的域[43]上重新計算總體統計在域自適應中很常見,這將在第5節中進一步討論。所有這些例子都涉及模型或數據中額外的train-test不一致,這證明了重新評估總體統計數據的合理性,因為在訓練期間估計的EMA統計數據可能與測試期間的特征分布不一致。最先進的視覺模型往往通過強烈的train-test不一致性來使訓練規范化[68,29,84,15,82],這也可能以意想不到的方式與BatchNorm交互。
4. Batch in Training and Testing
BatchNorm在訓練和測試中通常有不同的行為:歸一化統計數據來自不同的“batches”,即分別來自mini-batch和總體。總體統計信息和mini-batch統計信息之間的差距導致了不一致性。在本節中,我們分析了這種不一致性對模型性能的影響,並指出在某些情況下,可以很容易地消除這種不一致性以提高性能。
4.1. Effect of Normalization Batch Size
我們將“normalization batch size”定義為計算標准化統計信息的實際mini-batch的大小。為了避免混淆,本文明確使用“SGD batch size”或“total batch size”來指代SGD算法的mini-batch大小,即計算一個梯度更新所用的樣本數量。
在主要深度學習框架的BatchNorm標准實現中,訓練時的normalization batch size等於每個GPU的batch size。通過使用附錄A.5中討論的SyncBN[57]、GhostBN[27]等替代實現,我們可以輕松地增加或減少normalization batch size。
normalization batch size對訓練噪聲和train-test不一致性有直接影響:batch越大,mini-batch統計量越接近總體統計量,從而降低訓練噪聲和train-test不一致性。為了研究這種效果,我們按照[18]中的配方訓練ResNet-50[24]模型,但normalization batch size從2到1024變化。所有模型的SGD batch size固定為1024。為了便於分析,我們考察了3種不同評價方案下各模型的錯誤率:(1)在訓練集上采用mini-batch統計進行評價;(2)在驗證集上采用mini-batch統計進行評價;(3)在驗證集上用總體統計進行評價。我們將每個模型的最終指標繪制在圖5中。通過三種評價方案的消融情況,可以從圖中觀察到:
Training noise.訓練集error的單調趨勢(green)是由SGD過程中訓練噪聲的數量所決定的。當normalization batch size較小時,同一小批中隨機抽取的其他樣本對一個樣本的特征影響較大,訓練精度較差,導致優化困難。
Generalization gap. 當也使用mini-batch統計數據進行評估時,在驗證集(blue)上,模型的表現比訓練集(green)差。由於數據集的變化,模型的數學計算沒有發生變化,兩者之間的差距純粹是泛化差距。泛化gap隨着normalization batch size的增加而單調減小,這可能是由於訓練噪聲和train-test不一致所提供的正則化效果。
Train-test inconsistency. 為了分析由於導致的不一致性,我們在驗證集上(red vs blue曲線)比較了總體統計數據和mini-batch統計數據的使用效果。
一個小的normalization batch size(例如2或4)被認為表現很差[32,76],但是如果使用mini-batch統計(blue曲線),模型實際上有不錯的性能。我們的結果表明,mini-batch統計和總體統計之間的不一致性是影響小batch size下性能的主要因素。
另一方面,當normalization batch size較大時,小的不一致性可以提供正則化以減少驗證誤差。這使得紅色曲線比藍色曲線表現得更好。
在這個實驗中,最好的驗證error是在normalization batch size為32 ~ 128時發現的,其中噪聲和不一致性的數量提供了平衡的正則化。
4.2. Use Mini-batch in Inference
圖5的結果表明,在推理中使用mini-batch統計可以減少train-test的不一致性,提高測試時間性能。令人驚訝的是,我們發現使用這種方法,與常規batch size相比,tiny batch size(2)的BatchNorm的性能只下降了不到3%(圖5,blue)。然而,在推理中使用mini-batch統計通常不是一個合法的算法,因為模型不再對每個樣本進行獨立的預測。
R-CNN’s head. 我們現在研究一個案例,其在推理中可以合法地使用mini-batch統計信息。我們看看R-CNN風格的對象檢測器的第二階段(又稱“head”)[17,16,59,23]。R-CNN的head對每個輸入圖像i取Ri個感興趣區域(region-of-interest, RoIs),並對每個RoI進行預測。在大多數R-CNN的實現中,head的BatchNorm層將所有圖像的區域合並成單個大小為的mini-batch。我們在實驗中遵循這一慣例。
需要注意的是,即使在推斷中只給出了一個輸入圖像,大小N = R0的“mini-batch”(對於box head來說,通常是102 ~ 103量級的數量)仍然存在,因此mini-batch統計信息可以被合法地使用。
我們使用standard Mask R-CNN[23]基線和預先訓練的ResNet-50(在[77]中實現)進行實驗。在這個基線模型中沒有BatchNorm(只有FrozenBN,章節4.3中討論過)。為了研究BatchNorm的行為,我們將默認的2fc box head替換為類似[76]的4conv1fc head,並在box head和mask head的每個卷積層后添加BatchNorm。該模型是端到端的調整,而主干中的FrozenBN層保持固定。我們用不同的normalization batches對模型進行訓練,用不同的統計量進行評估,如表3所示。
(不使用norm效果略差,使用GN效果更好)
Mini-batch statistics outperform population statistics. 表3的結果表明,在測試時間使用mini-batch統計得到了明顯優於總體統計的結果。特別是,當使用進行推理時,模型的性能很差,而在訓練過程中,每個GPU只使用一張圖像。這是由於對批處理中的模式過擬合造成的,將在6.1節中進一步討論。還要注意的是,R-CNN內部的抽樣策略會產生額外的train-test不一致性,這可能會讓推理中的mini-batches遵循與訓練中的mini-batch不同的分布。這表明還有進一步改進的空間。
最后,我們證明了在推理中使用mini-batch統計可以有效地減少train-test不一致性。它提高了模型在normalization batch size時的性能,也提高了R-CNN的heads性能。
4.3. Use Population Batch in Training
前一節討論在推理中使用mini-batch統計信息。作為一種替代方法,在訓練中使用總體統計在理論上也可以減少train-test的不一致性。然而,如[33,32]所觀察到的,在梯度下降過程中使用EMA進行歸一化使得模型不可訓練。一種可行的總體統計訓練方法是使用凍結的總體統計數據,也稱為frozen BatchNorm(c)。
FrozenBN是一個常量仿射變換,其中μ和σ是之前計算得到的總體統計數據。作為一種線性變換,它可能會失去normalization層的優化優勢。因此,FrozenBN通常是在模型經過normalization優化之后使用的,比如在將預先訓練好的模型轉移到downstream任務時。因為它不再引入train-test不一致或BatchNorm的其他問題,所以FrozenBN在諸如目標檢測等領域是一個流行的替代方案。
接下來,我們研究了FrozenBN在減少train-test不一致性方面的作用。對於圖5中的每個模型,我們取第80個epoch的checkpoint,然后將所有BatchNorm替換為FrozenBN去訓練最后20個epochs。所有的訓練設置從最初訓練的最后20個epochs保持不變,除了一個epoch的線性熱身,從其開始訓練以幫助優化。結果如圖6所示:FrozenBN也有效地降低了train-test的不一致性,即使在前80個epoch用小的大小為2的normalization batch size訓練模型,也能得到25.2%的錯誤率。當normalization batch size足夠大時,使用FrozenBN調優的性能低於常規BN,這在目標檢測領域也可以觀察到[57,22]。
(FrozenBN可以有效緩解訓練測試不一致,即使在小normalization batch size,也能達到比較好的性能。但是隨着normalization batch size增大,這兩種方法都不如常規BN的結果。可見主要要根據normalization batch size去選擇方法)
4.4. Discussions and Related Works
我們選擇“Normalization batch size”這個術語是為了避免與其他相關的batch size概念混淆。這個概念在以前的工作中已經含蓄地使用過:[18]強調盡管它研究的是large-batch的訓練,但normalization batch size應該保持不變。[27]提出使用小的normalization batch size進行正則化。[74,67]在訓練過程中使用變化的total batch size,而不是恆定的total batch size。他們都解耦了normalization batch size與total batch size,並分別調整它們。
通過分析圖5,我們通過分析圖5,得到了在方面對BatchNorm行為的新理解,因為它消融了三個性能差距的來源:訓練噪聲、泛化gap和train-test不一致性。
(Small normalization batch size)眾所周知,較小的normalization batch size有負面影響,正如在以前的工作中觀察到的[32,76]。我們分析了潛在的原因,並表明在ImageNet上,使用PreciseBN可以將小normalization batch size和常規normalization batch size之間的大性能差距減少3.5%(表2),然后使用mini-batch統計可以再減少6.5%(圖5 red vs blue,normalization batch size=2)。這些改進根本不影響SGD訓練。
我們證明了在推理中使用mini-batch統計或在訓練中使用FrozenBN可以大大減少train-test不一致性。這兩種方法都只是簡單地改變“batch”以實現標准化,並顯著地提高了standard BatchNorm在小的normalization batch size下的性能。
我們的分析止於normalization batch size為2的情況。與InstanceNorm的關系[72]將在附錄A.7中單獨討論。
(Mini-batch statistics in inference)推理中的mini-batch統計可以幫助減少train-test的不一致性。據我們所知,在R-CNN的head中應用這種技術在以前的研究中沒有出現過,但[76]也觀察到總體統計數據在R-CNN的head中表現不佳。
EvalNorm[66]與在推理中使用mini-batch統計信息密切相關:它的目的是基於單個輸入實例的統計信息以及總體統計信息來近似地使用mini-batch統計信息。它通過類似的機制減少了train-test的不一致性,無需在推理中訪問mini-batch。
推理中的batch統計信息還有其他潛在用途:[34]將batch統計信息用作隨機噪聲的來源。[53]在元學習推理中使用batch統計信息進行評估。
在5.3節中,我們回顧了在推理中使用batch統計信息來處理域偏移的文獻。
FrozenBN在之前的工作中對預處理過的分類器進行了微調,用於downstream任務,如對象檢測[59,23,41],度量學習[50]。當應用於微調時,通常會凍結normalization統計量和隨后的仿射變換,以便將它們融合為一個單一的仿射變換(然而,在微調期間,將仿射變換與其他相鄰層(例如卷積)融合並不是一個好主意,盡管這是部署的標准優化。請參閱附錄A.8)。這種FrozenBN的變體在計算上是高效的,並且通常表現得很好。
即使沒有微調的背景,我們已經證明在訓練中使用FrozenBN通常有助於減少train-test不一致性,這部分解釋了為什么它在遷移學習中有用。在之前的研究中,如[37,79,39]也觀察到了在訓練過程中切換到FrozenBN的好處。
Reduce training noise in BN. 除了減少train-test不一致性,其他幾個歸一化方法試圖減少BatchNorm的訓練噪聲。BatchRenorm (BRN)[32]引入了修正項,使訓練時間統計更接近EMA,以減少batch統計中的噪聲。Moving Average BatchNorm(MABN)[80]通過將EMA應用於batch統計和反向傳播梯度來降低訓練噪聲。兩種方法都能改善小batch條件下的BatchNorm。[63,81]還研究了batch統計中的噪聲,並在訓練中提出了替代的歸一化方案。
批無關的歸一化方法,如GroupNorm [76], Filter Response normalization [65], EvoNorm[47]不受訓練噪聲的影響,具有競爭性的准確性。然而,與BatchNorm不同的是,它們都在推理中產生了額外的歸一化成本。
Increase training noise in BN. 有時,額外的噪聲是可取的,因為它額外的正則化效果。提出了幾種在batch統計中注入噪聲的方法。例如,TensorFlow的[3]BatchNorm層有一個adjustment=選項來顯式地注入隨機噪聲。[40]提出混合不同樣本的統計量以增加噪聲。[34]在測試時使用mini-batch統計信息來增加噪音。
5. Batch from Different Domains
BatchNorm模型的訓練過程可以看作是兩個獨立的階段:一是通過SGD學習得到特征;二是由EMA或PreciseBN使用這些特征訓練總體統計。我們將這兩個階段稱為“SGD訓練”和“總體統計數據訓練”。
訓練數據集和測試數據集之間的差異不利於機器學習模型的泛化。由於BatchNorm中訓練總體統計數據的額外階段,BatchNorm模型在這樣的域偏移下行為唯一。當數據來自多個領域時,輸入在(1)SGD訓練;(2)總體統計數據訓練;(3)測試中 的域gap都能影響泛化效果。
在本節中,我們將分析出現域gap的兩個場景: (1)模型在一個領域上進行訓練,但在其他領域上進行測試; (2)模型在多個領域上進行訓練。我們證明,通過選擇要歸一化的“batch”,兩者都可以使BatchNorm的使用復雜化。
5.1. Domain to Compute Population Statistics
當模型的訓練和測試階段看到不同的數據分布時,就會發生域轉移。在BatchNorm模型中,計算總體統計數據的額外訓練階段也受到域偏移的影響。BatchNorm的典型應用是在數據的訓練域上計算,而[43]提出了“Adaptive BatchNorm”來計算測試域的統計。在這里,我們將重新審視這種方法。
Experimental settings. 我們使用在ImageNet上訓練的常規ResNet-50模型,遵循[18]的配方,總batch size為1024,normalization batch size為32。為了研究使用這個模型的域偏移,我們在包含各種損壞的ImageNet圖像版本的ImageNet- C[26]上評估它。具體來說,我們使用具有3種不同損壞類型(對比、高斯噪聲、jpeg壓縮)和中等嚴重程度的ImageNet-C子集。我們在不同的評估數據上評估這個模型的准確性,同時改變用於訓練總體統計的數據。
Results. 從表4可以看出,在存在顯著的域偏移時,模型在用於評估的域上進行總體統計數據訓練后得到的錯誤率最好,比在SGD訓練中使用的數據集上訓練的效果好。直觀地說,重新計算這些統計量可以減少train-test的不一致性,並改進新數據分布的泛化。
然而,我們也注意到,重新計算目標分布上的總體統計數據可能最終也會損害性能。作為一個例子,我們重新對要進行評估的准確輸入計算了上述模型的,即 使用推理時間預處理的ImageNet驗證集而不是訓練增強的數據集進行重計算(即val set w/o augs)。盡管在總體統計訓練(val set w/o augs)和評估(IN)中觀察到相同的數據,但性能略有下降(表4的最后一行,從23.4 -> 23.8)。我們假設這是由於兩個訓練步驟之間的不一致,將總體統計數據應用於新領域是否有益,仍然是一個需要在不同背景下進行評估的問題。
(這幾行意思是一樣的,就是在評估數據上計算總體統計數據效果更好。如第一行意思是若在IN上計算總體統計數據,在IN-C-contrast上評估效果,得到的error rate為40.8;而在IN-C-contrast上計算總體統計數據,在IN-C-contrast上評估效果,得到的error rate更好,為33.1)
5.2. BatchNorm in Multi-Domain Training
BatchNorm的輸出不僅依賴於單個樣本,而且還依賴於訓練時如何將樣本分組成batch。形式上,對於BatchNorm層 f 來說,
其中X1、X2、...是多個輸入batches,[.,.]表示batch維度的串聯。當batches來自不同的域(即不同的數據集或不同的特征),等式1的兩邊決定是將不同的域一起標准化,還是將每個域單獨標准化。這種差異可能產生重大影響。
BN in RetinaNet’s Head. 我們使用RetinaNet[46]對象檢測器進行了一個案例研究,配備了特征金字塔網絡( Feature Pyramid Networks,FPN)[45]。該模型有一系列卷積層(又稱“head”),對來自不同特征金字塔級別的5個特征進行預測,如圖7所示。head在所有5個特征級別中共享,這意味着它接受來自5個不同分布或領域的輸入訓練。我們在shared head的所有中間卷積層之后添加了BatchNorm和channel-wise仿射層,並研究了它的行為。
在該模型中,head X1···X5的輸入特征來自不同的FPN層次,具有不同的空間維度。因此,以圖7(a)的形式訓練模型是很簡單的,在圖7(a)中,head獨立應用於特征,每個特征都由自己的統計數據歸一化。然而,圖7(b)是一個有效的選擇:我們將所有輸入特征壓平並連接,以便計算一組將所有特征歸一化在一起的統計數據。我們將這兩個選擇稱為在SGD訓練中使用“特定領域的統計信息(domain-specific statistics)”和“共享的統計信息(shared statistics)”。
在如何訓練總體統計方面也有類似的選擇。我們可以為每個特征級別計算唯一的總體統計數據,並根據輸入源使用它們進行推理,如圖7(a)所示。或者我們可以使用相同的總體統計集合來標准化所有的特征級別。
我們探討了上述選擇在這個shared head的組合,以顯示不一致的選擇在兩個訓練階段如何影響模型的泛化。此外,我們還實驗了在BatchNorm之后共享仿射變換層,或者對每個輸入特征使用不同的仿射變換的兩種不同選擇。
Consistency is crucial. 表5列出了這些組合的實驗結果。總之,我們展示了對於在不同領域/特性上多次使用的BatchNorm,其總體統計數據的計算方式應該與SGD優化期間特性的標准化方式一致。否則,這種差距會導致在推理中不能概括這些特性。同時,是否共享仿射層的影響很小。
我們強調,這個head的標准實現設置的表現很差(AP為34.1)。表5中的第3行對應於一個簡單的實現,它將:(1)在每個特性上分別應用shared head(即SGD Training使用domain-specific),因為這是head中的其他(卷積)層的應用方式;(2)只維護一組總體統計數據(即Population Stats為Shared),因為這一層在概念上是跨特性“共享”的。附錄A.9使用偽代碼進一步演示了BatchNorm的正確用法實現起來不那么簡單,因此不太常見。
雖然我們使用具有共享層的RetinaNet作為例子,但我們注意到,當在多個數據集上訓練模型時,我們討論的問題也存在:圖7(a)和(b)之間的選擇仍然存在。與直接在多個數據集上進行訓練相比,共享層的多領域特性很容易被忽略。
(SGD training、population statistics training和testing保持一致是非常重要的,並且全部使用domain-specific能取得最好的效果。不使用norm效果略差,使用GN效果更好)
(從上面的實驗可見,GroupNorm的效果都很好,推薦使用它)
5.3. Discussions and Related Works
Domain Shift. 第5.1節簡要討論了總體統計數據在域轉移方面的作用。首先提出了在目標域上重新計算總體統計數據的思想,即“Adaptive BatchNorm”[43]。接下來是修改BatchNorm用於域自適應的其他研究,比如[10]。防止圖像損壞或對抗的例子可以被視為域自適應的特殊案例,[6,62]表明自適應總體統計也有助於這些任務。此外,當測試時間輸入作為一個足夠大的mini-batch給出時,mini-batch本身可以用作目標域的“總體”。[51,4]表明,直接使用測試時間mini-batch重新計算統計數據也提高了對圖像損壞或對抗攻擊的魯棒性。
所有上述方法都需要訪問足夠數量的目標域數據,而這些數據通常是不可得的。因此,使用BatchNorm的模型比其他歸一化方法更容易發生域偏移。[38]和[55]均發現,BatchNorm模型在遷移學習中加入batch無關的歸一化后,其泛化gap可以得到改善。
(Domain-specific training)混合多域數據的BatchNorm的特定域訓練在以往的工作中經常被提出,稱為 “Domain-Specific BN” [11], “Split BN” [83], “Mixture BN” [79], “Auxiliary BN” [78], “Transferable Norm”[73]。在[2]中使用了RetinaNet中特定域的總體統計。這些方法都包含以下三個選擇中的一些。
- Domain-specific SGD training: 梯度下降訓練中使用的μB、σB是從一個或多個域計算出來的。
- Domain-specific population statistics: 是否在測試所有域時都使用同一組μpop、σpop,還是每個域都各使用一組。這需要知道測試時輸入的域。如果多個域來自於層共享(第5.2節),這樣的知識是微不足道的,在其他應用程序中不一定可用,例如測試來自多個數據集的輸入。
- Domain-specific affine transform: 是否學習特定領域的仿射變換參數,或使用共享仿射變換。這也需要知道測試時輸入的域。
通過消融上述三種選擇,我們表明在SGD訓練和總體統計訓練之間使用一致的策略是重要的,盡管這樣的實現可能看起來不直觀。
處理多個數據域的機器學習模型是常見的。有些算法甚至專門設計來處理這類數據,例如共享層、adversarial defense、GANs等。本節中的分析顯示了仔細考慮將什么樣的數據域標准化的重要性。
6. Information Leakage within a Batch
我們將BatchNorm的另一種警告描述為“信息泄漏(information leakage)”,即模型學會了利用它不打算使用的信息。由於BatchNorm沒有對mini-batch中的每個輸入樣本進行獨立預測,所以會發生信息泄漏(因為BN是對mini-batch的樣本計算統計量的,導致在樣本進行獨立預測時,會利用mini-batch內其他樣本的統計信息)。相反,每個樣本的預測通過mini-batch統計利用其他樣本。
當mini-batch中的其他樣本攜帶有用信息時,模型可以學習利用這些mini-batch信息,而不是學習針對單個樣本的泛化表征。這種行為可能出現在各種應用程序中。我們將在本節中回顧幾個示例。
6.1. Exploit Patterns in Mini-batches
Artificial pattern in mini-batch. [32]設計了一個實驗,其中ImageNet分類器被訓練為32個normalization batch size,但是每個這樣的batch都是手工制作的,由16個類和每個類2張圖像組成。顯然,當模型在訓練過程中對一個樣本進行預測時,它可以利用mini-batch中的另一個樣本必須具有相同的標簽這一事實來降低訓練損失。因此,該模型利用了這種模式,並且在訓練后不會泛化。圖8是在ResNet-50上進行的實驗結果,其他實驗細節都在[18]之后。
在本例中,可以通過在訓練過程中采用“Ghost BatchNorm”(附錄A.5)對來自不同類別的16幅圖像的子集進行歸一化,使每個normalization batch不再包含特殊的模式來解決這個問題。接下來,我們看看出現此問題的現實和常見場景,並展示其他實用的補救方法。
Correlated samples in R-CNN’s head. 我們研究了Mask R-CNN模型的第二階段(head),設置與4.2節相同。我們在第4.2節中已經說明了,如果在推理中使用總體統計信息,那么在head中添加BatchNorm將導致性能顯著下降。我們認為其原因類似於圖8:在head中執行per-GPU BatchNorm時,一個mini-batch的樣本是由同一幅圖像的RoIs組成的。這些RoIs攜帶關於彼此的有用表征,這些表征可能會因為mini-batch統計而錯漏。第4.2節在推理中使用了mini-batch統計信息,這使得模型能夠利用推理中的泄漏,從而提高性能。在這里,我們的目的是避免信息泄露。
雖然每個GPU上的mini-batches包含了head中高度相關的RoIs ,但GPUs之間的RoIs是獨立的。一種解決方案是使用SyncBN(附錄A.5)歸一化所有GPUs上的所有RoIs。通過組合來自其他圖像的樣本,削弱了normalization batch樣本之間的相關性。
另一種解決方案是在進入head之前在GPUs之間隨機打亂RoI特征。這就給每個GPU分配了一個隨機的樣本子集來進行歸一化處理,同時也削弱了normalization batch中樣本之間的相關性。該過程如圖9所示。
(即如果不打亂,一個mini-batch中的數據相關性太強,這樣得到的特征局限,當應用到別的數據上,其效果就比較差,因為泛化性不好)
表6的實驗結果表明,shuffling和SyncBN都能有效地解決信息泄漏問題,使得head在測試時能夠很好地泛化。在速度方面,我們注意到shuffle對於深度模型需要較少的跨GPU同步,但是每個同步傳輸的數據比SyncBN層要多。因此,它們的相對效率取決於模型體系結構。
在mini-batches中的模式也可能出現在其他應用程序中。例如,在強化學習中,一個代理在同一事件中獲得的訓練樣本,如果放到一個mini-batch中,也可能顯示出可以利用的相關性。在視頻理解模型中,一個mini-batch可能包含來自同一視頻clip的多個幀。如果這些應用程序受到在相關mini-batches上使用BatchNorm的影響,它們也可以通過確保normalization batches不包含相關樣本(如上面的shuffle)的謹慎實現中受益。
6.2. Cheating in Contrastive Learning
在對抗學習或度量學習中,訓練目標通常設計為在mini-batch內比較樣本。樣本在損失函數中同時扮演輸入和標簽的角色。在這種情況下,BatchNorm會漏掉其他樣本的信息,因此允許模型在訓練期間作弊(即只是在mini-batch中效果好),而不是學習有效的表征(泛化不行)。
這種作弊行為在[25]中觀察到,它采用LayerNorm[5]代替BatchNorm來解決。其他關於對抗學習的工作通過在不同的實現中使用BatchNorm來解決這個問題,類似於我們在6.1節中學習的內容。MoCo[21]將mini-batches中的樣本打亂(shuffle),以防止BatchNorm利用其他樣本。SimCLR [12], BYOL[19]使用SyncBN來解決這個問題。
由於對抗學習的特性,還有其他補救辦法。在許多teacher-student對抗學習框架中,模型的一個分支並不傳播梯度。利用這一特性,[44,9]提出不使用mini-batch統計信息,而是在該分支中使用移動平均統計信息(moving average statistics)來防止遺漏。這也有效地避免了作弊。
7. Conclusions
本文討論了BatchNorm在視覺識別任務中應用時的一些實際問題。下面我們從不同的角度對它們進行總結。
Inconsistency. train-test不一致性在BatchNorm的行為中起着至關重要的作用。在第3節中,我們討論了計算更精確且不落后於訓練時mini-batch統計的總體統計的方法。在第四章中,我們證明了通過在推理中使用mini-batch統計或在訓練中使用總體統計可以減少train-test不一致性。在第5節中,我們展示了執行優化的batches、計算總體統計的數據以及評估模型的數據之間的一致性的重要性。第6章中的信息泄漏問題源於mini-batch訓練和單個樣本測試之間的不一致性。此外,來自其他來源的train-test不一致性也可能與BatchNorm交互,如第3.3節所述。
Concept of “batch”. 我們回顧了BatchNorm的各種非常規用法,這些用法可以解決BatchNorm的警告。它們都只是在不同的上下文中改變了batch的構造方式。在第三章中,我們將整個總體定義為一個batch,並研究了計算其統計量的方法。在4.1節中,我們證明了normalization batch可以不同於梯度下降中使用的mini-batch。第4.2節和4.3節表明,在訓練和測試中,可以自由選擇batch作為mini-batch或總體。第5.1節討論了用於構造batch的數據。第5.2節重點討論了單個域的mini-batch和跨所有域的聯合mini-batch之間的區別。第6節表明,當batch的本質定義具有不希望的屬性時,我們可以通過shuffle等技術改變batch。
與之前提出的其他歸一化方案不同的是,上述方法仍然是在特征的batch維度上進行歸一化,但構造batch的方法不同。我們的目的是說明在每個場景中仔細考慮batch概念的重要性。
Library implementations. 許多庫都提供了BatchNorm的“標准”實現。然而,正如我們在本文中看到的,使用現成的實現可能不是最優的,而且使用BatchNorm的替代方法在這樣的標准實現中可能並不容易獲得。例如,他們使用EMA,但通常不提供重新估計總體統計的方法。這在使用精確的統計數據(3.2節)或域轉移(5.1節)方面造成困難。標准實現維護一組總體統計信息,但是根據第5節,每個域的統計信息是有用的。標准實現在訓練中使用每個GPU的mini-batch統計,在測試中使用總體統計,但正如第4節所示,這些不一定是最好的選擇。第6節中的問題是通過實現技術來解決的,比如shuffling和SyncBN。
此外,由於BatchNorm的獨特特性,它經常引入與底層深度學習系統的非標准交互,並導致其他實際問題或bug。附錄A.10列舉了一些例子。我們希望我們的審查提高人們對標准BatchNorm實現的局限性和潛在誤用的認識。
Practical implications. 我們在本文中討論的許多注意事項在實踐中可能並不常見。事實上,當應用於以下常見場景時,常規形式的BatchNorm確實表現得非常好:采用適當的batch size和訓練長度的監督訓練,使用從單個數據集隨機抽取的固定大小的獨立同分布batch,不進行層共享訓練,並在模型收斂后的相似分布數據上進行測試。
然而,由於BatchNorm和CNN被廣泛應用於其他應用和學習范式中,BatchNorm的注意事項值得注意。本文以圖像分類和目標檢測中的標准視覺模型為實驗平台,在有限的視覺表征學習上下文中討論了這些注意事項。當應用於其他任務時,BatchNorm的獨特屬性可能會帶來新的挑戰,需要進一步研究。我們希望這篇綜述能幫助研究人員仔細思考他們使用BatchNorm的原因,不要隱藏或阻礙新的研究突破。
A. Appendix
A.1. PreciseBN and EMA with λ = 0
當PreciseBN用於N≤104個樣本時,我們可以假設EMA在large-batch訓練下與PreciseBN相似,只要momentum λ設為0來剔除所有的歷史統計量。但我們注意到這往往不是真的。
首先,即使SGD訓練使用大的mini-batch size,歸一化通常仍然使用更小的batch,要么是為了平衡正則化(參見4.1節),要么是由於workers之間的大量通信成本。其次,在典型的訓練實現中,EMA更新總是緊隨SGD優化步驟,這將更新表征,使總體統計再次過時。這與PreciseBN不同,后者是在SGD優化后才計算總體統計數據。
因此,雖然EMA λ = 0在概念上等同於PreciseBN,但只有在large-batch訓練下才能與PreciseBN相媲美,需要克服其自身的實現挑戰。
A.2. Estimators of Population Variance
給定N = kxB 個從一個隨機變量X中得到的獨立同分布的樣本,分成batch size為B的k個batches,我們將使用每個batch的均值
和每個batch的方差
去估計X的方差,定義為:
每個估計量(estimator)都是無偏差的,但他們有不同的方差。將“樣本方差的方差”[13]代入,等式3的方差為:
其中是X的標准差和峰度(kurtosis)。因此,等式3中小的B會增加估計量的方差。
通過基本代數可以證明,等式2計算所有N個樣本的無偏樣本方差,當k = 1,B = N時,其等於等式3,因為在實際中B << N,這證明了等式2是更好的估計量。
當在使用N個形狀為(H, W)的輸入特征的總體數據時,在BatchNorm層中應用等式2,樣本總數變為N × H × W,這足夠大以至於bessel修正因子可以忽略。
A.3. Compute Population Statistics Layer-by-Layer
根據定義,總體統計應將整個數據集作為一個batch來計算。然而,對於較大的總體大小N,由於內存限制,這通常是不實際的。
另一方面,分割成大小為B的batch,運行N/B次前向傳播將導致不同的輸出。雖然通過每個batch的聚合矩(aggregating moments)(等式2)可以准確地計算出第一個BatchNorm層的總體統計量,但更深的層會受影響,如第3.2節所述。我們需要一種方法來計算真實的總體統計數據,這樣我們就可以知道我們通過分裂和聚合的近似方法是否足夠。
為了在有限的內存條件下准確計算總體統計信息,我們可以對統計信息進行逐層估計。為了計算第k個BatchNorm層的統計信息,我們首先獲得前k−1個BatchNorm層的真實總體統計信息。然后,通過讓前k - 1層使用總體統計信息,第k層使用batch統計信息,以任意batch size來前向傳播整個數據集以產生第k層的batch統計信息,這些batch統計信息隨后可以通過等式2聚合到總體統計信息中。該算法允許我們使用任何batch size來計算真正的總體統計數據,就好像總體數據是一個batch。
這種逐層算法的時間復雜度是模型深度的二次冪,因此非常昂貴。另一方面,用batch size B前向傳播整個模型N/B次更便宜。如表2所示,當B足夠大時,后面的近似方法的效果就足夠好了。
A.4. PreciseBN in Reinforcement Learning
第3.2節表明,當我們在訓練中運行推理時,如繪制驗證曲線,PreciseBN是有益的。然而,除了繪制監控曲線外,大多數監督訓練任務在訓練過程中不需要使用推理模式的模型。
另一方面,在強化學習(RL)中,大多數算法需要在訓練的同時運行推理,以便與環境交互並收集經驗作為訓練數據。因此,RL算法中EMA得到的估計較差:隨着模型的演化,EMA可能不能准確地反映統計量。例如,ELF OpenGO[71]的附錄描述了它在AlphaZero訓練中使用PreciseBN。他們報告說,使用PreciseBN解決他們稱之為“moment staleness”的問題后,結果有了明顯的改善。
A.5. Changing Normalization Batch Size
在BatchNorm層的經典實現中,normalization batch size等於per-GPU(或每個worker)的batch size。這使得改變normalization batch size變得困難:較大的per-GPU batch size需要更大的內存消耗,而較小的per-GPU batch size在現代硬件上通常是低效的。因此,我們開發了一些BatchNorm的實現來改變normalization batch size,而不需要考慮per-GPU的batch size。
Synchronized BatchNorm (SyncBN) ,也被稱為Cross-GPU BatchNorm[57]或Cross-Replica BatchNorm[8],是一個BatchNorm的實現,在數據並行訓練中使用高達SGD batch size的大的normalization batch size。它在per-GPU batch size有限的任務中是有效的,例如對象檢測[57,22]和語義分割[85]。在SyncBN中,工作人員執行集體通信,以便計算和共享跨多個worker的更大batch的均值和方差。我們在附錄A.6中討論了SyncBN的一些實現細節。(其實就是之前使用多個GPU時,每次迭代,輸入被等分成多份,然后分別在不同的GPU上前向(forward)和后向(backward)運算,並且求出梯度。在迭代完成后合並梯度、更新參數,再進行下一次迭代。因為在前向和后向運算的時候,每個GPU上的模型是單獨運算的,所以相應的Batch Normalization 也是在GPU內完成,所以實際BN所歸一化的樣本數量僅僅局限於該GPU內,相當於batch-size減小了。SyncBN的關鍵是在前向運算的時候拿到全局的均值和方差,在后向運算時候得到相應的全局梯度)
Ghost BatchNorm[27]是BatchNorm的一個實現,它減少了normalization batch size,只需將batch分成sub-batches,並分別標准化它們。當per-GPU batch size較大時,我們發現這可以改善正則化,如[54,67]所示。這些經驗證據與我們在第4節中的分析相吻合。
Virtual BatchNorm[61]是一種昂貴的增加normalization batch size的方法,不需要在GPUs之間同步:它只是使用額外的輸入圖像來計算batch統計數據。請注意,這不同於增加per-GPU batch size:額外的輸入圖像不會產生梯度,因此不會有顯著的內存成本。但它仍然需要額外的正向計算成本。[20]中也提出了類似的想法。通過包含額外的訓練圖像來組成虛擬BatchNorm,虛擬BatchNorm也可以是在測試時使用mini-batch統計信息的合法(但昂貴)方法。
Gradient Accumulation. 我們注意到常見的“radient Accumulation”技術(在Caffe[36]中稱為“iter_size”)不會改變normalization batch size。然而,它可以增加SGD batch size, 給定固定的per-GPU batch size和固定的GPUs數量。
A.6. Implementation of SyncBN
當數據並行worker(或GPUs)具有相同的batch size時,SyncBN的簡單實現只需要執行大小為2 x #channels 的all-reduce操作去計算分布在workers的大batch 的mini-batch統計數據
和
。然后使用
計算方差。(最簡單的實現方法是先同步求均值,再發回各GPU然后同步求方差,但是這樣就同步了兩次。為了只同步一次,使用上面的計算方法,這樣就只用在各GPU上計算x和x2的和,然后同步一次就能夠通過全局求和去計算均值和方差)
在某些應用中,“batch size”的定義比較模糊。例如,在目標檢測中,workers通常擁有相同數量的圖像,但每幅圖像的像素數不同,或者每幅圖像的RoIs(對於R-CNN風格的模型)數量不同。在這些場景中,workers最終可能會得到不同數量的需要標准化的元素。與前面提到的簡單實現不同,SyncBN可以考慮worker之間的mini-batch size的差異。然而,我們注意到,這似乎沒有必要,且經驗告訴我們其對結果並沒有產生顯著差異。
我們還注意到SyncBN的實現可能容易出錯,需要仔細驗證。SyncBN的實現於2019年3月被添加到PyTorch中,但並沒有像detectron2中首次報道的那樣產生正確的梯度,后來在2020年4月進行了修正。TensorFlow Keras在2020年2月添加了一個實現,但它直到2020年10月才產生正確的輸出。
A.7. InstanceNorm and BatchNorm
InstanceNorm (IN)[72]可以大致看作是normalization batch size為1的BatchNorm,但有一些關鍵的區別:(1)在測試過程中,IN計算instance統計信息的方式與訓練時的方式一致;(2)在訓練過程中,每個樣本的輸出取決於其輸入,沒有來自mini-batch中其他樣本的噪聲或隨機性。因此,第4.1節中的不一致性和正則化分析不再適用於IN。作為參考,在與第4.1節實驗相同的訓練配方下,根據[76],IN得到了約28%的驗證誤差。
A.8. Affine Fusion Before Fine-tuning
當使用FrozenBN時,該常數仿射層的權重可以與相鄰的線性層(如卷積層)融合。這種融合是部署的標准技術,因為模型在融合后執行數學等價計算。然而,我們提醒讀者,這種融合在數學上不再等同於微調。
我們使用一個toy例子去闡述它:使用步長為1的梯度下降去最小化關於x的函數,其中設置一個frozen常量λ=0.5,x初始化為非0值。因為
,每個GD step為
,這將使x收斂為0。但是,如果在優化時融合frozen λ和x,優化任務將變為在x的新初始化值下最小化
。然后GD step變為
,這將不會收斂。在現實中,像融合這樣的linear reparameterization可以極大地改變某些參數的有效步長,使模型更難優化。因此,與相鄰層融合的FrozenBN會導致微調的不利結果。
A.9. Implementation of RetinaNet head
在算法1中,我們使用PyTorch風格的偽代碼提供了表5中第1、3、6行對應的RetinaNet頭的參考實現。為了實現當前在深度學習庫中可用的BatchNorm抽象方法,row1引入了顯著的復雜性,而row6不再跨輸入“共享”相同的head。以row3的樣式實現它很簡單,但會導致性能較差。
row6的另一種實現是通過一個層,該層在每次調用它時循環多個統計信息。然而,這將引入另一層的狀態,該狀態取決於調用它的次數,這可能會導致其他並發症。
A.10. Non-standard Interaction with Libraries
我們在本文中討論的BatchNorm的獨特屬性不同於大多數其他深度學習原語。因此,它以獨特的方式與底層的深度學習系統相互作用,如果不加以注意,很容易導致bugs。我們現在列出了由這種交互引起的幾種類型的問題,其中許多與[7]中給出的具體例子相呼應。
Missing updates. BatchNorm的參數不會被梯度更新修改,而是經常被EMA修改。在聲明式計算圖執行庫中,這需要在訓練期間顯式執行這些額外的更新操作。在TensorFlow v1[3]提供的BatchNorm層實現中,使用UPDATE_OPS操作符集合來跟蹤這些操作。因為沒有BatchNorm的模型不需要執行這些操作,所以用戶在使用BatchNorm時很可能忘記執行這些操作,從而導致總體統計信息無法更新。TensorFlow提供了一個提示來提醒用戶這種誤用。
出於同樣的原因,如果BatchNorm被用於符號條件分支(如tf.cond)中,則很難更新統計信息。此類問題已被報道過多次。為了避免這些問題,Tensorpack[75]和現在已棄用的tf.contrib.layers提供了允許BatchNorm在前向過程中更新統計數據的選項,而不是作為額外的操作。然而,如果不小心使用,這可能會導致意外更新的問題。
Unintended updates. 像PyTorch[56]這樣的強制性深度學習庫必須更新BatchNorm參數作為前向計算的一部分。這確保了更新將被執行,但它可能會導致意外的更新:當模型處於“訓練模式”時,即使沒有任何反向傳播,簡單的前向傳遞也將更新模型參數。我們注意到一些開放源代碼以這種方式對驗證集進行訓練,可能是無意的,也可能是有意的。
Empty inputs. 當一個batch處理包含0個樣本時(在某些模型中很常見,比如R-CNN), BatchNorm會對底層庫提出更多挑戰。它可能需要控制流支持來不更新EMA,因為統計數據是未定義的。在使用SyncBN時,在沒有通信死鎖的情況下處理空輸入和控制流也是一個挑戰。
Freezing. 一些高級訓練庫引入了“frozen”層的概念,或將層設置為“不可訓練”狀態。這樣的概念對於BatchNorm來說是不明確的,因為它不像其他層一樣通過梯度下降進行訓練,因此可能會導致混淆或誤用。例如,這些討論揭示了在Keras普遍存在的濫用問題。
Numerical precision. 除法是一種歸一化操作,在其他深度學習原語中很少看到。如果在某些應用中輸入幾乎相同(例如稀疏特征、使用模擬器輸入的強化學習),那么除以一個小的數字很容易引入數值的不穩定性。[8]在分母中增加ε來應對此類問題。
作為歸一化的一部分,大量減法也是不穩定的潛在來源。在混合精度訓練[49]中,由於半精度范圍的限制,這種減法往往必須在全精度下進行。
Batch splitting. 基於流水線並行度的訓練系統更傾向於將mini-batch分解成更小的micro-batches,從而實現[30]的高效流水線。流水線和batch splitting也可以在具有有限RAM[48]的定制訓練硬件中看到。雖然splitting是對其他層的等效變換,但它影響了BatchNorm的計算,使系統的設計更加復雜。