Softmaxと交差エントロピー損失シミュレーター 戻る
機械学習シミュレーター

Softmaxと交差エントロピー損失 — 分類学習の核

3クラス分類のロジットを Softmax で確率に変換し、正解クラスとの交差エントロピー損失をリアルタイム計算。温度パラメータ T を動かして分布の鋭さと損失の変化を体感できます。

パラメータ設定
ロジット z_1(クラス1:正解)
ロジット z_2(クラス2)
ロジット z_3(クラス3)
温度 T

正解クラスは c = 1(「クラス 1」)に固定しています。ワンホットラベルは y = (1, 0, 0)。

計算結果
P(Class 1) ←正解
P(Class 2)
P(Class 3)
交差エントロピー損失 L
確率分布と温度の影響

上半=現在のT での P(class i)(緑=正解、青=他クラス)/下半=T=0.5, 1, 2, 5 での P の比較/左下=損失と予測クラス

理論・主要公式

Softmax は実数ベクトル z を確率分布 p に変換し、交差エントロピーはその予測と正解ラベル y の距離を測ります。

温度 T 付き Softmax。T で割ってから指数化し、和で正規化します:

$$p_i = \frac{\exp(z_i / T)}{\sum_{j} \exp(z_j / T)}$$

交差エントロピー損失。y はワンホットラベル(正解クラス c のみ 1):

$$L = -\sum_{i} y_i \log(p_i) = -\log(p_c)$$

数値安定化(log-sum-exp)。Softmax は定数シフトに不変なので最大値を引いてから exp します:

$$p_i = \frac{\exp((z_i - z_{\max}) / T)}{\sum_{j} \exp((z_j - z_{\max}) / T)}$$

T が小さいほど分布が鋭く(argmax 集中型)、T が大きいほど一様に近づきます。蒸留学習で重要な性質です。

Softmaxと交差エントロピー損失シミュレーターとは

🙋
分類モデルって、最後に「Softmax」っていうのを通すって聞いたんですけど、何をしてるんですか?
🎓
ざっくり言うと、Softmax は「点数(ロジット)」を「確率」に変える関数だ。上のシミュレーターで z_1=2, z_2=1, z_3=0 のとき、確率は 0.665, 0.245, 0.090 になっているだろう?合計はちょうど 1。各点数を exp で正値化して、和で割って正規化するだけ。指数を使うから、点数の差が「指数的に」拡大されるのが味噌だね。
🙋
なるほど!それで、その下にある「交差エントロピー損失」って何ですか?
🎓
予測した確率と「正解ラベル」のずれを測る量だ。正解クラスを c としたら、損失は L = -log(p_c) と書ける。今、正解が C1 で p_1 = 0.665 だから L ≈ 0.408。p_c が 1 に近ければ L→0、自信を持って外して p_c が 0.01 とかだと L→4.6 と急増する。「自信を持って外すと激痛」という設計がポイントだよ。
🙋
温度 T のスライダーを動かすと、確率が一斉に変わりますね。T を 5 にすると全部 0.3 くらいで揃ってきます。
🎓
よく気づいた。T はロジットを T で割ってから Softmax に通すパラメータだ。T を大きくすると差が縮まって一様分布に近づき、T を小さくすると差が拡大して最大要素に確率が集中する。下のグラフで T=0.5, 1, 2, 5 を並べてあるから比較してみて。実務では「知識蒸留」で大きい T を使って、教師モデルの「分布の形」そのものを生徒に教えるんだ。
🙋
ロジットを大きくしすぎると、計算が壊れたりしないんですか?
🎓
鋭い指摘。z=1000 とかにすると exp(1000) は無限大になるからね。そこで実装上は「全ロジットから最大値を引いてから exp する」のが定石だ。Softmax は定数シフトに不変だから結果は変わらず、最大要素は exp(0)=1 で済むから overflow しない。これが log-sum-exp トリック。このシミュレーターでも z=5(上限)でも壊れないようにしてある。試しにスライダーを端まで動かしてみて。

よくある質問

T→0 の極限では、最大ロジットを持つクラスに確率がほぼ 1 で集中し、他は 0 に潰れます(hard な分布)。z_1=2, z_2=1, z_3=0 で T=0.1 にすると p_1 はほぼ 1 になります。逆に T→∞ では全クラスの確率が等しくなり、3 クラスなら 1/3 ≈ 0.333 に近づきます(soft な分布)。T はちょうど「分布の鋭さ」を直接コントロールするツマミです。
Hinton らの知識蒸留では、教師モデルと生徒モデルの双方で大きな T(例えば T=4〜10)を使って Softmax を出し、生徒に「分布の形」を真似させます。T=1 のままでは最大要素にほぼ 1 が集中して情報量が乏しいのに対し、大きな T では「次点クラスの確率」など、教師が学習した「クラス間の似ている度合い」が浮き上がるからです。推論時は T=1 に戻します。
正解クラスのみ 1.0 のワンホットラベルを、例えば 0.9 にし、残り 0.1 を他クラスに均等に振る正則化手法です。L = -Σ y_i log(p_i) の y を平滑化することで、モデルが「自信を持ちすぎる」のを防ぎます。汎化性能が改善し、過学習・キャリブレーションの面で有利になることが知られており、画像分類や音声認識の標準テクニックです。
ロジットが大きいと exp(z) が double 精度で overflow(z≈709 で +Inf)し、小さすぎると underflow して 0 になります。実装では p_i = exp(z_i − max(z)) / Σ exp(z_j − max(z)) と最大値シフトしてから計算します。Softmax は定数シフトで不変なので結果は同じで、最大要素が exp(0)=1 となり安定します。PyTorch・TensorFlow の log_softmax は内部でこの形を使っています。

実世界での応用

画像分類・物体検出:ResNet、ViT などの画像分類モデルの最終層は Softmax を出力し、交差エントロピー損失で学習します。ImageNet(1000 クラス)であれば z は 1000 次元、出力はクラスごとの確率です。物体検出(YOLO、Faster R-CNN)でも、各候補ボックスのクラス予測に同じ枠組みが使われます。

言語モデル・機械翻訳:GPT・BERT などの大規模言語モデルは、各位置で「語彙数次元のロジット」を出し、Softmax で次トークン分布を作ります。学習時は正解トークンの -log p_c を損失とし、推論時には温度 T で「サンプリングの多様性」を制御します(T を上げると多様、下げると確定的)。ChatGPT の "temperature" 設定はまさにこの T です。

知識蒸留(モデル圧縮):大規模教師モデルの予測分布(高温 Softmax)を、小規模生徒モデルが模倣するように学習させる手法です。BERT → DistilBERT、画像分類の量子化モデルなど、エッジ展開のためのモデル軽量化に広く使われています。「温度を上げる」のがポイントで、T=1 では情報が落ちてしまいます。

強化学習・方策ネットワーク:方策勾配法(REINFORCE、PPO)では、行動の選択確率を Softmax で出します。温度を上げると探索(exploration)寄り、下げると活用(exploitation)寄りになり、学習初期と後期で T をスケジューリングする実装もあります。AlphaGo の MCTS でも類似のソフトな選択が用いられています。

よくある誤解と注意点

最も多い誤解は、「Softmax の出力は本当の確率である」と無条件に信じてしまうことです。深層モデルの Softmax 出力は、確率の数学的性質(非負・合計 1)は満たしますが、必ずしも「正しいキャリブレーション」がされているわけではありません。とくに現代の深層ニューラルネットは「自信過剰(overconfident)」になりがちで、p=0.99 と予測しても実際の正解率は 80% 程度というケースが普通にあります。安全性が重要な医療診断や自動運転では、temperature scaling などの post-hoc キャリブレーションで補正します。

次に多いのが、「クロスエントロピー損失は MSE(平均二乗誤差)と同じように使える」と考えることです。クロスエントロピーは、確率分布が前提なので入力に「正規化された確率」を渡さないと意味を持ちません。Softmax を通さない生のロジットに直接 -y log z を適用すると NaN や負の値で破綻します。PyTorch の nn.CrossEntropyLoss はロジットを入れる仕様(内部で log_softmax を計算)、nn.NLLLoss は log 確率を入れる仕様、と関数の前提を必ず確認してください。

最後に、「温度 T はモデルの精度を上げる魔法のパラメータだ」と思い込むのも危険です。学習時に T を変えても損失関数の形が変わるだけで、推論時に T=1 で評価する精度は本質的には変わりません。T が真価を発揮するのは「蒸留学習で教師の分布を伝える」「生成モデルでサンプリングの多様性を制御する」「分類の不確実性を補正する」といった、確率分布の「形」そのものを使うタスクです。シミュレーターで T を動かしながら、何が変わり何が変わらないかを観察してみてください。