チャプター 06 · 学習 · 10 min
どのように学ぶか
損失関数、勾配降下法、バックプロパゲーション。そして数十億のパラメータが必要な理由。
誤差を測る
最初、モデルはランダムだ。「空は」と入力すると、「バナナ」を「青い」と同じくらいの確率で予測してしまう。私たちが望むのは、「青い」(あるいは自然な続き)を予測させることだ。
そのために必要なことは2つだけだ:
- どれだけ間違っているかを測る方法。
- 正しい方向にパラメータを修正する仕組み。
それが学習(トレーニング)のすべてだ。
損失関数:正確さの代償
各ステップで、モデルにテキストの断片を与える。モデルは次のトークンを確率分布として予測する(第1章参照)。私たちは、実際にテキストに存在するトークンにモデルが割り当てた確率を確認する。確率が高ければ正解、低ければ不正解だ。
クロスエントロピー損失は、この誤差を対数確率で測る:
モデルが確信を持って正解するほど、損失は小さくなる。 モデルが確信を持って誤るほど、損失は爆発的に大きくなる。
これは厳しい指標だ。正解に0.01%を割り当てることは、10%を割り当てることよりはるかに高いコストを払う。モデルは誤った確信を避けることを学ぶ。
勾配降下法:坂を下りる
損失が計算されたら、どうやってパラメータを調整するのか?
損失を巨大な空間(パラメータと同じ数だけの次元:数十億)上の曲面として想像しよう。モデルはその曲面上の一点だ。私たちはそれを谷に向かって下降させたい。
このアルゴリズムは勾配降下法と呼ばれる:各ステップで、最も急な下降方向(勾配)を計算し、その方向に少しだけ移動する。
パラメータ ← パラメータ − η × 勾配
η(イータ)は学習率だ:ステップのサイズ。小さすぎると前進しない。大きすぎると谷を飛び越えて発散する。
Loss 曲線は階段状に下がる。各段は、モデルが新しいパターンを学び終えたことに対応する。4 種類の Learning Rate のレジームは古典的な落とし穴を示している:低すぎるとモデルは停滞し、高すぎると発散する。
可視化で観察できる3つのパターン:
- 非常に低い学習率(≤ 0.001) — 曲線は下降するが、ゆっくりだ。モデルは学習しているが、待つ時間がない。
- 最適な学習率(≈ 0.01) — 安定した下降、低い漸近線。これが目標だ。
- 高すぎる学習率(≥ 0.05) — 損失が振動し、発散することさえある。モデルが極小値を「飛び越えて」落ち着けない。
実際には、トレーニング中に学習率を動的に調整する:最初にリニアウォームアップ(何もかも壊さないため)、その後コサイン減衰。
Adam:勾配降下、ただしより良く
パラメータ ← パラメータ − η × 勾配 という式は純粋な勾配降下を記述している。実際には、LLMの訓練でこれをそのまま使う人はいない。
リファレンスとなるオプティマイザはAdam(およびその現代的な変種AdamW)と呼ばれる。アイデア:現在の勾配の方向に盲目的に進むのではなく、各パラメータについて最近の平均的な方向(モーメンタム)と更新の分散を記憶しておく。
- 勾配が一貫して同じ方向を指すパラメータは大きなステップを取る。
- 振動する(ノイジーな勾配)パラメータは小さなステップを取る。
このようにAdamは各パラメータに自動的に適応する。SGDがすべてに同じ学習率を適用するのに対して、Adamはそうしない。より安定し、実際にははるかに速く収束する。AdamW(最も使われるバリアント)はさらに重み減衰と呼ばれる正則化を加え、訓練中に重みが爆発するのを防ぐ。
今日、AdamWなしでLLMを訓練するのは、正当な理由なくアセンブリでコーディングするのと同じくらい稀なことだ。
バックプロパゲーション
勾配を計算する——つまり各パラメータが損失にどう影響するかを知る——には、バックプロパゲーションを使う。これは出力から入力に向けて誤差を伝播させ、層ごとに微分の連鎖律を適用するアルゴリズムだ。
直感的に考えよう:
「このダイヤルを0.001単位回したら、損失は上がったか下がったか、そしてどれくらい?」
その質問への答えを、モデルの数十億個のダイヤルすべてに対して並列に計算する——それがバックプロパゲーションの仕事だ。これによって、700億パラメータのモデルをクラスター上で約10日でトレーニングすることが可能になる。
事前学習:インターネットを読む
LLMが何か有用なことを学ぶには、大量のテキストが必要だ。本当に大量だ。現代のモデルは事前学習で:
- 1兆から15兆トークンを学習する
- フィルタリングされたテキスト(Common Crawl、Wikipedia、書籍、コード、論文)を使用する
- 特定の部分(最高の書籍、複数エポック)を複数回通過する
このプロセス全体を通じて、タスクは常に同じだ:次のトークンを予測すること。ラベル付きの質問と回答のペアも、「これが正しい翻訳だ」という指示も、人間の報酬もない。生のテキストと、続きを予測するという目標だけだ。
これが自己教師あり学習と呼ばれる所以だ:データ自体が「ラベル」を提供する。アノテーションのために人間は必要ない——テキストがあれば十分だ。
バッチサイズ:一度に何個の例を使うか
勾配を1つの例だけで計算することは決してない。複数のシーケンスをバッチにまとめ、バッチ全体の平均勾配を計算してから、パラメータを一度だけ更新する。
バッチが大きいほど、勾配は安定し(ノイズが少ない)、より大きな学習率を使えるようになる。ただし、すべてを保持するのに十分なGPUメモリが必要だ。
現代のLLMでは、実効バッチサイズは数百万トークンに達する——通常、以下を組み合わせて得られる:
- ローカルバッチ(GPUあたり)——VRAMによって制限される。
- 勾配累積 ——複数の小さなバッチを計算し、最後にだけ更新を適用する。
- データ並列性 ——バッチを数十、数百、時には数千のGPUに分散させる。
エンジニアがグローバルバッチサイズと呼ぶものは、単一の最適化ステップに寄与するデータの総量だ。GPT-4では、ステップあたり数百万トークンという話になる。
データ:仕事の半分
パラメータについてはよく語られる。データの準備についてはあまり語られない——にもかかわらず、モデルを訓練する真剣なチームの時間の半分を実際に占めているのはこれだ。
- フィルタリング ——低品質のコンテンツ(スパム、404エラーページ、機械生成コンテンツ、文脈のない商品リスト)を取り除く。
- 重複除去 ——重複を取り除く。Common Crawlには同じページのコピーがたくさん含まれている。それらを残すと、モデルは汎化する代わりにそれらのページを丸暗記してしまう。
- 混合 ——ソース(Wikipedia、書籍、コード、科学論文)を、その生のサイズではなく教育的価値に応じてバランスさせる。
- 品質フィルタリング ——最高のチームでは、分類器が各ドキュメントをスコアリングし、教科書や十分に調査された記事のように見えるものだけを残す。
- 汚染除去 ——評価ベンチマーク(MMLU、HumanEval……)が訓練コーパスに漏れていないことを確認する。
Metaの研究者の率直なまとめ:「我々はモデルを訓練するのに10%、データを準備するのに90%の時間を費やしている。」
これがまた、最良のオープンモデル(Llama、Mistral、DeepSeek)が自分たちのデータレシピの詳細をほとんど明かさない理由でもある:それが彼らの主な競争優位性なのだ。
過学習と検証
モデルをトレーニングするほど、コーパスをそのまま暗記するようになる。ある時点で、汎化ではなく記憶を始める。これが過学習だ。
検出するには、コーパスの一部——検証セット——を脇に取り置き、そこではトレーニングしない。トレーニング中、両方の損失を測定する。両方が下降する限り、問題はない。検証損失が上昇し始め、トレーニング損失が下がり続けるとき、過学習が始まっている。止める時だ(またはデータを増やすか、正則化を行う)。
可視化では、破線の曲線が検証損失を表している。最後にわずかに上昇している——まさにそれだ。
スケールが能力だ
最後に一つ。なぜこれほど多くのパラメータとこれほど多くのデータが必要なのか?学習は非常に規則的なスケーリング則に従うからだ:
損失 = A × (計算量)−α
計算量(パラメータ × データ × イテレーション)を2倍にすると、損失は一定係数で割られる。曲線は滑らかで、6桁の大きさにわたって予測可能だ。業界全体がこの規則性の上に成り立っている。GPUへの投資を10倍にすれば、測定可能な改善が得られることが事前にわかる。
これについては第 19 章(KaplanとChinchillaのスケーリング則)で詳しく戻ってくる——GPT-3がなぜデータ不足だったのか、パラメータとトークンの最適な比率は何かを含めて。
次へ
事前学習されたモデルは、今や非常に有能なトークン予測機だ。驚くほど自然にどんなテキストも完成させることができる。しかしまだアシスタントではない。
そこへ到達する前に、もう一つ理解すべきことがある:分布が予測されたら、どうやってトークンを選ぶのか?次の章でこの点に戻る。
更新日