通俗理解深度学习梯度累加(Gradient Accumulation)的原理
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                通俗理解深度学习梯度累加(Gradient Accumulation)的原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                首先你得明白什么是梯度,可以看我之前寫的一篇博客 :
微分與梯度的概念理解
本質上,梯度是一種方向導數,是一個矢量,因此這里的梯度累加并不是簡單的相加,而是類似于初高中物理學的力的合成,梯度作為一種方向導數(矢量)的其累加的效果就是將各個小的梯度合成為一個指向Loss function 最終優化方向的梯度。
這里結合代碼理解一下:
正常訓練的過程
for i, (images, labels) in enumerate(train_data):# 1. forwared 前向計算outputs = model(images)loss = criterion(outputs, labels)# 2. backward 反向傳播計算梯度optimizer.zero_grad()loss.backward()optimizer.step()梯度累加的訓練過程
# 梯度累加參數 accumulation_steps = 4for i, (images, labels) in enumerate(train_data):# 1. forwared 前向計算outputs = model(imgaes)loss = criterion(outputs, labels)# 2.1 loss regularization loss正則化loss += loss / accumulation_steps# 2.2 backward propagation 反向傳播計算梯度loss.backward()# 3. update parameters of netif ((i+1) % accumulation)==0:# optimizer the netoptimizer.step()optimizer.zero_grad() # reset grdient以上代碼來自:
https://www.zhihu.com/question/435093513/answer/2302992975
可以看出,梯度累加的訓練過程中,每次反向傳播都會計算出一個梯度,但是并不會使用optimizer.step() 更新參數,直到達到設定的累計次數后,才一次性的將參數依據累積的梯度進行更新。(殊途同歸,每次計算出來的梯度可以看作是一個具有微弱方向變化的矢量,不斷疊加,最終合成一個具有特定方向的矢量。每次變化一點點,和將每次一點點的變化累積起來形成一個最終的變化方向,這在效果上是沒有太大差異的),梯度累積可以實現和使用大的Batch Size 接近的效果,但是消耗的GPU顯存卻不會顯著增加,這在GPU顯存有限的情況下,是一種較為不錯的訓練方法。
總結
以上是生活随笔為你收集整理的通俗理解深度学习梯度累加(Gradient Accumulation)的原理的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Accumulation Degree
- 下一篇: Gradient Accumulatio
