1、什麼是BatchSize
Batch一般被翻譯為批量,設定batch_size的目的讓模型在訓練過程中每次選擇批量的資料來進行處理。Batch Size的直覺了解就是一次訓練所選取的樣本數。
Batch Size的大小影響模型的優化程度和速度。同時其直接影響到GPU記憶體的使用情況,假如你GPU記憶體不大,該數值最好設定小一點。
2、 為什麼需要 Batch_Size?
在沒有使用Batch Size之前,這意味着網絡在訓練時,是一次把所有的資料(整個資料庫)輸入網絡中,然後計算它們的梯度進行反向傳播,由于在計算梯度時使用了整個資料庫,是以計算得到的梯度方向更為準确。但在這情況下,計算得到不同梯度值差别巨大,難以使用一個全局的學習率,是以這時一般使用Rprop這種基于梯度符号的訓練算法,單獨進行梯度更新。
在小樣本數的資料庫中,不使用Batch Size是可行的,而且效果也很好。但是一旦是大型的資料庫,一次性把所有資料輸進網絡,肯定會引起記憶體的爆炸。是以就提出Batch Size的概念。
3、 如何設定Batch_Size 的值?
設定BatchSize要注意一下幾點:
1)batch數太小,而類别又比較多的時候,真的可能會導緻loss函數震蕩而不收斂,尤其是在你的網絡比較複雜的時候。
2)随着batchsize增大,處理相同的資料量的速度越快。
3)随着batchsize增大,達到相同精度所需要的epoch數量越來越多。
4)由于上述兩種因素的沖突, Batch_Size 增大到某個時候,達到時間上的最優。
5)由于最終收斂精度會陷入不同的局部極值,是以 Batch_Size 增大到某些時候,達到最終收斂精度上的最優。
6)過大的batchsize的結果是網絡很容易收斂到一些不好的局部最優點。同樣太小的batch也存在一些問題,比如訓練速度很慢,訓練不容易收斂等。
7)具體的batch size的選取和訓練集的樣本數目相關。
16、32、64、128…時往往要比設定為整10、整100的倍數時表現更優
我在設定BatchSize的時候,首先選擇大點的BatchSize把GPU占滿,觀察Loss收斂的情況,如果不收斂,或者收斂效果不好則降低BatchSize,一般常用16,32,64等。
4、在合理範圍内,增大Batch_Size有何好處?
記憶體使用率提高了,大矩陣乘法的并行化效率提高。
跑完一次 epoch(全資料集)所需的疊代次數減少,對于相同資料量的處理速度進一步加快。
在一定範圍内,一般來說 Batch_Size 越大,其确定的下降方向越準,引起訓練震蕩越小。
5、 盲目增大 Batch_Size 有何壞處?
記憶體使用率提高了,但是記憶體容量可能撐不住了。
跑完一次 epoch(全資料集)所需的疊代次數減少,要想達到相同的精度,其所花費的時間大大增加了,進而對參數的修正也就顯得更加緩慢。
Batch_Size 增大到一定程度,其确定的下降方向已經基本不再變化。
6、調節 Batch_Size 對訓練效果影響到底如何?
Batch_Size 太小,模型表現效果極其糟糕(error飙升)。
随着 Batch_Size 增大,處理相同資料量的速度越快。
随着 Batch_Size 增大,達到相同精度所需要的 epoch 數量越來越多。
由于上述兩種因素的沖突, Batch_Size 增大到某個時候,達到時間上的最優。
由于最終收斂精度會陷入不同的局部極值,是以 Batch_Size 增大到某些時候,達到最終收斂精度上的最優
batchsize過小:每次計算的梯度不穩定,引起訓練的震蕩比較大,很難收斂。
batchsize過大:
(1)提高了記憶體使用率,大矩陣乘法并行計算效率提高。
(2)計算的梯度方向比較準,引起的訓練的震蕩比較小。
(3)跑完一次epoch所需要的疊代次數變小,相同資料量的資料處理速度加快。
缺點:容易内容溢出,想要達到相同精度,epoch會越來越大,容易陷入局部最優,泛化性能差。
batchsize設定:通常10到100,一般設定為2的n次方。
原因:計算機的gpu和cpu的memory都是2進制方式存儲的,設定2的n次方可以加快計算速度。
深度學習中經常看到epoch、 iteration和batchsize這三個的差別:
(1)batchsize:批大小。在深度學習中,一般采用SGD訓練,即每次訓練在訓練集中取batchsize個樣本訓練;
(2)iteration:1個iteration等于使用batchsize個樣本訓練一次;
(3)epoch:1個epoch等于使用訓練集中的全部樣本訓練一次;