
2026/10/02 8:24
ソフトマックス関数とその微分
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
元のサマリーは強力です。入力・出力のベクトル次元を明示的に述べ、微分がヤコビアン行列であることを明確にし、指数関数をとる前に最大値を引くことでオーバーフロー/NaNを防ぎ安定性を達成することを指定することで、明瞭性と精密性が若干向上します。以下に、これらの clarification を取り入れつつ元のコンテンツを保持した改善版を示します:
テキストは、ソフトマックス関数が N 次元の実数ベクトルを、要素の和が 1 であり (0, 1) の範囲にある確率の別の N 次元ベクトルへマッピングすることを説明しています。この振る舞いは入力間の差を増幅し、「ソフト」な最大演算子として動作するため、フル接続層からの logit を多クラス分類のためのクラス確率に変換する際に標準的に用いられます。要素ごとの公式は exp(x[i]) / sum(exp(x)) であり、より大きな入力の変動が結果の分布に支配的であるという実用的な例 ([1, 2, 3] → ~[0.09, 0.24, 0.67]; [1, 2, 5] → ~[0.02, 0.05, 0.93]) が示されています。数学的に、ソフトマックスの微分は複数の入力が複数の出力へマッピングするためヤコビアン行列となりますが、クロスエントロピー損失と組み合わされる場合、全体的な勾配は (P − Y) に簡略化され、学習を大幅に効率化します。大規模データセットでの数値的安定性を確保し、オーバーフロー/NaN を防ぐため、実装では指数関数をとる前に入力から最大値を引きます(例:np.exp(x) / np.sum(np.exp(x)) は非常に大きい x に対して NaN を生成する可能性があるが、安定版はそうしない)。これらの性質により、ソフトマックス層は深層学習の最終出力予測において汎用性と信頼性を備えています。
本文
ソフトマックス関数:原理・導関数・数値的安定性
ソフトマックス関数は、機械学習における多クラス分類タスクで広く使用される重要な活性化関数です。本記事では、その数学的な定義、確率的解釈、微分法、数値的安定性の確保方法、そして損失関数との組み合わせについて解説します。
1. ソフトマックス関数の基本原理
ソフトマックス関数は、任意の実数の $N$ 次元ベクトルを受け取り、合計が 1.0 になる $(0, 1)$ の範囲の別の $N$ 次元実数ベクトル(確率分布)を生成します。
数学的定義
個々の要素 $s_i$ に対する式は以下の通りです:
$$ s_i = \frac{e^{z_i}}{\sum_{k} e^{z_k}} $$
なぜ出力が $(0, 1)$ の範囲で合計が 1.0 になるか?
- 指数関数の性質: $e^{z_k}$ は常に正($>0$)です。
- 部分分数の性質: 分子 ($e^{z_k}$) は分母(すべての正数の和)の一部であるため、必ず $0 < \frac{e^{z_k}}{\sum e^{z_i}} < 1$ が成り立ちます。
インタプリテーション
ソフトマックスは**「柔らかい(soft)」最大値関数**と考えることができます。
- 最大の要素: 入力ベクトルの最も大きな要素に対して、出力の合計 1.0 を大きく割り当てます。
- 他の要素: 他の要素にもわずかな確率を割り当てます。
例:
- 入力
→ 出力[1.0, 2.0, 3.0][0.09, 0.24, 0.67]- 最後の要素 (3.0) が最も大きく、結果を支配しています。
- 入力を
に変更した場合:[1.0, 2.0, 5.0]- 出力は
となり、最後の要素の影響力がさらに強まります。[0.02, 0.05, 0.93]
- 出力は
2. 確率的解釈と多クラス分類
ソフトマックス関数の特性(和が 1 で要素は正)は、確率分布を表すのに適しています。特に、入力データがどの出力クラスに属するかを示す確率を割り当てるために使用されます。
一般的な用途
多クラスロジスティック回帰などで以下のように解釈されます:
- 入力の処理: 入力ベクトル $\mathbf{x}$ を重み行列 $\mathbf{W}$ との内積を取ってログット(logits)$\mathbf{z} = \mathbf{x}\mathbf{W}$ を得る。
- 確率変換: ログットをソフトマックス関数にかけ、確率ベクトルに変換する。
3. ベクトル微分法とヤコビアン
ソフトマックスはベクトルを入力としベクトルも出力するため、単一の「導関数」ではなく**ヤコビアン行列(Jacobian matrix)**を計算する必要があります。
求めるべき導関数
$$ \frac{\partial \text{softmax}_i}{\partial a_j} $$
- $a$: 入力ベクトル
- $s$: ソフトマックス出力ベクトル
ヤコビアン行列 $\mathbf{J}$ は以下の形状を持ちます: $$ \mathbf{J}_{ij} = \frac{\partial s_i}{\partial a_j} $$
導関数の導出(商則を用いる)
$$ s_i = \frac{e^{a_i}}{\sum_k e^{a_k}} = \frac{e^{a_i}}{\Sigma} \quad (\Sigma = \sum_k e^{a_k}) $$
商則を適用すると、以下の 2 つの場合に分けられます:
- $i = j$ の場合(自身の入力に対する偏微分): $$ \frac{\partial s_i}{\partial a_i} = s_i (1 - s_i) $$
- $i \neq j$ の場合(他要素の入力に対する偏微分): $$ \frac{\partial s_i}{\partial a_j} = -s_i s_j $$
簡潔な表記(クロネッカーのデルタ)
上述の結果は、クロネッカーのデルタ関数 $\delta_{ij}$($i=j$ のとき 1, $i \neq j$ のとき 0)を用いて以下のように一つにまとめられます:
$$ \frac{\partial s_i}{\partial a_j} = s_i (\delta_{ij} - s_j) $$
4. ソフトマックスと数値的安定性
単純な実装では、入力が大きい場合や負の場合に**数値的不安定(NaN や Inf)**が発生します。
問題:単純な実装の欠陥
def softmax(x): """Compute the softmax of vector x.""" exps = np.exp(x) return exps / np.sum(exps)
- 大数の場合:
はすべてsoftmax([1000, 2000, 3000])
になります。nan- 理由: $e^{x}$ が非常に大きくなり、浮動小数点数の範囲を超えてしまうためです(例:$e^{709} \approx \text{Inf}$)。
解決策:入力シフト
数学的には、任意の定数 $C$ を足しても結果は変わらないことが証明できます: $$ s_i(x + C) = \frac{e^{x_i+C}}{\sum_k e^{x_k+C}} = \frac{e^C e^{x_i}}{e^C \sum_k e^{x_k}} = s_i(x) $$
これを利用して、**すべての入力値から最大値を引く(シフトする)**ことで安定性を確保します。これにより、最大の指数が 0 となり、他の指数は負の値になります($e^{\text{負}}$ は非常に小さい正数なので安全)。
安定した実装例
def stable_softmax(x): """Compute the softmax of vector x in a numerically stable way.""" # 入力から最大値を引くことで、exp の引数を範囲内に収める shiftx = x - np.max(x) exps = np.exp(shiftx) return exps / np.sum(exps)
5. ソフトマックスレイヤーと損失関数の微分計算
機械学習では、全結合層(行列積)の後にソフトマックスを適用し、さらにクロスエントロピー損失関数を組み合わせることが一般的です。ここでは**連鎖律(Chain Rule)**とヤコビアンを用いて、重み行列 $\mathbf{W}$ に関する勾配を第一原理から導出します。
アーキテクチャ
$$ \mathbf{y} = \text{softmax}(\mathbf{x}\mathbf{W}) $$
連鎖律の適用
損失関数 $L$ を重み $\mathbf{W}$ で微分するには、以下のステップを経ます:
- ヤコビアン計算:
- ソフトマックス層のヤコビアン(出力確率空間での勾配)
- 全結合層のヤコビアン(入力ログットから重みへの勾配)
- 行列積:
- これらのヤコビアンを掛け合わせることで、最終的な $\nabla_{\mathbf{W}} L$ を得る。
クロスエントロピー損失との組み合わせ
クロスエントロピー損失 $H(P, Q)$ は: $$ L = -\sum_k P(k) \ln(Q(k)) $$ (ここで $P$ はモデル予測、$Q$ は正解ラベル)
ソフトマックス層とクロスエントロピーを組み合わせると、微分計算が大幅に簡略化されます。最終的な重みに対する勾配は以下の美しい形になります:
$$ \frac{\partial L}{\partial W_{ij}} = (\mathbf{y}_i - t_i) $$
- $\mathbf{y}$: ソフトマックス出力(予測確率)
- $t$: 正解ラベル(独熱エンコードベクトル)
この式は、予測値と真値の差を重みに直接反映する意味を持ちます。ヤコビアン行列を使って計算しても、要素ごとのキャンセル効果によって同様の簡潔な結果が得られます。