自動微分(Autograd)

📌 Autograd(自動微分)とは?

Autograd(Automatic Differentiation, 自動微分) は、PyTorch の強力な機能の一つで、微分(勾配)を自動で計算 できるシステムです。機械学習の最適化では、誤差関数の微分(勾配)を計算してパラメータを更新 することが重要です。Autograd を使うと、勾配を手計算せずに自動で求める ことができます。

✔ Autograd の特徴

  1. 計算の記録
    requires_grad=True を設定した Tensor の計算は、計算グラフ として記録される。
  2. 自動で微分を計算
    .backward() を呼び出すと、計算グラフをたどって勾配を求める。
  3. 勾配は .grad に格納される
    Tensor の .grad 属性で、求めた勾配を取得できる。

📌 .backward() とは?

backward() は、計算グラフを逆伝播(バックプロパゲーション)して、微分を計算 するメソッドです。
勾配を求めたい関数に対して .backward() を呼び出すことで、その変数の微分を計算できます。

.backward() の仕組み

  1. requires_grad=True の Tensor に対して計算を行う。
  2. PyTorch は 計算グラフ を作成し、演算を記録する。
  3. .backward() を呼び出すと、計算グラフを逆方向にたどり、各変数の微分を求める

📌 Autograd の具体的な例

例1:シンプルな微分


関数  y = x^2 + 3x + 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)

📌 計算の流れ


 y = x^2 + 3x + 1


 \frac{dy}{dx} = 2x + 3


 \text{(x=2 のとき)} \quad \frac{dy}{dx} = 2(2) + 3 = 7


結果

微分  \frac{dy}{dx} の値は 7 となる。

※ 2 の場合、傾き(変化率)は 7 である



例2:勾配降下法(Gradient Descent)

勾配降下法(Gradient Descent) は、関数の最小値を見つけるための最適化手法 です。
特に、機械学習のモデル学習において、誤差(損失)を最小化するために使用 されます。


関数  y = x^2 + 3x + 1 の最小値を求める。


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 15.013.0
Step 23.710.4
Step 32.668.32
Step 41.8286.656
Step 51.1625.328
Step 60.6294.262
Step 70.2023.409
Step 8-0.1392.727
Step 9-0.4122.182
Step 10-0.631.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() の役割が明確 になり、機械学習における最適化処理の基礎 を理解する為の記事です。