ひとことで言うと
ソフトマックスは、モデルが出したクラスごとのスコア(ロジット)を、合計1の確率ベクトルへ写像します。one-hot は正解クラスだけを1、他を0にした教師ベクトルです。分類では、この予測ベクトルと教師ベクトルを同じクラス軸にそろえることで、正解の位置を明示できます。
ロジットが「候補ごとの点数」、ソフトマックスが「点数を持ち分に換算する処理」、one-hot が「正解の候補だけに旗を立てた一覧」です。点数の大小は確率の大小に残りますが、換算後は全候補の持ち分を足すと1になります。
なぜ必要か
最終層の線形出力は正負を取り、値の合計も決まっていません。そのままではクラス間の比較はできても、確率として扱えず、正解クラスを表す教師との対応も曖昧です。ソフトマックスは指数化でスコア差を強調し、和で割ってクラス軸を正規化します。
一方、教師ラベルを整数 2 のように持つだけでは、クラス数3の予測ベクトルとの要素対応が見えません。one-hot の [0, 0, 1] なら、正解クラスの位置がそのまま分かります。実装では、ラベルの値をクラスの順序と解釈し、予測のクラス軸と同じ次元に変換することが要点です。
| 入力 | そのままでは困る点 | 変換後の役割 |
|---|---|---|
| ロジット | 確率の範囲・総和を満たさない | softmaxで予測分布にする |
| 整数ラベル | 予測の各クラス位置と対応しない | one-hotで教師ベクトルにする |
仕組み
ロジットを 、クラス の成分を 、クラス数を 、出力確率を とすると、ソフトマックスは次です。
分母は全クラスの指数の和なので、 は0から1の範囲に入り、 になります。ここでロジット全体に同じ定数 を足しても結果は変わりません。分子と分母の両方に が掛かって相殺するためです。したがって実装では、最大値 を引いてから指数化します。値は変わらず、指数のオーバーフローを避けられます。
正解クラスを 、クラス の教師成分を とすると、one-hot は 、それ以外は です。予測を として交差エントロピーの微分を整理すると、ロジットに対する勾配は次の形になります。
この形になるのは、softmax の各成分が互いに分母を共有し、交差エントロピーの対数微分と打ち消し合うからです。つまり正解クラスでは「予測確率−1」、それ以外では「予測確率−0」です。バッチでは各サンプルの行ごとにこの差を作り、平均するならバッチサイズで割ります。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 式の意味 | 指数化した各ロジットを全クラスの指数和で割る | ロジットを単純に総和で割る |
| 数値安定化 | 最大値を引いてから指数化しても写像は不変 | 最大値を引くと確率が変わる |
| one-hot の形 | 正解位置だけ1、クラス軸の長さはクラス数 | ラベル整数そのものをベクトルとみなす |
| 勾配の形 | 。正解位置は | 、または正解位置だけを計算する |
| 次元指定 | サンプルごとのクラス軸に沿って和を取る | バッチ軸まで一緒に正規化する |
実装で確かめる
NumPy で安定な計算、one-hot 化、勾配の形を一度に確認します。
import numpy as np
z = np.array([2.0, 1.0, -1.0])
t = np.eye(3, dtype=int)[2]
shifted = z - z.max()
p = np.exp(shifted) / np.exp(shifted).sum()
grad = p - t
print("probability sum:", p.sum())
print("gradient:", np.round(grad, 6))
出力は one-hot: [0 0 1]、probability sum: 1.0、gradient: [ 0.259496 0.095096 -0.645022] です。正解クラスの勾配だけが負になるので、勾配降下によってそのロジットを押し上げる向きになります。なお、PyTorch の Softmax では、クラスを並べた次元を dim に指定します。テンソルの形が変わったときにこの軸を取り違えると、コードは動いても別の集合を正規化します。
取り違えやすいもの
| 用語 | ソフトマックス・one-hotとの切り分け |
|---|---|
| ロジット | 線形層が出す未正規化スコア。確率ではない |
| シグモイド | 各出力を独立に0〜1へ写像する関数。2クラスのsoftmaxは確率1つを見れば同じ形になる |
| 整数ラベル | 正解クラスの番号。one-hotはそれをクラス軸のベクトルへ展開した表現 |
| softmax後の確率 | 合計1だが、数値安定性や損失との接続まで含めた実装では扱う演算順序に注意が要る |
想起チェック
ソフトマックスの前に最大値を引いてよい理由は何か
全成分に同じ定数を足す写像が不変で、分子と分母に同じ指数因子が掛かって相殺するためです。
one-hot の正解位置に入る値は何か
1です。それ以外のクラス位置は0で、ベクトルの長さはクラス数です。
softmaxとone-hotを組み合わせたロジットの勾配は何か
各クラスについて、予測確率から教師のone-hot成分を引いた形です。