Batch size調整和epoch/iteration的關系
訓練數據集總共有1000個樣本。若batch_size=10,那么訓練完全體樣本集需要100次迭代,1次epoch。
訓練樣本10000條,batchsize設置為20,將所有的訓練樣本在同一個模型中訓練5遍,則epoch=5,batchsize=20, iteration=10000/20=500(即迭代次數表示有多個個batch會過模型)
分布式訓練時的batch_size設置:需要將batch_size/num_process。divide the batch size by the number of replicas in order to maintain the overall batch size of 需要的值.[PyTorch:模型訓練-分布式訓練]
Batch size設置經驗
1 一定條件下,batchsize越大訓練效果越好。但是batchsize越大,內存gpu消耗越大。梯度累加則實現了batchsize的變相擴大,如果accumulation_steps為8,則batchsize ‘變相’ 擴大了8倍,是解決顯存受限的一個不錯的trick。
[使用梯度累加的batch訓練函數]
2 經驗法則是,如果mini-batch size加倍,那么學習率就加倍。
[神經網絡中 warmup 策略為什么有效;有什么理論解釋么? - 知乎]
在前面“如果mini-batch size加倍,那么學習率就加倍"中,我們的假設在什么時候可能不成立呢?兩種情況:
1)在訓練的開始階段,模型權重迅速改變
2)mini-batch size較小,樣本方差較大
第一種情況很好理解,可以認為,剛開始模型對數據的“分布”理解為零,或者是說“均勻分布”(當然這取決于你的初始化);在第一輪訓練的時候,每個數據點對模型來說都是新的,模型會很快地進行數據分布修正,如果這時候學習率就很大,極有可能導致開始的時候就對該數據“過擬合”,后面要通過多輪訓練才能拉回來,浪費時間。當訓練了一段時間(比如兩輪、三輪)后,模型已經對每個數據點看過幾遍了,或者說對當前的batch而言有了一些正確的先驗,較大的學習率就不那么容易會使模型學偏,所以可以適當調大學習率。這個過程就可以看做是warmup。那么為什么之后還要decay呢?當模型訓到一定階段后(比如十個epoch),模型的分布就已經比較固定了,或者說能學到的新東西就比較少了。如果還沿用較大的學習率,就會破壞這種穩定性,用我們通常的話說,就是已經接近loss的local optimal了,為了靠近這個point,我們就要慢慢來。
第二種情況其實和第一種情況是緊密聯系的。在訓練的過程中,如果有mini-batch內的數據分布方差特別大,這就會導致模型學習劇烈波動,使其學得的權重很不穩定,這在訓練初期最為明顯,最后期較為緩解(所以我們要對數據進行scale也是這個道理)。
說明,在上面兩種情況下,我們并不能單純地成倍增長lr η? =kη。要么改變學習率增長方法,要么設法解決上面兩個問題。
[神經網絡中 warmup 策略為什么有效;有什么理論解釋么?]
所以就有了下面的warmup策略和學習率衰減方法:
學習率 warm-up 策略
訓練神經網絡時,在初始使用較大學習率而后期切換為較小學習率是一種廣為使用的做法。而 warmup 策略則與上述 scheme 有些矛盾,warmup 需要在訓練最初使用較小的學習率來啟動,并很快切換到大學習率而后進行常見的 decay,那么最開始的這一步 warmup 為什么有效呢?
warmup_lr 的初始值是跟訓練預料的大小成反比的,也就是說訓練預料越大,那么warmup_lr 初值越小,隨后增長到我們預設的超參 initial_learning_rate相同的量級,再接下來又通過 decay_rates 逐步下降。
這樣做的原因前面已經說明了,還有什么好處?
1)這樣可以使得學習率適應不同的訓練集合size實驗的時候經常需要先使用小的數據集訓練驗證模型,然后換大的數據集做生成環境模型訓練。
2)即使不幸學習率設置得很大,那么也能通過warmup機制看到合適的學習率區間(即訓練誤差先降后升的關鍵位置附近),以便后續驗證。
原文:https://blog.csdn.net/pipisorry/article/details/109192443