Pytorch學習筆記02----深度學習中的epochs,batch_size,iterations詳解


batch_size、epoch、iteration是深度學習中常見的幾個超參數:

(1)batch_size:每批數據量的大小。DL通常用SGD的優化算法進行訓練,也就是一次(1 個iteration)一起訓練batchsize個樣本,計算它們的平均損失函數值,來更新參數。

(2)iteration:1個iteration即迭代一次,也就是用batchsize個樣本訓練一次。

(3)epoch:1個epoch指用訓練集中的全部樣本訓練一次,此時相當於batchsize 等於訓練集的樣本數。

最初訓練DNN采用一次對全體訓練集中的樣本進行訓練(即使用1個epoch),並計算一次損失函數值,來更新一次權值。當時數據集較小,該方法尚可。后來隨着數據集迅速增大,導致這種方法一次開銷大進而占用內存過大,速度過慢。

后來產生了一次只訓練一個樣本的方法(batchsize=1),稱作在線學習。該方法根據每一個樣本的情況更新一次權值,開銷小速度快,但收到單個樣本的巨大隨機性,全局來看優化性能較差,收斂速度很慢,產生局部震盪,有限迭代次數內很可能無法收斂。

目前常用隨機梯度下降SGD來訓練,相當於上述兩個“極端”方法的折中:將訓練集分成多個mini_batch(即常說的batch),一次迭代訓練一個minibatch(即batchsize個樣本),根據該batch數據的loss更新權值。這相比於全數據集訓練,相當於是在尋找最優時人為增加了一些隨機噪聲,來修正由局部數據得到的梯度,盡量避免因batchsize過大陷入局部最優。

這種方法存在兩對矛盾。由於一次只分析的一小部分數據,因此整體優化效果與batchsize有關:

batchsize越小,一個batch中的隨機性越大,越不易收斂。然而batchsize越小,速度越快,權值更新越頻繁;且具有隨機性,對於非凸損失函數來講,更便於尋找全局最優。從這個角度看,收斂更快,更容易達到全局最優。

batchsize越大,越能夠表征全體數據的特征,其確定的梯度下降方向越准確,(因此收斂越快),且迭代次數少,總體速度更快。然而大的batchsize相對來講缺乏隨機性,容易使梯度始終向單一方向下降,陷入局部最優;而且當batchsize增大到一定程度,再增大batchsize,一次batch產生的權值更新(即梯度下降方向)基本不變。因此理論上存在一個最合適的batchsize值,使得訓練能夠收斂最快或者收斂效果最好(全局最優點)。

1.batch
深度學習的優化算法,說白了就是梯度下降。每次的參數更新有兩種方式。

第一種,遍歷全部數據集算一次損失函數,然后算函數對各個參數的梯度,更新梯度。這種方法每更新一次參數都要把數據集里的所有樣本都看一遍,計算量開銷大,計算速度慢,不支持在線學習,這稱為Batch gradient descent,批梯度下降。

另一種,每看一個數據就算一下損失函數,然后求梯度更新參數,這個稱為隨機梯度下降,stochastic gradient descent。這個方法速度比較快,但是收斂性能不太好,可能在最優點附近晃來晃去,hit不到最優點。兩次參數的更新也有可能互相抵消掉,造成目標函數震盪的比較劇烈。

為了克服兩種方法的缺點,現在一般采用的是一種折中手段,mini-batch gradient decent,小批的梯度下降,這種方法把數據分為若干個批,按批來更新參數,這樣,一個批中的一組數據共同決定了本次梯度的方向,下降起來就不容易跑偏,減少了隨機性。另一方面因為批的樣本數與整個數據集相比小了很多,計算量也不是很大。

基本上現在的梯度下降都是基於mini-batch的,所以深度學習框架的函數中經常會出現batch_size,就是指這個。
批量大小將決定我們一次訓練的樣本數目

全批次(藍色)

如果數據集比較小,我們就采用全數據集。全數據集確定的方向能夠更好的代表樣本總體,從而更准確的朝向極值所在的方向。

注:對於大的數據集,我們不能使用全批次,因為會得到更差的結果。

迷你批次(綠色)

選擇一個適中的Batch_Size值。就是說我們選定一個batch的大小后,將會以batch的大小將數據輸入深度學習的網絡中,然后計算這個batch的所有樣本的平均損失,即代價函數是所有樣本的平均。

隨機(Batch_Size等於1的情況)(紅色)

每次修正方向以各自樣本的梯度方向修正,橫沖直撞各自為政,難以達到收斂。

適當的增加Batch_Size的優點
1.通過並行化提高內存利用率。

2.單次epoch的迭代次數減少,提高運行速度。(單次epoch=(全部訓練樣本/batchsize)/iteration=1)

3.適當的增加Batch_Size,梯度下降方向准確度增加,訓練震動的幅度減小。(看上圖便可知曉)

經驗總結
相對於正常數據集,如果Batch_Size過小,訓練數據就會非常難收斂,從而導致underfitting。

增大Batch_Size,相對處理速度加快。

增大Batch_Size,所需內存容量增加(epoch的次數需要增加以達到最好的結果)

這里我們發現上面兩個矛盾的問題,因為當epoch增加以后同樣也會導致耗時增加從而速度下降。因此我們需要尋找最好的Batch_Size。

再次重申:Batch_Size的正確選擇是為了在內存效率和內存容量之間尋找最佳平衡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM