導入
損失を測れるようになりました。次の問題は「では、どちらにパラメータを動かせば損失が減るのか?」です。その答えを教えてくれるのが 勾配(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)")
演習
学習率 lr を 0.01、0.5、1.1 に変えて実行し、収束の速さや挙動の違いを観察しましょう。特に 1.1 のときに何が起きるかに注目してください。
ヒント1を見る
lr が小さい(0.01)と、30ステップでは谷底に届きません。一歩が小さすぎるためです。
ヒント2を見る
lr = 1.1 は「行き過ぎ」て損失がどんどん増える(発散)はずです。学習率は大きすぎても小さすぎてもダメ、という感覚を掴みましょう。
まとめ
- 勾配は「損失が最も増える向き」。その逆向きへ進めば損失は減る。
- 勾配降下法:
param = param − lr × 勾配を繰り返してパラメータを更新する。 - 学習率(lr) が一歩の大きさ。大きすぎると発散、小さすぎると遅い。