前章の最後で、こう述べた。「AIの学習とは、行列 の中身をうまく調整すること」だと。だがどうやって、数百万個もの数値を正しい方向へ調整するのか。人間が手で決めるのは不可能だ。
その答えが、この章の主役——勾配降下法(Gradient Descent)だ。これは、現代のほぼすべての機械学習を支える「学習の心臓部」であり、その発想は驚くほど素朴だ。「誤差」という名の山を、一歩ずつ下って、谷底(最も誤差の小さい状態)を目指す。 この旅を、微分という道具から解いていこう。
学習とは「誤差を減らす」こと — 歴史の必然
まず、「賢くなる」を数学の言葉に翻訳しよう。AIの予測が正解からどれだけズレているか——これを誤差(損失, loss)と呼ぶ。たとえば、予測値と正解の差を二乗して平均する(平均二乗誤差):
この損失 は、モデルのパラメータ(第17章の や )を変えると変化する。損失が小さいほど、予測は正確だ。つまり学習の目標はただ一つ:
損失 を最小にするパラメータを見つけること。
これは数学的には最適化問題だ。パラメータという無数のツマミを回して、損失という値を最小化する。だが、ツマミは数百万個ある。総当たりは不可能だ。ではどうするか。ここで微分が、進むべき方向を教えてくれる。
厨房のアナロジー — 味を目標に近づける火加減
スープの味を、目標の一点に合わせる作業を思い浮かべてほしい。今は少し塩気が足りない。あなたは塩をひとつまみ足し、味見する。近づいた。もうひとつまみ。近づきすぎた——今度は少し戻す。「目標とのズレ(誤差)を見て、ツマミ(塩の量)を少しずつ調整する」。これを繰り返して、目標の味に収束させる。
私が飲食店で味を決めるとき、まさにこれをやっていた。一度に大量の塩を入れる(大きすぎる調整)と行き過ぎて台無しになる。逆に微量すぎる(小さすぎる調整)と、いつまでも目標に届かない。「ズレの向きと大きさを見て、適切な幅で調整する」——この職人の勘こそ、勾配降下法そのものだ。AIは、この味見と微調整を、数百万のツマミに対して、超高速で繰り返している。
微分 — 「その点での傾き」
調整の「向きと大きさ」を数学的に与えるのが微分だ。微分とは、ある点で関数がどちらへ、どれだけ傾いているか——坂の勾配を表す。
難しく見えるが、意味は単純だ。「 を少し増やしたら、 はどう変わるか」の比率。
- 微分が正()→ を増やすと が増える → 減らすには を減らすべき
- 微分が負()→ を増やすと が減る → 減らすには を増やすべき
損失 L
│╲ ╱ ← ここは傾き正(下るには左=wを減らす)
│ ╲ ╱
│ ╲ 傾き負 ╱
│ ╲(下るには右) ╱
│ ╲___________╱
│ ↑ 谷底(最小)= 傾き0
└──────────────────────── w(パラメータ)
各点で傾き(微分)を調べ、傾きと逆向きに動けば、必ず谷底へ近づく
決定的な洞察はこれだ。「損失を減らしたければ、微分(傾き)と逆向きに、パラメータを動かせばいい」。坂を下るには、傾いている方向と逆——低い方へ足を進める。これが勾配降下法の核心だ。
偏微分と勾配 — 多次元の坂を下る
現実のモデルのパラメータは1個ではない。数百万個だ。この場合、「 以外を固定して、 だけ動かしたときの傾き」を調べる。これが偏微分だ。
そして、全パラメータの偏微分を並べたベクトルを勾配(gradient) と呼ぶ:
勾配には美しい性質がある。勾配ベクトルは、損失が最も急に増加する方向を指す。ならば、その逆向きこそ、損失が最も急に減少する方向——最短の下り坂だ。
霧の中の下山
イメージはこうだ。あなたは濃霧の山中にいて、谷底(最小値)を目指したい。全体は見えないが、足元の地面の傾きだけは分かる。ならば戦略は明快だ。足元で最も急な下り方向へ、一歩進む。また傾きを調べ、一歩進む。これを繰り返せば、いつか谷底に着く。勾配降下法は、まさにこの「霧の中の下山」だ。全体像(最適解)が見えなくても、足元の勾配だけを頼りに、着実に最小へ向かう。
勾配降下法とは、この更新式のこと
以上をまとめると、パラメータの更新式は驚くほど単純になる。現在のパラメータから、勾配の逆向きに、少しだけ動かす:
ここで (イータ)は学習率(learning rate)——「一歩の大きさ」だ。マイナス符号が「傾きと逆向き(下り方向)に進む」ことを表す。この一行を、全パラメータに対して、何万回も繰り返す。それだけで、AIは賢くなっていく。
import numpy as np
# 例: L(w) = (w - 3)^2 を最小化する(答えは w=3 で L=0)
def loss(w): return (w - 3) ** 2
def gradient(w): return 2 * (w - 3) # L の微分(傾き)
w = 0.0 # 適当な初期値からスタート
lr = 0.1 # 学習率(一歩の大きさ)
for step in range(30):
grad = gradient(w) # 今いる場所の傾きを調べる
w = w - lr * grad # 傾きと逆向きに一歩進む ← 勾配降下法の核心
if step % 5 == 0:
print(f"step {step:2d}: w={w:.4f}, loss={loss(w):.6f}")
# w は 3 へ、loss は 0 へ収束していく = 谷底に到達
このコードを走らせると、w が初期値 0 から目標の 3 へ、loss が 0 へと吸い寄せられていく。これがAIの「学習」の、最も純粋な姿だ。第19章では、これをニューラルネットに適用する。
学習率という「一歩の幅」
学習率 の設定は、味付けの「一つまみの量」と同じで、繊細なさじ加減が要る。
- 学習率が大きすぎる: 一歩が大きすぎて谷底を飛び越え、反対側の斜面へ。行ったり来たりで収束しない(発散する)。塩を一度に入れすぎて味が振動するのと同じ。
- 学習率が小さすぎる: 一歩が小さすぎて、谷底に着くのに膨大な時間がかかる。微量すぎる塩で永遠に味が決まらない。
学習率が大きすぎる 学習率が適切 学習率が小さすぎる
╲ ╱╲ ╱ ╲ ╱ ╲ ╱
╲ ╱ ╲ ╱ ╲ ↓一歩 ╱ ╲ ······· ╱
╲╱ ╲╱ ╲______╱ ╲________╱
飛び越えて発散 スッと谷底へ 遅々として進まない
適切な学習率を見つけるのは、機械学習の実務で最も基本的なチューニングだ。実際には、最初は大きく、徐々に小さくする「学習率スケジューリング」や、パラメータごとに自動調整する Adam などの改良手法が使われる。だが根っこは、すべてこの「傾きと逆向きに、適切な幅で進む」という一点にある。
局所解という落とし穴
現実の損失の地形は、なだらかな一つの谷ではなく、いくつもの窪みがある複雑な地形だ。勾配降下法は「足元の傾き」しか見ないため、本当の最深部(大域的最小)ではなく、途中の小さな窪み(局所的最小)で止まってしまうことがある。霧の中の下山者が、小さな水たまりを谷底と勘違いするようなものだ。この問題への対処(確率的な揺らぎを与える、など)も、現代の学習手法の重要なテーマになっている。
まとめ — 「おまじない」の消し方
- 学習=誤差の最小化:予測と正解のズレ(損失 )を、最小にするパラメータを探す最適化問題
- 微分は坂の傾き:「パラメータを増やすと損失がどう変わるか」を表す。逆向きに動けば損失は減る
- 勾配は最急降下の方向:全パラメータの偏微分を並べたベクトル。その逆向きが最短の下り坂
- 更新式が学習の心臓: を繰り返すだけで、AIは賢くなる
- 学習率が命:大きすぎれば発散、小さすぎれば遅い。味付けの「一つまみ」と同じさじ加減
「AIが学習するとは何をしているのか」——その答えは、誤差の山を、傾きだけを頼りに一歩ずつ下る旅だった。これでPart 6——AIを支えるハードと数学の基盤——を一巡した。
ついに役者は揃った。データを表すベクトル(第17章)、それを変換する行列(第17章)、そして正しく調整する勾配降下法(本章)。次のPart 7では、これらを組み上げて、自分の手でニューラルネットを動かす。AIの「知能」が生まれる瞬間へ。
「賢さとは、一足飛びに答えに至る才能ではない。今いる場所の傾きを正しく読み、正しい方向へ、地道に一歩を刻み続ける営みだ。AIも、そして人も、そうやって少しずつ谷を下っていく。」