深層学習

ソフトマックスとone-hot

ロジットをクラス確率へ写像するソフトマックスと、正解クラスをベクトルで表すone-hotの対応を、安定実装と勾配まで確認するノート。

  • B|標準
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

ソフトマックスは、モデルが出したクラスごとのスコア(ロジット)を、合計1の確率ベクトルへ写像します。one-hot は正解クラスだけを1、他を0にした教師ベクトルです。分類では、この予測ベクトルと教師ベクトルを同じクラス軸にそろえることで、正解の位置を明示できます。

ロジットが「候補ごとの点数」、ソフトマックスが「点数を持ち分に換算する処理」、one-hot が「正解の候補だけに旗を立てた一覧」です。点数の大小は確率の大小に残りますが、換算後は全候補の持ち分を足すと1になります。

なぜ必要か

最終層の線形出力は正負を取り、値の合計も決まっていません。そのままではクラス間の比較はできても、確率として扱えず、正解クラスを表す教師との対応も曖昧です。ソフトマックスは指数化でスコア差を強調し、和で割ってクラス軸を正規化します。

一方、教師ラベルを整数 2 のように持つだけでは、クラス数3の予測ベクトルとの要素対応が見えません。one-hot の [0, 0, 1] なら、正解クラスの位置がそのまま分かります。実装では、ラベルの値をクラスの順序と解釈し、予測のクラス軸と同じ次元に変換することが要点です。

入力そのままでは困る点変換後の役割
ロジット確率の範囲・総和を満たさないsoftmaxで予測分布にする
整数ラベル予測の各クラス位置と対応しないone-hotで教師ベクトルにする

仕組み

ロジットを z\mathbf{z}、クラス ii の成分を ziz_i、クラス数を KK、出力確率を pip_i とすると、ソフトマックスは次です。

pi=exp⁡(zi)∑j=1Kexp⁡(zj)p_i = \frac{\exp(z_i)}{\sum_{j=1}^{K}\exp(z_j)}

分母は全クラスの指数の和なので、pip_i は0から1の範囲に入り、∑ipi=1\sum_i p_i=1 になります。ここでロジット全体に同じ定数 cc を足しても結果は変わりません。分子と分母の両方に exp⁡(c)\exp(c) が掛かって相殺するためです。したがって実装では、最大値 m=max⁡izim=\max_i z_i を引いてから指数化します。値は変わらず、指数のオーバーフローを避けられます。

正解クラスを yy、クラス ii の教師成分を tit_i とすると、one-hot は ty=1t_y=1、それ以外は ti=0t_i=0 です。予測を pip_i として交差エントロピーの微分を整理すると、ロジットに対する勾配は次の形になります。

∂L∂zi=pi−ti\frac{\partial L}{\partial z_i}=p_i-t_i

この形になるのは、softmax の各成分が互いに分母を共有し、交差エントロピーの対数微分と打ち消し合うからです。つまり正解クラスでは「予測確率−1」、それ以外では「予測確率−0」です。バッチでは各サンプルの行ごとにこの差を作り、平均するならバッチサイズで割ります。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
式の意味指数化した各ロジットを全クラスの指数和で割るロジットを単純に総和で割る
数値安定化最大値を引いてから指数化しても写像は不変最大値を引くと確率が変わる
one-hot の形正解位置だけ1、クラス軸の長さはクラス数ラベル整数そのものをベクトルとみなす
勾配の形pi−tip_i-t_i。正解位置は pi−1p_i-1pi+tip_i+t_i、または正解位置だけを計算する
次元指定サンプルごとのクラス軸に沿って和を取るバッチ軸まで一緒に正規化する

実装で確かめる

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成分を引いた形です。

出典