Gradient Accumulation 梯度累加 (Pytorch)
? ? ? ? 我們在訓練神經網絡的時候,batch_size的大小會對最終的模型效果產生很大的影響。一定條件下,batch_size設置的越大,模型就會越穩定。batch_size的值通常設置在 8-32 之間,但是當我們做一些計算量需求大的任務(例如語義分割、GAN等)或者輸入圖片尺寸太大的時候,我們的batch size往往只能設置為2或者4,否則就會出現 “CUDA OUT OF MEMORY” 的不可抗力報錯。
? ? ? 那么如何在有限的計算資源的條件下,訓練時采用更大的batch size呢?這就是梯度累加(Gradient Accumulation)技術了。
常規訓練過程
for i, (inputs, labels) in enumerate(trainloader):optimizer.zero_grad() # 梯度清零outputs = net(inputs) # 正向傳播loss = criterion(outputs, labels) # 計算損失loss.backward() # 反向傳播,計算梯度optimizer.step() # 更新參數if (i+1) % evaluation_steps == 0:evaluate_model()使用梯度累加的訓練過程
for i, (inputs, labels) in enumerate(trainloader):outputs = net(inputs) # 正向傳播loss = criterion(outputs, labels) # 計算損失函數loss = loss / accumulation_steps # 損失標準化loss.backward() # 反向傳播,計算梯度if (i+1) % accumulation_steps == 0:optimizer.step() # 更新參數optimizer.zero_grad() # 梯度清零if (i+1) % evaluation_steps == 0:evaluate_model()就是加了個if
注意這里的loss每次要除以accumulation_step,所以當累加到一定步數optimizer更新的值其實是這些累加值的均值。其實就相當于擴大了batch_size,讓更新的loss更加平穩。一個batch的數據最后算的loss也是這個batch的數據個數的均值。
??總結來講,梯度累加就是每計算一個batch的梯度,不進行清零,而是做梯度的累加(平均),當累加到一定的次數之后,再更新網絡參數,然后將梯度清零。
? 通過這種參數延遲更新的手段,可以實現與采用大batch_size相近的效果。知乎上有人說
"在平時的實驗過程中,我一般會采用梯度累加技術,大多數情況下,采用梯度累加訓練的模型效果,要比采用小batch_size訓練的模型效果要好很多"。
總結
以上是生活随笔為你收集整理的Gradient Accumulation 梯度累加 (Pytorch)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 通俗理解深度学习梯度累加(Gradien
- 下一篇: [换根] Accumulation De
