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