日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

通俗理解深度学习梯度累加(Gradient Accumulation)的原理

發布時間:2023/12/8 pytorch 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通俗理解深度学习梯度累加(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)的原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。