損失関数とは?予測の「外れ方」を数値にして学習につなぐ
モデルが予測しただけでは、重みをどちらへ直せばよいか分かりません。損失関数は予測と正解の食い違いを数値に変え、学習の目標を定めます。数値が小さくなる方向へ重みを更新するのが、基本的な学習の流れです。
たとえば気温を予測して、正解が20℃なのに18℃と出たとします。「2℃外れた」という情報を学習へ渡すには、ずれを計算できる形にする必要があります。ただし、どの外れ方を重く見るかは損失関数の選び方で変わります。
連続した値には平均二乗誤差
気温のような連続値の予測でよく使うのが平均二乗誤差(MSE)です。正解を y_i、予測を p_i、データ数を N とすると、次のように計算します。
MSE = (1 / N) × Σ (p_i − y_i)^2差を二乗するため、予測が正解より高い場合も低い場合も正の誤差になり、大きな外れ方ほど強く効きます。正解 [20, 22, 24]、予測 [18, 21, 27] なら、二乗誤差は [4, 1, 9]、平均は 14 / 3 ≒ 4.667 です。最後の1件を27から25へ近づけると、その二乗誤差は9から1へ下がります。
次の単語を選ぶときは何を測るか
LLMの学習では、文脈に続く正解トークンへどれだけの確率を割り当てたかが重要です。候補が「猫」「犬」「鳥」で、正解が「猫」なら、猫の確率が高い予測ほど損失を小さくしたいわけです。このような分類に使われる代表的な損失が交差エントロピーです。
正解が1つのとき、1件分の交差エントロピーは −log(正解クラスの予測確率) と表せます。正解に0.8を割り当てた場合は約0.223、0.2なら約1.609です。「正解を外したかどうか」だけでなく、正解をどれほど低く見積もったかも反映します。
実装ではモデルが出す生のスコアを logits と呼びます。PyTorchの CrossEntropyLoss はこのlogitsを直接受け取り、内部で正規化して損失を計算します。先にsoftmaxした確率を渡すと意図した計算にならないため注意が必要です。
Pythonで両方の損失を確かめる
NumPyだけで計算できます。以下は単独で実行できる例です。
import numpy as np
target = np.array([20.0, 22.0, 24.0])prediction = np.array([18.0, 21.0, 27.0])improved = np.array([18.0, 21.0, 25.0])
def mse(values): return np.mean((values - target) ** 2)
print(f"MSE: {mse(prediction):.3f}")print(f"改善後のMSE: {mse(improved):.3f}")
def cross_entropy(logits, correct_index): shifted = logits - np.max(logits) # 大きなスコアでも指数計算が溢れにくい log_probs = shifted - np.log(np.exp(shifted).sum()) return -log_probs[correct_index]
labels = ["猫", "犬", "鳥"]before = np.array([0.0, 1.0, -1.0])after = np.array([2.0, 1.0, -1.0])correct_index = labels.index("猫")
print(f"交差エントロピー: {cross_entropy(before, correct_index):.3f}")print(f"改善後の交差エントロピー: {cross_entropy(after, correct_index):.3f}")出力:
MSE: 4.667改善後のMSE: 2.000交差エントロピー: 1.408改善後の交差エントロピー: 0.349最初の例は、最後の予測値を正解に近づけた結果です。後半は正解「猫」のlogitを0から2へ上げています。他の候補のスコアを変えなくても、正解への相対的な支持が増え、損失が下がります。これは説明用に値を手で変えた例で、実際の学習では勾配と最適化手法を使ってモデルの重みを更新します。
損失が下がれば実用上も必ず良い?
そうとは限りません。訓練データの損失だけを小さくしても、未知の入力で良くなる保証はありません。また、次トークン予測の交差エントロピーは「学習データの正解トークンをどれだけ予測できたか」の指標であり、回答の事実性や安全性を直接測るものではありません。目的に合う評価データと指標を別に用意する必要があります。
損失関数は採点方法、勾配はその点数を下げるために各重みをどちらへ動かすかの手がかりです。ここまでつながると、重み・活性化関数・損失関数が学習の中でどう役割分担しているか見えてきます。