是朋友,就不要讓自己的兄弟用大於32的mini-batch!

編者按:對於現代深度神經網路的訓練來說,如果要用隨機梯度下降來收斂,我們一般會選用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上做的,對時間序列回歸可能不太適用。

近來,深度神經網路在許多應用中取得了重大進展,包括計算機視覺、語音識別、自然語言處理,以及用於機器人控制和遊戲玩法的強化學習。

這之中,隨機梯度下降(SGD)及其變體(Adam、Adagrad)是最常用的深度學習優化演算法之一。SGD依靠使訓練集上的損失函數梯度逼近期望值來更新參數,為了保證快速收斂,它的一種做法是把訓練集分成一個個更小的樣本集,也就是我們常說的mini-batch。

無論是出入行業的新手,還是資深的專業工程師,batch size這個超參數是選擇是日常學習工作中不可避免的。然而在當前算力條件下,這個值取多少合適,業內並沒有對此蓋棺定論。

近年來一些人正在努力推行用大批量訓練提高SGD的並行性的主張,他們認為這可以更充分利用GPU,允許我們在更多節點上進行分散式處理。但另一批人則認為理論已經證明小批量能更好地提高模型的泛化性能和優化收斂,它佔用內存小,這就為設計出能高效利用計算資源的架構提供了機遇。兩派互不相讓,至今都沒在batch size上達成和解。

面對這個問題,本文從Wilson&Martinez的觀點出發,希望能重新探討一下樣本的batch size究竟該取多大。這裡我們計算的是新參數和舊參數的差值,也就是權重更新的總和,而不是每個batch的更新平均值。為了保證每個樣本的權重更新期望值對任何batch size都是一致的,神經網路的學習率是一個固定值。

隨機梯度下降

在進行比較前,我們先來回顧下最簡單的隨機梯度下降。設這是一個參數為θ的深度神經網路模型,Li(θ)是訓練集上的某個樣本,而L(θ)則是各樣本損失的平均值——損失函數:

(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!

論文地址:arxiv.org/pdf/1804.07612.pdf


推薦閱讀:

TAG:機器學習 | 深度學習DeepLearning | 神經網路 |