編者按:對于現代深度神經網絡的訓練來說,如果要用随機梯度下降來收斂,我們一般會選用Mini-Batch,這也是工程界最常用的做法。盡管大批量可以為并行計算提供更多算力空間,但小批量已經被證明了通用性更好,占用内存更少,而且收斂速度更快。那麼,常見的mini-batch從幾十到幾百不等,我們又該怎麼往哪個方向調試呢?近日,智能芯片創業公司Graphcore的兩位工程師就在論文Revisiting Small Batch Training for Deep Neural Networks中給出了建議——2到32之間。
考慮到CPU在結構上就對2的乘方的batch size不友好,因此本文隻針對GPU和專用芯片;另外,論文的實驗是在CIFAR-10、CIFAR-100和ImageNet上做的,對時間序列回歸可能不太适用。
近來,深度神經網絡在許多應用中取得了重大進展,包括計算機視覺、語音識别、自然語言處理,以及用于機器人控制和遊戲玩法的強化學習。
(1)
M是訓練集樣本的總數。上式表示代表真實數據生成分布的損失期望值。
批量梯度下降法(BSD)優化的是參數在整個數據集上的梯度累積情況,而随機梯度下降計算的是基于單個訓練樣本的參數更新值。現在深度學習領域常用的是帶Mini-batch的SGD優化方法,它是這兩種思想的融合:先從訓練集上選擇幾個小批量的訓練樣本,利用單個樣本進行多次疊代,把疊代得出的幾個梯度進行加權平均并求和。這個和就是該mini-batch的下降梯度。
從數學角度看,就是設訓練集的mini-batch為B,每個mini-batch包含m個訓練樣本。通過計算mini-batch的下降梯度,我們要讓它拟合期望值L(θ),然後從中獲取參數θ的更新情況:
(2)(3)
其中η是學習率。依據這兩個等式,SGD權重更新的平均值是E{η ∆θ} = −η E{∇θL(θ)}。由于batch size是m,所以每個樣本權重更新的期望值就是:
(4)
這意味着随着訓練疊代的進行,對于同一個batch size m,我們要不斷線性增加學習率η來保證每個訓練樣本平均SGD權重更新能始終保持恒定。
學習率的不同選取對于上節的這個計算結果,本文提出的一個設想是batch size和學習率之間的線性關系其實是不存在的,這其實是用SGD計算mini-batch局部梯度平均值導緻的一種假象。
Wilson&Martinez之前在論文中指出,現在我們更新參數用的計算方法是等式(3),它計算的是局部梯度平均值,但以前老版本優化方法計算的卻是局部梯度的和。如果我們用θk處的梯度總和來更新參數,那它可以被表示為:
(5)
對于這種方法,如果batch size增加了,我們隻需保證學習率η˜的固定就可以保持權重更新恒定。這相當于用了線性縮放規則。對比(2)(3)(5),可以發現新舊版本的區别就在于老版本的學習率η˜=η/m。
如果我們繼續設batch size=m,計算從θk處開始到第k n處的權重更新情況,那根據等式(5),它就是:
(6)
這時如果batch size=m n,那k 1處的權重就成了這樣:
(7)
對比(6)(7)不難發現,在學習率η˜恒定的情況下,大批量訓練基本上可以被看成是小批量訓練的近似值,它隻是在新舊梯度更替時增加了一些并行性。
上一節我們用平均值時,它給出的結論是用更大的batch size可以提供更“準确”的梯度估計并允許使用更大的學習率。但本節嘗試使用總和後,我們可以發現從保持每單位計算成本更新權重的期望值來看,這可能并非如此。實際上,使用較小batch size可以用最新權重梯度,這反過來又允許我們使用更高的基本學習速率,因為每次SGD更新的方差都較低。這兩個因素都有可能帶來更快更穩健的收斂效果。
實驗對比結果本節給出了CNN的一些訓練性能的數值結果。更詳細的實驗過程可以參看原文。研究人員用AlexNet和ResNet兩個模型在CIFAR-10、CIFAR100和ImageNet上分别做了測試,對照組為:BN/noBN(有無batch歸一化)、Aug/noAug(有無數據增強)、WU(gradual warmup)。
不同batch size訓練的模型在CIFAR-10上的不同表現
上圖展示了各模型在CIFAR-10上的最佳表現。可以發現,當batch size小于等于32時,各模型的性能還維持在較高水平。對于沒有BN的模型,m=2時它們的性能最佳,這和“學習率的不同選取”那一節的分析一緻,在batch size較小的情況下,模型能基于最新的梯度信息進行更新,效果更快更穩健。而對于做了BN的模型,它們在m=4和m=8時效果更好。
基礎學習率η˜=η/m為各模型提供可靠的收斂效果
上圖展示了AlexNet和ResNet兩個模型的表現。當batch size逐漸增大,為模型提供穩定收斂的基礎學習率η˜=η/m會逐漸減小,這也就說明了為什麼用較大的batch size會訓練出不太好的結果。此外,論文還推導了BN對模型的影響(本文未翻譯此部分,請查詢原文),指出每個模型都有一個最優基礎學習率η˜,但通常它隻能和較小的batch size結合才能實現穩定收斂。這也從側面表明如果batch size過大,我們很可能會優化出一個錯誤的學習率,從而影響模型性能。
雖然實驗的結果是用小批量來提高模型收斂性和準确性更好,但它也會降低可用的計算并行性。所以當硬件受限時,我們也有綜合各個條件慎重考慮。
結論本文通過實驗證明,在大規模訓練中,對于給定的計算資源,使用小批量可以更好地保證模型的通用性和訓練穩定性。在大多數情況下,batch size小于等于32時模型的最終性能較優,而當batch size=2或4時,模型性能可能會達到最優。
如果要進行batch歸一化處理,或者使用的是大型數據集,這時我們也可以用較大的batch,比如32和64。但要注意一點,為了保證訓練效率,這些數據最好是分布式處理的,比如最好的方法是在多個處理器上分别做BN和随機梯度優化,這樣做的優勢是對于單個處理器而言,這其實還是在做小批量優化。而且根據文章的實驗,BN的最優batch size通常比SGD的還要小。
Yann LeCun讀完這篇論文後,抑制不住内心的激動,在twitter上寫了一句話:
過大的minibatch有害身心
更重要的是
它還會導緻訓練error
所以是朋友,就不要讓自己的朋友用大于32的mini-batch!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!