[解決済み】PyTorchでzero_grad()を呼び出す必要があるのはなぜ?
2022-04-06 15:07:46
質問
方法
zero_grad()
はトレーニング中に呼び出される必要があります。しかし
ドキュメント
はあまり参考にならない
| zero_grad(self)
| Sets gradients of all model parameters to zero.
なぜ、このメソッドを呼び出す必要があるのでしょうか?
どのように解決するのですか?
で
PyTorch
の間、ミニバッチごとに
トレーニング
フェーズでは、バックプロパゲーションを開始する前に明示的に勾配をゼロに設定したいものです(つまり、勾配をゼロにするために
W
エイト
と
b
ケース
) なぜならPyTorchは
はグラデーションを蓄積します。
を、その後のバックワードパスで使用します。この蓄積動作は、RNNの学習時や、複数の
ミニバッチ
. そのため、デフォルトのアクションは
グラデーションを累積する(=合計する
すべての
loss.backward()
を呼び出します。
このため、トレーニングループを開始するとき、理想的には、次のようにします。
zero out the gradients
で、パラメータの更新を正しく行うことができます。そうしないと、モデルパラメータの更新に使った古い勾配と、新しく計算した勾配を組み合わせた勾配になってしまうからです。そのため、この勾配は
最小
(または
最大
最大化目的の場合)。
ここで簡単な例を挙げます。
import torch
from torch.autograd import Variable
import torch.optim as optim
def linear_model(x, W, b):
return torch.matmul(x, W) + b
data, targets = ...
W = Variable(torch.randn(4, 3), requires_grad=True)
b = Variable(torch.randn(3), requires_grad=True)
optimizer = optim.Adam([W, b])
for sample, target in zip(data, targets):
# clear out the gradients of all Variables
# in this optimizer (i.e. W, b)
optimizer.zero_grad()
output = linear_model(sample, W, b)
loss = (output - target) ** 2
loss.backward()
optimizer.step()
あるいは、もしあなたが バニラグラディエントディセント であれば、です。
W = Variable(torch.randn(4, 3), requires_grad=True)
b = Variable(torch.randn(3), requires_grad=True)
for sample, target in zip(data, targets):
# clear out the gradients of Variables
# (i.e. W, b)
W.grad.data.zero_()
b.grad.data.zero_()
output = linear_model(sample, W, b)
loss = (output - target) ** 2
loss.backward()
W -= learning_rate * W.grad.data
b -= learning_rate * b.grad.data
備考 :
-
は
蓄積
(すなわち
合計
の場合、グラデーションが発生します。
.backward()
が呼び出されます。loss
テンソル . -
v1.7.0では、Pytorchは勾配をリセットするオプションを提供しており、勾配を
None
optimizer.zero_grad(set_to_none=True)
をゼロのテンソルで埋めないでください。ドキュメントによれば、この設定は必要なメモリを減らし、わずかにパフォーマンスを向上させるが、注意深く扱わなければエラーを起こしやすいかもしれないとのことである。
関連
-
PythonによるLeNetネットワークモデルの学習と予測
-
[解決済み] Pythonで、あるオブジェクトが反復可能かどうかを判断するにはどうしたらいいですか?
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] 自分」という言葉は何のためにあるのか?
-
[解決済み】Pythonの「private」メソッドは、なぜ実際にはprivateではないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python Decorator 練習問題
-
PicgoのイメージベッドツールをPythonで実装する
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
任意波形を生成してtxtで保存するためのPython実装
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき