目次
📌 Autograd(自動微分)とは?
Autograd(Automatic Differentiation, 自動微分) は、PyTorch の強力な機能の一つで、微分(勾配)を自動で計算 できるシステムです。機械学習の最適化では、誤差関数の微分(勾配)を計算してパラメータを更新 することが重要です。Autograd を使うと、勾配を手計算せずに自動で求める ことができます。
✔ Autograd の特徴
- 計算の記録
requires_grad=True
を設定した Tensor の計算は、計算グラフ として記録される。 - 自動で微分を計算
.backward()
を呼び出すと、計算グラフをたどって勾配を求める。 - 勾配は
.grad
に格納される
Tensor の.grad
属性で、求めた勾配を取得できる。
📌 .backward()
とは?
backward()
は、計算グラフを逆伝播(バックプロパゲーション)して、微分を計算 するメソッドです。
勾配を求めたい関数に対して .backward()
を呼び出すことで、その変数の微分を計算できます。
✔ .backward()
の仕組み
requires_grad=True
の Tensor に対して計算を行う。- PyTorch は 計算グラフ を作成し、演算を記録する。
.backward()
を呼び出すと、計算グラフを逆方向にたどり、各変数の微分を求める。
📌 Autograd の具体的な例
例1:シンプルな微分
関数 の微分を求める。
import torch
# x を定義(requires_grad=True を設定)
x = torch.tensor(2.0, requires_grad=True)
# 関数 y = x^2 + 3x + 1
y = x**2 + 3*x + 1
# 自動微分(dy/dx を計算)
y.backward()
# x に関する勾配を取得
print(x.grad)
📌 計算の流れ
結果
微分 の値は 7 となる。
※ 2 の場合、傾き(変化率)は 7 である
例2:勾配降下法(Gradient Descent)
勾配降下法(Gradient Descent) は、関数の最小値を見つけるための最適化手法 です。
特に、機械学習のモデル学習において、誤差(損失)を最小化するために使用 されます。
関数 の最小値を求める。
import torch
# パラメータ x を定義(最適化対象)
x = torch.tensor(5.0, requires_grad=True)
# 学習率(step size)
lr = 0.1
# 勾配降下法の実装
for i in range(10): # 10回更新
y = x**2 + 3*x + 1 # 関数の定義
y.backward() # 自動微分で dy/dx を計算
print(f"Step {i+1}: x = {x.item()}, 勾配 = {x.grad.item()}")
# 勾配を使って x を更新(勾配降下法)
x.data -= lr * x.grad
# 勾配をリセット(次のループのため)
x.grad.zero_()
📌 結果
ステップ | x の値 | 勾配 |
---|---|---|
Step 1 | 5.0 | 13.0 |
Step 2 | 3.7 | 10.4 |
Step 3 | 2.66 | 8.32 |
Step 4 | 1.828 | 6.656 |
Step 5 | 1.162 | 5.328 |
Step 6 | 0.629 | 4.262 |
Step 7 | 0.202 | 3.409 |
Step 8 | -0.139 | 2.727 |
Step 9 | -0.412 | 2.182 |
Step 10 | -0.63 | 1.746 |
学習が進むにつれて、x
の値が小さくなり、勾配も小さくなっているのが分かります。
これは、関数の最小値に近づいていることを意味します。
🔹 .grad.zero_()
の重要性
backward()
を繰り返し呼び出すと、勾配が累積されてしまう ため、都度 .grad.zero_()
でリセットする必要があります。
📌 エラーになる例
for i in range(3):
y = x**2 + 3*x + 1
y.backward()
print(x.grad) # 2回目以降、勾配が累積される!
📌 正しい方法
for i in range(3):
y = x**2 + 3*x + 1
y.backward()
print(x.grad)
x.grad.zero_() # 勾配をリセット
✅ まとめ
概念 | 説明 |
---|---|
Autograd(自動微分) | PyTorch の自動微分機能 |
.backward() | 計算グラフを逆方向にたどり、勾配を求める |
.grad | 変数の勾配を取得する |
.grad.zero_() | 勾配をリセットする(累積を防ぐ) |
📌 まとめ
- Autograd(自動微分) は、PyTorch で勾配(微分)を自動計算するシステム
.backward()
を使うと計算グラフを逆伝播し、勾配が求められる.grad
を参照すると勾配を取得できる- 勾配降下法(Gradient Descent)で最適化のステップを実装可能
.grad.zero_()
を使わないと、勾配が累積するので注意
Autograd と .backward()
の役割が明確 になり、機械学習における最適化処理の基礎 を理解する為の記事です。