Cross-Entropy Loss(クロスエントロピーロス)
モデルの予測確率分布と正解の one-hot 分布の間の交差エントロピーを計算する損失関数。LLM の事前学習・ファインチューニングにおける最も基本的な損失関数であり、次トークン予測タスクで各時刻の -log P(正解トークン) を平均する。
Cross-Entropy Loss とは
Cross-Entropy Loss(交差エントロピー損失)は、分類タスクにおけるモデル出力の確率分布と正解ラベルの分布との乖離を測定する損失関数である。LLM では語彙サイズ V(通常 32,000〜128,000)のソフトマックス出力に対し、正解トークンの確率の負の対数を計算する。GPT-4、Llama 3 405B、Claude 3.5、Mistral Large 2 など、事実上すべての主要 LLM が事前学習にこの損失関数を採用している。
数学的定義
テキスト系列 x_1, x_2, ..., x_T に対する Cross-Entropy Loss は:
L_CE = -(1/T) * Σ_{t=1}^{T} log P_θ(x_t | x_1, ..., x_{t-1})
- T: 系列長(コンテキスト長)。Llama 3 は 8,192、GPT-4 は 128,000
- V: 語彙サイズ。Llama 3 は 128,256、GPT-4 は推定 100,000+
- P_θ: モデルのソフトマックス出力確率
- 最小値は 0(完全予測)、実際の収束値は 1.0-1.5 程度
主な特徴・性質
- 情報理論的意味: Cross-Entropy はモデルの予測分布 P と真の分布 Q の KL ダイバージェンスに真のエントロピー H(Q) を加えたもの。H(Q) は定数なので、Cross-Entropy の最小化は KL ダイバージェンスの最小化と等価
- 勾配の性質: ソフトマックス + Cross-Entropy の勾配は P(y) - 1(正解クラス)と P(y)(非正解クラス)で、計算が非常に効率的
- Label Smoothing: 正解の確率を 1.0 から 0.9 に下げ、残り 0.1 を全クラスに均等配分。過信を防ぎ汎化性能向上。Transformer 原論文で ε=0.1 が提案
- 温度スケーリング: ソフトマックスの温度パラメータ τ で logits を割ることで確率分布の鋭さを調整。蒸留では τ=2-4 が一般的
- 数値安定性: log(0) を回避するため log-softmax を使用。PyTorch の CrossEntropyLoss は内部で LogSoftmax + NLLLoss を組み合わせて数値的に安定
実装と最適化
| フレームワーク | 関数名 | 特記事項 |
|---|---|---|
| PyTorch | nn.CrossEntropyLoss | ignore_index でパディング除外、reduction='mean' が標準 |
| JAX/Flax | optax.softmax_cross_entropy | one-hot と logits を入力 |
| TensorFlow | tf.keras.losses.SparseCategoricalCrossentropy | from_logits=True 推奨 |
| Triton | カスタムカーネル | Flash Attention と統合して GPU メモリ削減 |
大規模 LLM では語彙サイズが大きいため、ソフトマックス計算がボトルネックになる。Llama 3(語彙 128,256)では出力層だけで 128,256 × 8,192 = 約 10 億パラメータ。メモリ効率化のため Chunked Cross-Entropy(バッチ方向に分割して逐次計算)が採用される。
Loss 値の目安と解釈
| Loss 値 | Perplexity | 解釈 | 例 |
|---|---|---|---|
| 3.0+ | 20+ | 学習初期 | ランダム初期化直後 |
| 2.0 | 7.39 | 学習中盤 | 基本的な文法を習得 |
| 1.5 | 4.48 | 学習後半 | 流暢な文生成可能 |
| 1.2 | 3.32 | 収束近傍 | 高品質な LLM |
| 1.0 | 2.72 | 理論的下限に近い | 最先端モデル |
Label Smoothing と正則化
- Label Smoothing ε=0.1: 正解確率を 0.9、他クラスに 0.1/(V-1) を配分。T5、PaLM 2 で採用
- Z-Loss: logits の二乗和にペナルティ。係数 1e-4。Llama 3、PaLM で使用。学習の不安定化(Loss スパイク)を防止
- Entropy Bonus: 出力分布のエントロピーにボーナスを与え、過度に確信的な予測を抑制。主に強化学習フェーズで使用
よくある質問(FAQ)
Q1: Cross-Entropy Loss と Negative Log-Likelihood の違いは? A: 数学的に同一。正解が one-hot ベクトルの場合、Cross-Entropy は正解クラスの -log P(正解) に帰着し、これが Negative Log-Likelihood(NLL)そのもの。PyTorch の実装でも CrossEntropyLoss = LogSoftmax + NLLLoss。
Q2: 語彙サイズが大きいと Loss 計算はどう変わりますか? A: 語彙 128K の場合、各時刻のソフトマックスに 128K 次元の指数関数計算が必要でメモリ・計算コストが増大する。対策として Chunked Cross-Entropy(系列方向に分割計算)や、稀少トークンをサンプリングする Sampled Softmax がある。
Q3: Loss が途中で跳ね上がる(Loss Spike)原因は? A: データ品質問題(異常に長い文、壊れた UTF-8、重複データ)、学習率の急変、勾配爆発が主因。Llama 3 では Loss スパイク検出時にチェックポイントを巻き戻し、該当データバッチをスキップする戦略を採用。
まとめ
- Cross-Entropy Loss は LLM 事前学習の唯一標準の損失関数
- 語彙サイズ増大に対して Chunked 計算やメモリ効率化が必須
- Label Smoothing と Z-Loss で学習安定化
- Loss 値 1.0-1.5 が現代 LLM の収束目安
- FP32 での計算が数値安定性のため必須