Softmax と交差エントロピー
Softmax は生のスコアを指数化し、その総和で割って、非負で合計 1 の確率分布に変えます。交差エントロピーは正解クラスの −log p_y で評価し、softmax 入力への勾配は p − y になります。
Softmax は滑らかな argmax で、スコア差を指数的な確率比に変えます。交差エントロピーは正解の確率がゼロに近づくと上限なく増え、逆伝播で softmax の飽和因子を打ち消します。本課の手書き 3 は 99.86% の確信度で 2 と誤認されます。同じ予測に対する正解クラスの修正勾配は、交差エントロピーの方が二乗誤差より 361 倍大きくなります。
スコア、確率、勾配
分類器が各クラスに出す生のスコアを logit と呼びます。正負どちらも取り、確率の制約はありません。本例は 10 個中 8 個が負で、合計は −29.52 です。
計算は、最大値 c を引き、指数を取り、総和を求め、割ります。任意の定数について softmax(s) = softmax(s − c) です。分子と分母の e^(−c) が相殺されます。最大値を引くと指数の入力がすべて 0 以下になり、指数のオーバーフローを防げます。800 をそのまま指数化すると inf / inf = NaN になります。数学上の確率は変わりませんが、浮動小数点の丸めやアンダーフローは残ります。
交差エントロピーの一般形は −Σ yᵢ log pᵢ です。one-hot ターゲットでは正解クラスだけが 1 なので −log p_y になり、p_y → 0 で上限なく増えます。対数、除算、指数を連鎖律で微分すると:
∂L/∂s = p − y
s は softmax に渡す値です。通常は元の logit z です。温度 T で割ってから渡す場合、元のスコアへの勾配は (p − y) / T になります。温度は p 自体も変えるため、外側の倍率だけの変化ではありません。
ステップ実行
既定値は MNIST テスト画像の 3、ネットワークは 784 → 25 → 25 → 10、温度は T = 1.0 です。
- logit:
z₂ = 10.00、次点はz₃ = 3.42、残りは−1.79から−18.15です。 - 平行移動:全値から
10.00を引くとクラス 2 は 0、クラス 3 は−6.578です。確率を変えずに指数のオーバーフローを防ぎます。 - 指数化:クラス 2 は
e⁰ = 1、クラス 3 はe^(−6.578) = 0.0014。差は約 719 倍の比になり、8 個の指数は1e-5未満です。 - 総和:
Σ = 1.0014。最大値を引いた後の和が 1 に近いことは、一つのクラスへの集中を示します。 - 除算:
p₂ = 0.9986、p₃ = 0.0014、残り 8 クラスの合計は1.57e-5です。表示値は丸めており、元の確率の合計は浮動小数点誤差を除いて 1 です。 - 判定:予測は確信度
99.86%の 2、正解ラベルは 3 です。 - 二つの損失:交差エントロピーは
−log p₃ = 6.5794nat。本課で MSE と呼ぶ½Σ(pᵢ − yᵢ)²は0.9972です。one-hot と確率分布に対するこの二乗誤差の上限は1.0なので、その約 99.7% に達しています。交差エントロピーには上限がなく、「最悪値」とは呼べません。 - 同じヤコビ行列を通す:
J = diag(p) − p pᵀとすると、両者とも∂L/∂s = J · ∂L/∂pです。交差エントロピーの入力勾配は正解クラスだけ−1/p₃ = −720.11、他は 0 です。Jの第 3 列のp₃を打ち消し、(−1/p₃)·p₃(1 − p₃) = p₃ − 1 = −0.9986になります。二乗誤差は通常の大きさのp − yを渡すため、結果p₃·((p₃ − 1) − pᵀ(p − y))にp₃が残ります。 - スコア勾配を比較:交差エントロピーは正解に
−0.9986、誤った首位に+0.9986を返し、勾配降下は 3 を上げて 2 を下げます。二乗誤差の正解勾配は約0.0014 × (−1.9944) = −0.0028で、約 361 倍弱くなります。
分類で交差エントロピーを使う理由
二乗誤差は飽和した誤予測に高い損失を与えても、更新信号は小さくなります。本例の二乗誤差は 0.9972、勾配の大きさは 0.0028 です。ほぼ完全に正しい別の例では、表示損失 0.0000、勾配 9.6e-22 です。交差エントロピーの勾配が収まる軸ではどちらも平らに見えますが、誤予測の勾配が数学上ゼロという意味ではありません。
再学習せず固定 logit の温度を T = 3.0 に上げると、正解確率は 0.0014 から 0.0935 へ、勾配比は 361 から 6.4 へ変わります。差は飽和に関係します。ただし、確信度の高い正解例では、温度を上げることで表示上なかった差が現れる場合もあり、常に差が縮むわけではありません。
素朴な grad_mse = J @ (p - t) は密な C × C 行列を作り、時間・空間とも O(C²) です。外積 p pᵀ が全要素を埋めるので J は対角行列ではありません。語彙 50,000 なら 25 億要素です。ただし本課は次の等価式を使います。
J(p − y) = p ⊙ ((p − y) − pᵀ(p − y))
これは時間・空間とも O(C) で J を作りません。二乗の計算量は素朴な実装の問題ですが、softmax の飽和による減衰はこの書き換えでは消えません。線形出力の回帰で使う二乗誤差には、同じ出力飽和の機構はありません。
境界ケース
p_yがゼロへアンダーフロー:直接対数を取ると無限大です。PyTorchcross_entropyや TensorFlowsoftmax_cross_entropy_with_logitsなどの log-sum-exp に融合した実装を使い、微小確率を経由しない計算にします。非有限入力への対処は別に必要です。- 最大値を引かない:数学上の確率は同じです。本例の最大値は 10 で
e^10 ≈ 22026なので問題化しませんが、float64 はe^710付近で指数の範囲を超えます。 - 正解確率が 1 に丸められる:交差エントロピー損失は
0.0000と表示され、T = 1では勾配は約2.5e-11です。両方の勾配が1e-6未満のとき、本課は CE/MSE 比を非表示にし、微小数同士の商による見かけの差を避けます。 - ソフトターゲット:ラベル平滑化や蒸留の正規化済み分布でも
p − yは成立します。ただし複数項が残るため−log p_yだけにはできません。
よくある間違い
- softmax を二度適用する:PyTorch の交差エントロピーや logits 入力と指定された API にはスコアを渡します。確率を渡すと再変換され、勾配も変わります。すべての API が既定で logits を受け取るわけではないので契約を確認します。
- nat を bit と読む:自然対数の単位は nat です。
ln 10 ≈ 2.3は 10 クラスの一様予測の損失ですが、同じ損失だけでモデルの全挙動は分かりません。bit へはln 2で割ります。 - スコア差を確率比と思う:差
6.578は約 719 倍であり、6.6 倍ではありません。 - 確率軸を自動拡大する:集中した分布と平坦な分布を比較するには
[0, 1]に固定します。 - 二乗誤差は分類に使えないと結論する:確率を評価する損失として定義できます。ここで扱うのは softmax と組み合わせたときの飽和による最適化の問題です。
モデルの範囲
ミニバッチではなく 1 例を計算し、勾配は logit で止めます。重みへの続きは逆伝播を参照してください。温度は学習済みネットワークの固定スコアを変換するだけです。確率と二つの勾配ベクトルは、実際のモデルとテスト画像から計算しています。