勾配降下法:大規模言語モデルが「でたらめな予測」から文章生成を学ぶ仕組み

機械学習の背景がないプログラマーに向けて、大規模言語モデル(LLM)の学習で最も重要な概念の一つである勾配降下法を解説する。

本稿で扱うのは公開されている一般的な LLM 学習の原理であり、未公開のモデル構造、学習データ、学習レシピには触れない。

概要

LLM の学習を初めて学ぶと、パラメータ、損失関数、勾配、誤差逆伝播、勾配降下法、最適化器という抽象的な言葉が並ぶ。

これらをつなげると、言語モデル学習の中心は一文で表せる。

モデルに次の token を予測させ、どの程度間違えたかを計算し、次回は正解を予測しやすくなるよう内部パラメータを少しだけ修正する。

この処理を何度も繰り返すことで、モデルはほぼランダムな予測から始まり、言語、コード、学習テキスト中の多くの規則性を徐々に学ぶ。公開資料では、言語モデルの事前学習は前の token から次の token を予測する目的として説明され、学習は多数の内部数値パラメータを継続的に調整する過程として説明される。12

その「パラメータを次にどちらへ動かすべきか」を答える道具が、勾配降下法である。


目次


LLM を必要以上に神秘的に考えない

プログラマーの視点では、LLM は非常に複雑な関数として捉えられる。

入力 token の列
   大規模言語モデル
次 token の確率分布

簡略化すると次のように書ける。

$$ P(\text{次の token}) = f(\text{これまでの token}; \theta) $$

$\theta$ は学習によって変更できるすべてのパラメータを表す。巨大な浮動小数点配列だと考えてよい。

parameters = [
    0.0182,
    -0.7314,
    1.2057,
    # ...
]

これらは次のような人間が書いた規則ではない。

if user_asks_about_france:
    return "Paris"

言語能力は、多数のパラメータが一緒に計算へ参加した結果として現れる。学習の主な仕事はこの数値群を何度も調整することだ。OpenAI の公開説明でも、重みまたはパラメータはモデル内部の多数の数値であり、データ中に見つかる関係に応じて少しずつ調整されると説明されている。1

一つの数値だけを見て「何の知識を保存しているか」を言うのは難しい。しかし全体として働くと、複雑な能力を示せる。

LLM は学習中に何を解いているのか

学習文に次の文があるとする。

フランスの首都はパリである。

tokenizer がまず token 列へ変換する。説明のため、次のように分割されたと仮定する。

[フランス, の, 首都, は, パリ, 。]

実際の tokenizer は異なる。token は単語全体、単語の一部、漢字一字または複数字、句読点、頻出する文字列片などになり得る。

学習ではこの一文から次 token 予測問題が自動的に作られる。

見る:フランス                 予測:の
見る:フランス の              予測:首都
見る:フランス の 首都         予測:は
見る:フランス の 首都 は      予測:パリ

したがって、事前学習データでは文ごとに人が答えを書く必要は通常ない。後ろの token 自体が前の token に対する正解である。

実装では一つの token 列を一つずらす。

入力: [フランス, の, 首都, は]
正解: [の, 首都, は, パリ]

一回の forward pass で複数位置を同時に学習できる。GPT-4 Technical Report も事前学習目標を文書中の次 token の予測として記述している。2

モデルの出力は一語ではなく確率分布である

モデルが次を見たとする。

フランスの首都は

内部でただちに唯一の答え「パリ」を得るわけではない。まず語彙中の多数の候補にスコアを付け、それを確率分布へ変換する。以下は原理説明だけの仮の結果である。

パリ       10%
ロンドン    8%
東京        5%
都市        4%
北京        3%
その他     70%

学習データ上の正解は パリ だが、モデルは 10% しか与えていない。そこで予測の悪さを一つの数に圧縮する。その数が 損失(Loss) である。

損失関数:モデルの誤りに点数を付ける

言語モデルでは通常、交差エントロピー損失を使う。正解 token 一つについては、まず次のように理解できる。

$$ L = -\log p_{\text{correct}} $$

$p_{\text{correct}}$ は正解に対してモデルが与えた確率である。正解が パリ なら、1% しか与えなければ損失は大きく、80% なら小さい。

正解 token の確率が低い → Loss は大きい
正解 token の確率が高い → Loss は小さい

実際には batch 内の多くの token の損失を合計または平均する。PyTorch の最適化チュートリアルも、各学習ステップの誤差が減るようパラメータを繰り返し調整すると説明している。3

目標は次のように書ける。

$$ \min_{\theta} L(\theta) $$

では、多数のパラメータのどれを、増やすべきか減らすべきか。答えは 勾配 である。

勾配とは何か

実モデルを三つのパラメータだけを持つ玩具モデルへ縮小する。

w₁ = 0.5
w₂ = -0.8
w₃ = 1.2

Loss を計算した後、次を問う。

w₁ を少し増やすと Loss はどう変わるか?
w₂ を少し増やすと Loss はどう変わるか?
w₃ を少し増やすと Loss はどう変わるか?

数学的には偏微分である。

$$ \nabla L = \left[\frac{\partial L}{\partial w_1},\frac{\partial L}{\partial w_2},\frac{\partial L}{\partial w_3}\right] $$

例えば結果が次だとする。

∂L/∂w₁ = +0.7
∂L/∂w₂ = -0.2
∂L/∂w₃ = +0.05

これらをまとめたベクトルが勾配である。プログラマー向けに言えば、勾配は全パラメータに対する局所的な変更情報だ。現在位置の近くで各パラメータを微小に動かしたとき、Loss がどちらへ、どの程度変わる傾向にあるかを示す。

  • 勾配が正なら、パラメータを増やすと Loss は増える傾向があるため、減らすと Loss を下げやすい。
  • 勾配が負なら、パラメータを増やすと Loss は減る傾向があるため、増やすと Loss を下げやすい。

「勾配降下」の下降とはすべてのパラメータ値を下げることではなく、Loss を下げること である。一回の更新で減るパラメータも増えるパラメータもある。

勾配降下法:誤りを減らす方向へ進む

よく使われる比喩は、濃霧の中で山を下ることだ。

現在地              → 現在のモデルパラメータ
現在地の標高        → 現在の Loss
足元の傾き          → 勾配
一歩の距離          → 学習率
低い谷              → 低い Loss

勾配は現在位置近くで最も急に上がる方向を指す。したがって反対方向へ動けば通常は Loss が下がる。

勾配の方向      → 局所的な上り坂
負の勾配の方向  → 局所的な下り坂

最も基本的な更新式は次である。

$$ \theta_{t+1}=\theta_t-\eta\nabla L(\theta_t) $$

$\eta$ は学習率である。コード風に書けば次の通り。

parameters = parameters - learning_rate * gradients

これが勾配降下法の中心である。勾配が示す局所方向を使い、Loss を下げる傾向を持つ小さな更新を行う。深層学習では、学習問題を最適化問題に変え、勾配情報で損失を小さくするパラメータを探す。4

一つのパラメータで一回計算する

一つのパラメータ $w$ と、次の損失関数を考える。

$$ L(w)=(w-3)^2 $$

最小値は $w=3$ で、Loss は 0 になる。しかしモデルは最初から答えが 3 だと知らない。$w=0$ から始めるとする。

$$ L(0)=9 $$

微分は次である。

$$ \frac{dL}{dw}=2(w-3) $$

$w=0$ では勾配は $-6$。学習率が $0.1$ なら、

$$ w_{new}=0-0.1\times(-6)=0.6 $$

新しい損失は $5.76$ になり、9 から下がる。さらに繰り返すと、

0 → 0.6 → 1.08 → 1.464 → 1.7712 → … → 徐々に 3 へ近づく

モデルが突然「答えは 3 だ」と理解したのではない。現在位置の傾きを測り、下り方向へ少し歩き、新しい位置で再度傾きを測る、という繰り返しである。実際の LLM は高次元空間で膨大なパラメータを同時に調整するが、考え方は同じだ。

誤差逆伝播と勾配降下法は別物である

この二つは一緒に出るため混同しやすいが、役割は異なる。

Forward Pass:まず予測を行う

logits = model(input_tokens)

入力 token は各層を通り、各位置の候補 token のスコア logits を出力する。

損失関数:予測の悪さを判定する

loss = cross_entropy(logits, target_tokens)

予測と正解 token を比較して Loss を得る。

誤差逆伝播:各パラメータが Loss に与えた影響を計算する

loss.backward()

誤差逆伝播は最終 Loss から計算グラフを逆向きにたどり、連鎖律で全学習可能パラメータに対する勾配を計算する。PyTorch は autograd を計算グラフ上で勾配を自動計算する自動微分エンジンとして説明している。5

Optimizer Step:実際にパラメータを変更する

optimizer.step()

最適化器が勾配を読み、更新規則に従ってパラメータを変える。デバッグにたとえると、

Loss              → 結果が目標からどれだけずれたか
誤差逆伝播        → 各層の値がずれへどう影響したかを逆向きに計算
勾配              → 各パラメータへの局所変更情報
最適化器の更新    → その情報で実際にパラメータを変更

誤差逆伝播は勾配を 計算 し、勾配降下法などの最適化法が勾配を 使って更新 する。

最小の LLM 学習ループ

分散学習、混合精度、メモリ管理、勾配蓄積などを省けば、学習ループは次のように書ける。

for batch in training_data:
    # 前のステップに残った勾配を消す。
    optimizer.zero_grad()

    # Forward pass:各位置の次 token を予測する。
    logits = model(batch.input_tokens)

    # 予測と正解 token の差を計算する。
    loss = cross_entropy(logits, batch.target_tokens)

    # Backpropagation:全パラメータの勾配を計算する。
    loss.backward()

    # 最適化器が勾配に従ってパラメータを更新する。
    optimizer.step()

中心の循環は次である。

予測 → Loss 計算 → 勾配計算 → パラメータ更新

PyTorch の標準的な最適化手順も、勾配の初期化、逆伝播、最適化器による更新から成る。3 大規模学習では多くの加速器、通信、耐障害性、数値安定性が加わるが、土台はこの循環を高速かつ安定して繰り返すことだ。

なぜ mini-batch を使うのか

理論上は、毎回の更新前に訓練データ全体の平均勾配を計算できる。しかし大規模学習ではコストが高すぎる。

全訓練データを読む → 完全な平均勾配を計算 → 一回だけ更新

実際にはデータを mini-batch に分ける。

訓練データ
├── batch 1
├── batch 2
├── batch 3
├── batch 4
└── …

一回ごとに一つの batch で勾配を推定して更新する。これは全履歴を毎回読み直さず、一部のリクエスト標本からオンラインシステムの平均応答時間を推定することに似ている。全データの正確な平均ではないためノイズを含むが、はるかに低コストで多くの更新を行える。これが広い意味での確率的勾配降下法(SGD)である。4

厳密には単一サンプル更新と mini-batch 更新は異なるが、深層学習では訓練集合の一部から勾配を推定する方法を広く確率的勾配法と呼ぶことが多い。

学習率が一歩の大きさを決める

更新式の $\eta$ が学習率であり、霧の山を下るときの歩幅に相当する。

学習率が大きすぎる場合

一歩で谷底を飛び越えることがある。

左の斜面 → 最低点を越える → 右の斜面 → また飛び返す

Loss が大きく振動し、さらに増えて学習が発散することがある。

学習率が小さすぎる場合

一歩は慎重だが、学習が非常に遅い。

多数回の更新 → パラメータ変化は極小 → Loss の低下は遅い

そのため実際には最初は学習率を徐々に上げ、後半は下げるなどのスケジュールを用いる。最初は小さく試し、中盤で速く進み、良い領域へ近づいたら遅くする、と考えればよい。学習率は速度、安定性、最終品質へ直接影響する。

なぜ実際の学習には最適化器が必要か

最も素朴な SGD は次である。

parameter -= learning_rate * gradient

実モデルでは、パラメータごとに勾配の大きさ、ノイズ、過去の変化が異なる。現在の勾配だけで同じように動かすと、効率や安定性が不十分なことがある。そのため SGD with Momentum、Adam、AdamW などを使う。

通常の勾配降下法が足元の瞬間的な傾きだけを見るのに対し、Momentum は最近の方向も参照して局所ノイズによる左右の揺れを抑える。Adam は勾配の一階・二階モーメント推定を維持し、パラメータごとに更新スケールを適応させる。Adam の原論文はこれを適応的モーメント推定を用いる確率目的関数向けの一次最適化法と説明している。6

最適化器は勾配降下法の対立概念ではない。「勾配をどう使ってパラメータを更新するか」の具体的な改良である。

勾配を計算 → 勾配から更新を決める → 目的関数を下げようとする

モデルや学習段階ごとにレシピは異なり、商用モデルの完全な詳細は公開されないことが多い。GPT-4 Technical Report もモデル規模、ハードウェア、学習計算量、データ構築、具体的手法を完全には公開していない。2

次 token 予測が複雑な能力を生む理由

事前学習の課題は単純に見える。

前の token から後の token を予測する

しかし多様な文章で予測精度を上げ続けるには、モデルは多くの規則性を使わなければならない。

例えば次のコードを続けるには、

for item in items:

Python の文法、インデントとブロック構造、ループ本体の典型、変数名と文脈の関係を学ぶ必要がある。「HTTP 状態コード 404 は通常」を続けるには、技術文書中の HTTP に関する統計的規則性が必要になる。「最初の二条件が成立するため、従って」を続けるには、文脈中の条件、結論、推論形式を追う必要がある。

これらは if-else の規則として手で書き込まれるのではない。多数の学習例と多数の勾配更新により、パラメータ間の関係として徐々に符号化される。GPT-3 論文は自己回帰言語モデルの規模を拡大すると、翻訳、質問応答、穴埋め、一部の推論やドメイン適応を含む多様なタスクの few-shot 性能が大きく向上することを示した。7

ただし、言語課題で複雑な能力を示すことは、人間と同じ仕方で世界を理解していることを意味しない。どのような内部表現が形成されるかは、現在も研究課題である。

なぜ事前学習後に後学習が必要か

次 token 予測だけで主に学ぶのは、似た文章の後に何が続きやすいかである。一方ユーザーが必要とするのは、指示を理解し、役に立ち、要求に合い、できるだけ安全に答えるアシスタントだ。この二つの目標は完全には同じでない。

インターネットなどの文章には、答えのない質問、事実誤り、攻撃的または安全でない内容、低品質で冗長な文、アシスタントらしくない文が含まれ得る。そのため事前学習モデルは通常、後学習を受ける。公開された代表的な InstructGPT の流れは次である。

事前学習モデル
人間のデモによる教師あり微調整
人間の順位付けで報酬モデルを学習
強化学習で振る舞いをさらに最適化

InstructGPT 論文は、インターネット上の次 token を予測することと、有用かつ安全にユーザー指示へ従うことを明確に区別している。人間のデモ、モデル出力の順位、フィードバックを使った追加学習を用いる。8

後学習ではデータと目的が変わっても、多くの手順は次のように抽象化できる。

モデルが出力 → 学習目的または Loss を計算 → 逆伝播で勾配を計算 → 最適化器が更新

勾配法は事前学習だけでなく、教師あり微調整、報酬モデル学習、選好最適化の基盤でもある。

勾配降下法はモデルが自分の誤りを知ることではない

モデルは次のようには考えない。

フランスの首都をロンドンと答えた。
これは地理知識の誤りだ。
次からパリを覚えるべきだ。

まずシステムが得るのは数値である。

Loss = 4.61

その後、逆伝播が総誤差を各パラメータの勾配へ変換する。

parameter_1.grad = ...
parameter_2.grad = ...
parameter_3.grad = ...

最適化器が数値的更新を行う。つまりモデルが人間の抽象的な意味で「正しい」「間違い」を直接学ぶのではなく、学習者が定義した数学的目的を最適化している。

training Loss が下がる ≠ 実世界の全場面で必ず良くなる

データ品質が悪ければ誤ったパターンを学び、学習データと使用場面が違えば汎化が悪くなり、Loss に入っていない要件は自動的には得られない。「人に好かれる」を最適化しても「事実として正しい」を最適化するとは限らない。良い学習には高品質データ、適切な目的、独立評価、安全性・信頼性テスト、継続的な誤り分析が必要である。

勾配降下法は山全体を見ていない

勾配が示すのは現在パラメータの近くで Loss を下げそうな方向だけである。損失空間全体の地図や大域最小値の位置は分からない。

山全体は見えない
→ 足元の傾きを感じる
→ 現在の下り方向へ一歩進む
→ 新しい位置で再び判断する

実際のニューラルネットワークの損失空間は高次元で複雑、通常は非凸である。平坦領域、急峻領域、細長い谷、鞍点、mini-batch 由来のノイズがあり得る。そこで Momentum、適応的学習率、学習率スケジュール、勾配クリッピング、weight decay、正規化、より適切な初期化などを組み合わせ、効率と安定性を上げる。4

勾配降下法は、各 mini-batch 更新が必ず全体 Loss を下げること、全評価指標が同時に上がること、数学的な大域最適解に必ず到達することを保証しない。それでも巨大なパラメータ空間で全方向を試す代わりに、局所導関数から通常は有用な方向を得られる。

学習の全過程をつなげる

LLM の基本学習過程は次の流れである。

生テキスト
token へ変換
「次 token を予測する」学習目標を構成
モデルが forward pass
候補 token のスコアと確率を出力
損失関数が予測誤差を測定
逆伝播が各パラメータの勾配を計算
最適化器が勾配に従ってパラメータを更新
次の batch を読み、繰り返す

多くの反復後には、正解 token の確率が上がり、言語モデリング Loss が下がり、パラメータに再利用可能な言語・知識パターンが形成される傾向がある。その後、教師あり微調整、選好学習、安全学習などにより、ユーザー向けアシスタントとしてより適したモデルにできる。

最下層では常に同じ循環である。

一度予測 → どれだけ間違えたか計算 → パラメータの変え方を計算 → 少し変更 → また予測

最後に覚える四つの概念

パラメータ(Parameters)

学習により変更できるモデル内部の多数の数値。

損失(Loss)

現在の予測と学習目標の距離を測る数値。

勾配(Gradient)

現在位置の近くで各パラメータを微小に変えたとき、Loss がどう変化するかを表す情報。

学習率(Learning Rate)

一回のパラメータ更新で進む大きさ。

一文で定義すると、勾配降下法は次の通りである。

勾配降下法とは、損失関数のパラメータに対する勾配を用いてパラメータを繰り返し小さく調整し、学習誤差を徐々に下げる最適化手法の総称である。

LLM が強力になるのは、一回の更新が特別に賢いからではない。この比較的単純な循環が、大きなモデル、豊富なデータ、大規模計算の上で非常に多く、安定して実行されるからである。

早見図

入力 token
forward pass
次 token の確率
Loss を計算
誤差逆伝播
各パラメータの勾配を得る
最適化器がパラメータを更新
   └──────────────► 次の学習データ batch

参考資料

資料確認日:2026-07-26。