ゼロから学ぶ勾配降下法 — 学習の幾何学
「学習する」モデルは、全体を見渡せない曲面の上を、坂を下るように歩いている。この記事はその1枚の絵から勾配降下法を組み立てる——損失曲面、最急上昇方向としての勾配、更新則 w ← w − η∇L。そのうえで、学習率になぜ超えてはいけない上限があるのか、なぜ谷が「峡谷」型だとジグザグするのか、高次元で局所最適が本当はどれだけの脅威なのかまでを解き明かす。
要点
- 損失はパラメータを受け取り、モデルのダメさを表す1つの数を返し、学習はその損失の低い谷を探す。
- 勾配は最急上昇の方向を指すので、更新則はと逆向きに踏み出す。
- 単純な椀型の損失では、(は曲率)のときだけがゼロに縮む。
- 峡谷では勾配が谷を横切る向きを指すためジグザグになり、モメンタムは最近の勾配の移動平均で踏み出す。
- 高次元では停留点の多くは局所最適ではなく鞍点で、鞍点には下り方向の逃げ道がある。
An overview of gradient descent optimization algorithms
一次資料 — この記事の根拠
この解説の公開 2026-09-13
An overview of gradient descent optimization algorithmsarXiv:1609.04747論文ページ·PDFConvex OptimizationBoyd & Vandenberghe 2004論文ページ
学習とは、霧の中で坂を下ること
「学習する」モデルはほとんどの場合、内側で1つのことをしています——パラメータを調整して、ある「間違いの数字」を小さくすること。その間違いの数字が損失、記号では です。モデルのパラメータ (何十億個あるかもしれません)を受け取り、いまモデルがどれくらいダメかを表す1つの数を返します。
損失を風景だと思ってください。パラメータのあらゆる設定が地面のどこかの地点に対応し、その地点の「標高」がそこでの損失です。学習とは、いちばん低い谷を探す旅です。やっかいなのは、風景の全体を見渡せないこと——パラメータが10億個あれば、誰にも全体像は見えません。感じ取れるのは足元の傾きだけ。勾配降下法は、霧の中で道に迷った登山者の戦略です——どちらが下り坂かを感じ、一歩踏み出し、また感じ、を繰り返す。この記事はその考えをいつもの順序で積み上げます——絵、直感、更新則を1項ずつ分解、コード。そして実際に現場でつまずく2つのこと——学習率を高くしすぎた場合と、谷が峡谷の形をしている場合——へと話を進めます。
勾配: まっすぐ上り坂を指すコンパス
傾きを教えてくれる道具が勾配、記号では です。多変数の関数に対して、勾配はその偏微分を並べたもの——パラメータ1つにつき1つの数で、そのパラメータだけをわずかに動かし、残りを固定したときに損失がどれだけ変わるかを表します。
文として読むと、こうです。パラメータを1つずつ順に取り上げ、「このつまみだけを押したら損失はどれくらい速く上がるか?」への答えを求め、その答えをベクトルに積み上げる。このベクトルについて最も大事な事実はその向きです。勾配は最急上昇の方向を指します——損失が最も速く登っていくコンパスの方位——そしてその長さは、その登りの急さです。
なぜ最急「上昇」で「下降」ではないのか? ある単位方向 にほんの少し動いたときの損失の変化率は、内積 です。内積は2つのベクトルが揃うときに最大になるので、最も速い増加は そのものの方向。だから最も速く下るには、ちょうど反対の方向 に歩けばよい。このマイナス記号こそが、勾配降下法という考えの全部を1文字で表したものです。
更新則: たった1行を分解する
登山者が何度も何度も従う規則がこれです。
1つずつ見ていきます。 は現在のパラメータ——いま立っている場所。 はそこでの勾配——上り坂のコンパス。前にマイナスを付けた は、それを下り坂向きにひっくり返したもの。そして (ギリシャ文字のイータ)が学習率——その下り方向に、どれくらい大きな一歩を踏むかを決める小さな正の数です。矢印 は「右辺を計算してから、 をその値で上書きする」という意味。これをやれば、損失の低いほうへ1歩進んだことになります。
これでアルゴリズムは全部です。最適化におけるそれ以外のもの——モメンタム、Adam、学習率スケジュール——は、この1行の改良版にすぎません。これを十分な回数くり返せば、素直な曲面の上では谷底へと滑り落ちていきます。谷底では地面が平らで、勾配はゼロ、更新はもう動かなくなる—— なら なので、停留点にたどり着いたわけです。
学習率には超えてはいけない天井がある
学習率 は、学習全体でいちばん影響の大きいダイヤルで、正反対の2通りの形で失敗します。
小さすぎると、一歩ごとがおずおずとしたすり足になります。確かに下り坂は下っていくのですが、どこかへたどり着くのに途方もない回数が必要になる——1時間で終わる学習が1週間かかったり、谷底のはるか手前、ほとんど平らな区間で止まってしまったりします。
大きすぎると、一歩ごとに谷底を飛び越えて、出発点より向こう側の斜面の高い位置に着地します。次の一歩はもっとひどく反対側へ飛び越える。損失は下がらないどころか登っていき、やがて無限大や NaN へと発散します。これは漠然としたリスクではなく、正確なしきい値があります。単純な椀型の損失 では、更新は となり、これが をゼロに縮めるのは のときだけ——すなわち
のときだけです。量 は曲率——椀がどれだけ急に曲がっているか——です。つまり使える学習率の天井は、曲面の曲率で決まります。谷が鋭いほど、飛び出す前に踏める最大の一歩は小さくなる。 を超えれば、一歩ごとに必ず事態は悪化します。「損失が NaN になった」の10回に9回が、大きすぎる学習率なのはこのためです。
峡谷: 1つの学習率では勝てない場所
上の曲率は、椀が左右対称だったので1つの数で済みました。現実の損失曲面はそうではありません。よくある、そしてつらい形が峡谷(ravine)です——一方向には急な壁で、その長手方向にはほとんど平らな谷、峡谷の底のような形です。
この形は素の勾配降下法にとって罠です。峡谷の壁のどの点でも、勾配はほとんど峡谷を横切る向き(近い壁へ)を指し、峡谷に沿った向き(出口へ)はほとんど指さないからです。だから登山者は2つの急な壁のあいだを行ったり来たり跳ね返り、本当の最小値へ向かうなだらかな坂を、うんざりするほどゆっくりとしか進めません。急な方向は行き過ぎを避けるために小さな学習率を要求し、平らな方向は前進のために大きな学習率を欲しがる。1つのダイヤルで両方は満たせず、古典的なジグザグが生まれます。(最も鋭い曲率と最も平らな曲率の比——条件数——が、ジグザグのひどさそのものです。これを直すために前処理(プレコンディショナー)や2次法が存在します。続編のSGDの先へがそこを引き継ぎます。)
標準的な手当てがモメンタムです。毎回そのままの勾配で踏み出す代わりに、最近の勾配の移動平均を蓄えて、それで踏み出す。左右への跳ね返りは符号が反転しつづけるので打ち消し合い、峡谷を下る一定の成分は積み上がっていく——ガタつきをならして下り坂を転がりつづける、重いボールのようなものです。
局所最適、鞍点、そしてなぜ深さは効くのか
停留点()が、必ずしも世界の底とは限りません。それは局所最適——すぐ近所ではいちばん低いが、どこか別の場所のもっと深い谷より高い点——かもしれないし、唯一の大域最適——本当のいちばん低い点——かもしれません。勾配降下法は局所の傾きしか感じられないので、原理的には局所最適に落ち着いて止まり、尾根の向こうにもっとよい谷があったことに気づかないまま、ということが起こりえます。
何十年ものあいだ、これがニューラルネット学習についての標準的な恐れでした。現代の理解はもっと安心できるもので、それは高次元をめぐる物語です。数百万パラメータの空間では、停留点が局所最適であるのは、曲面がその方向すべてで同時に上向きに曲がっているときだけ——そんなことが偶然に起こる確率は天文学的に低い。はるかに多いのは鞍点(saddle point)です——ある方向には上に曲がり、別の方向には下に曲がる、中心が平らな、峠や馬の鞍のような点。鞍点には逃げ道があります——下り方向がまだ存在する——ので、少しのノイズがあれば最適化はそこを滑り落ちて先へ進みます。経験的には、深いネットが実際にたどり着く多くの最小値はどれも同じくらい良い傾向があり、これが、損失が証明可能なほど非凸であるにもかかわらず巨大モデルの学習がそもそも成り立つ大きな理由です。この意外さを風景の視点から見たものが凸性と最適化にあります。
コードで見る
アルゴリズム全体は短いループです。ここでは素の2次の椀 (勾配は )を最小化しています。
import numpy as np
def loss(w): return w**2
def grad(w): return 2 * w # L = w^2 の dL/dw
w = 5.0 # 最小値 w = 0 から遠い地点から開始
eta = 0.1 # 学習率
for step in range(20):
g = grad(w)
w = w - eta * g # w ← w − η∇L
print(f"step {step:2d}: w = {w:+.4f} loss = {loss(w):.4f}")
走らせると は着実に0へ向かって進みます。次に1行だけ変えて、2つの失敗モードが合図どおりに現れるのを見てみましょう。eta = 0.001 にすると はのろのろ——20ステップたってもほとんど動きません。eta = 1.1 にすると、ここでの曲率は なので天井は 、つまり限界オーバー。 は縮むどころか毎ステップ大きくなり、無限大へ突っ走ります。数式が示すしきい値は提案ではありません。コードはそれをぴたりと踏み抜きます。
現場ではこう出てくる
勾配降下法を手で呼び出すことはまずありません——PyTorchなら loss.backward() と optimizer.step() が代わりにやってくれます。あなたが実際に時間を使うのは学習率のほうで、それがこの記事がずっと回ってきたパラメータだからです。
学習率のチューニングは、毎回いちばん最初の一手です。 最初の数ステップで損失が NaN に発散したら、学習率が曲率の天井を超えています——ほかを触る前にまず3〜10倍下げる。損失は下がるが氷河のように遅いなら、小さすぎ。正しい桁を見つける定番の道具が LRレンジテストです——数百ステップにわたって学習率を上げていき、損失を学習率に対してプロットする。良い値は、損失が上向きに転じる点のすぐ手前にあります。
ウォームアップとスケジュールは峡谷対策です。 実際の学習で固定の を使うことはまずありません。ウォームアップは最初の数百ステップでゼロ付近から を上げていきます。序盤はパラメータがどの谷からも遠く、曲率が油断ならないからです。そのあと減衰スケジュール(コサインや線形)が、底に近づくにつれて を縮めます——序盤の大きな一歩で前進し、終盤の小さな一歩で跳ね返らずに落ち着くように。
勾配クリッピングは天井へのガードレールです。 1つのバッチが桁外れに大きい勾配を出したとき——言語モデルではよくあります——普通の一歩はあなたを谷から打ち上げてしまう。クリッピングは更新の前に勾配の長さに上限をかけます。clip_grad_norm_ がまともな学習ループのほぼすべてに入っているのはこのためです。
「確率的(stochastic)」は略語に隠れた単語です。 実際にはデータセット全体で勾配を計算することはなく(高すぎる)、小さなミニバッチから推定します。そのため各勾配は真の勾配のノイズ入り近似になる——これが確率的勾配降下法(SGD)です。このノイズは単なるコストではありません。鞍点から、そして汎化の悪い鋭く狭い最小値から最適化を揺さぶり出す、まさにそのゆらぎなのです。
まとめ
- 学習とは、局所しか感じ取れない損失曲面を下ること。勾配 がコンパスで、最急上昇の方向を指す
- 手法全体はたった1行 ——勾配と反対に、学習率 でスケールして踏み出す
- 学習率には曲率が決める超えてはいけない天井がある(2次では )——超えれば損失は発散し、遠く下回れば学習はのろのろ
- 峡谷は素の勾配降下法にジグザグを強いる。モメンタムが標準的な治療法
- 高次元での本当の障害は局所最適ではなく鞍点——これが、非凸な損失にもかかわらず深いネットの学習がうまくいく大きな理由
勾配の下にある微積分があやしいと感じたら、まずAIのための微積分から。この1行がAdam、モメンタム、2次法へと育っていく先を見るには、SGDの先へへ進んでください。
コメント
コメントにはログインが必要です