本文へスキップ
BecomeCoder

PyTorchコース · 第1章 AIはどうやって「学ぶ」のか · レッスン3

誤差を減らす方向 ― 勾配降下法の直感

ブラウザで完結

導入

損失を測れるようになりました。次の問題は「では、どちらにパラメータを動かせば損失が減るのか?」です。その答えを教えてくれるのが 勾配(gradient) であり、それを使う手法が 勾配降下法(gradient descent) です。

説明

損失を、パラメータを横軸にしたグラフとして想像してください。谷底が「損失が最小の場所」です。あなたは霧の中でこの谷を降りたい登山者です。足元の**傾き(勾配)**を調べ、下り坂の向きへ一歩進む。これを繰り返せば、いつか谷底に着きます。これが勾配降下法です。

flowchart TD
  a["現在のパラメータ"] --> b["勾配を計算<br/>(損失が増える向き)"]
  b --> c["勾配の逆向きへ一歩<br/>param = param − lr × 勾配"]
  c --> d{損失は十分<br/>小さい?}
  d -- いいえ --> a
  d -- はい --> e["学習終了"]

一歩の大きさを決めるのが 学習率(learning rate, lr) です。大きすぎると谷を飛び越えて発散し、小さすぎるとなかなか谷底に着きません。

やってみよう

いちばん簡単な例で勾配降下法を動かします。損失を L(w) = (w - 3)**2 とすると、これは w = 3 で最小(谷底)になる放物線です。勾配は微分して 2*(w - 3)。下のコードは w を適当な値から出発させ、勾配降下法で谷底 3 に近づけていきます。実行して、w が 3 に吸い寄せられる様子を見てください。

import numpy as np

w = 10.0        # 適当な出発点
lr = 0.1        # 学習率(一歩の大きさ)

for step in range(30):
    grad = 2 * (w - 3)      # 損失 (w-3)^2 の勾配
    w = w - lr * grad       # 下り坂の向きへ一歩
    if step % 5 == 0:
        loss = (w - 3) ** 2
        print(f"step {step:2d}:  w = {w:.4f}   loss = {loss:.6f}")

print("最終的な w:", round(w, 4), "(正解は 3)")

演習

学習率 lr0.010.51.1 に変えて実行し、収束の速さや挙動の違いを観察しましょう。特に 1.1 のときに何が起きるかに注目してください。

ヒント1を見る

lr が小さい(0.01)と、30ステップでは谷底に届きません。一歩が小さすぎるためです。

ヒント2を見る

lr = 1.1 は「行き過ぎ」て損失がどんどん増える(発散)はずです。学習率は大きすぎても小さすぎてもダメ、という感覚を掴みましょう。

まとめ

  • 勾配は「損失が最も増える向き」。その逆向きへ進めば損失は減る。
  • 勾配降下法param = param − lr × 勾配繰り返してパラメータを更新する。
  • 学習率(lr) が一歩の大きさ。大きすぎると発散、小さすぎると遅い。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。