batch 概念:訓練時候一批一批的進行正向推導和反向傳播。一批計算一次loss
mini batch:不去計算這個batch下所有的iter,僅計算一部分iter的loss平均值代替所有的。
以下來源:知乎
作者:陳志遠
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
(1) 不考慮bn的情況下,batch size的大小決定了深度學習訓練過程中的完成每個epoch所需的時間和每次迭代(iteration)之間梯度的平滑程度。(感謝評論區的韓飛同學提醒,batchsize只能說影響完成每個epoch所需要的時間,決定也算不上吧。根本原因還是CPU,GPU算力吧。瓶頸如果在CPU,例如隨機數據增強,batch size越大有時候計算的越慢。)
對於一個大小為N的訓練集,如果每個epoch中mini-batch的采樣方法采用最常規的N個樣本每個都采樣一次,設mini-batch大小為b,那么每個epoch所需的迭代次數(正向+反向)為 , 因此完成每個epoch所需的時間大致也隨着迭代次數的增加而增加。
由於目前主流深度學習框架處理mini-batch的反向傳播時,默認都是先將每個mini-batch中每個instance得到的loss平均化之后再反求梯度,也就是說每次反向傳播的梯度是對mini-batch中每個instance的梯度平均之后的結果,所以b的大小決定了相鄰迭代之間的梯度平滑程度,b太小,相鄰mini-batch間的差異相對過大,那么相鄰兩次迭代的梯度震盪情況會比較嚴重,不利於收斂;b越大,相鄰mini-batch間的差異相對越小,雖然梯度震盪情況會比較小,一定程度上利於模型收斂,但如果b極端大,相鄰mini-batch間的差異過小,相鄰兩個mini-batch的梯度沒有區別了,整個訓練過程就是沿着一個方向蹭蹭蹭往下走,很容易陷入到局部最小值出不來。
總結下來:batch size過小,花費時間多,同時梯度震盪嚴重,不利於收斂;batch size過大,不同batch的梯度方向沒有任何變化,容易陷入局部極小值。
(2)(存疑,只是突發奇想)如果硬件資源允許,想要追求訓練速度使用超大batch,可以采用一次正向+多次反向的方法,避免模型陷入局部最小值。即使用超大epoch做正向傳播,在反向傳播的時候,分批次做多次反向轉播,比如將一個batch size為64的batch,一次正向傳播得到結果,instance級別求loss(先不平均),得到64個loss結果;反向傳播的過程中,分四次進行反向傳播,每次取16個instance的loss求平均,然后進行反向傳播,這樣可以做到在節約一定的訓練時間,利用起硬件資源的優勢的情況下,避免模型訓練陷入局部最小值。
較小的batchsize,要設置小lr的原因之一,避免異常值對結果造成的擾巨大擾動。而對於較大的batchsize,要設置大一點的lr的原因則是大batch每次迭代的梯度方向相對固定,大lr可以加速其收斂過程。