1 定義と基本性質

1.1 数学的定義

1.1.1 一般形式

ソフトマックス関数は、K次元の実数ベクトル z = (z₁, z₂, ..., z_K) ∈ ℝ^K を入力として受け取り、同じ次元の実数ベクトル σ(z) を出力する。各成分は次の式で定義される:

\[ \sigma(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}, \quad i = 1, 2, \dots, K \]

ここで、分母はすべての指数項の和であり、出力ベクトルの各成分は0から1の値をとり、その総和は1となる。

1.1.2 確率解釈

ソフトマックス関数の出力は、カテゴリ分布のパラメータとして解釈できる。すなわち、出力のi番目の要素は、入力に対応するクラスiが選択される確率を表す。このため、機械学習における多クラス分類問題で、ニューラルネットワークの最終層の活性化関数として頻繁に使用される。指数演算により、入力値の差が確率分布に非線形に反映される。

1.2 主要な性質

1.2.1 正規化とユニーク性

ソフトマックス関数は、任意の実数ベクトルを確率ベクトルに正規化する。出力ベクトルの各要素は非負であり、総和が常に1となる。また、入力ベクトルに同じ定数を加えても出力は変化しない(シフト不変性)。この性質は後述の数値安定化に利用される。正規化の一意性:ソフトマックスは、指数族分布の正準形として、与えられた対数オッズを確率に変換する唯一の関数ではないが、微分可能性単調性の要請を満たす標準的な選択である。

1.2.2 順序保存性

入力ベクトルの成分間の大小関係は、出力ベクトルにおいても保存される。すなわち、z_i > z_j ならば σ(z_i) > σ(z_j) が成り立つ。この性質により、最大の入力値に対応するクラスが最も高い確率を得るため、argmax操作の微分可能な近似として機能する。ただし、指数演算により差が増幅されるため、確率分布は尖った形状になりやすい。

1.3 微分と勾配

1.3.1 ヤコビ行列導出

ソフトマックス関数の微分は、出力の各成分が入力の全成分に依存するため、ヤコビ行列で表現される。成分 i, j に関する偏導関数は:

\[ \frac{\partial \sigma(z_i)}{\partial z_j} = \sigma(z_i)(\delta_{ij} - \sigma(z_j)) \]

ここで δ_{ij} はクロネッカーのデルタ(i = j のとき1、それ以外で0)。この形式は、対角成分に自己抑制項、非対角成分に負の相互影響項を持つ。

1.3.2 クロスエントロピー損失との関係

多クラス分類でよく用いられる、真の分布 p(one-hotベクトル)と予測分布 σ(z) のクロスエントロピー損失 L = -Σ p_i log σ(z_i) の勾配は、簡潔な形で与えられる:

\[ \frac{\partial L}{\partial z_i} = \sigma(z_i) - p_i \]

これは、出力と真の値の差がそのまま誤差信号となることを意味し、バックプロパゲーションの計算を効率化する。この性質がソフトマックス関数をニューラルネットワークの出力層とクロスエントロピー損失の組み合わせで非常に一般的なものにしている。

2 数値的実装と安定化

2.1 オーバーフロー問題

ソフトマックス関数の定義には指数演算 e^{z_i} が含まれるため、入力値が大きい(例えば z_i > 700 程度)場合、倍精度浮動小数点数の表現範囲を超えてオーバーフローを引き起こす。逆に、非常に負の値では指数が0に近似され、アンダーフローが発生する可能性がある。これらの問題は、実用的な実装において数値的不安定性をもたらす。

2.2 シフトトリック

オーバーフローを回避する一般的な手法は、入力ベクトルからその最大値を減算することである。すなわち、m = max(z₁, ..., z_K) として、各 z_i の代わりに z_i - m を使用する。ソフトマックスのシフト不変性により、この操作は出力を変えず、最大値を0にすることで指数計算を安全な範囲に収める。この手法は「シフトトリック」または「正規化トリック」と呼ばれる。

2.3 Log-Sum-Exp関数

対数ソフトマックスやクロスエントロピー計算において、log(Σ e^{z_i}) の形式が頻繁に現れる。この「Log-Sum-Exp」(LSE)関数も同様の数値問題に直面する。安定化のため、LSE(z) = m + log(Σ e^{z_i - m}) として計算する。これにより、指数項の最大値を1以下に抑え、アンダーフロー・オーバーフローを防ぐ。

2.4 対数ソフトマックス

対数領域でソフトマックス関数を計算する場合、log σ(z_i) = z_i - LSE(z) と表現できる。この対数ソフトマックスは、確率値そのものではなく対数確率が必要な場面(例えば数値的安定性が重要な損失関数の内部計算)で直接使用される。多くの深層学習フレームワークでは、ソフトマックスとクロスエントロピー損失を組み合わせた融合関数(softmax_cross_entropy)が実装されており、対数ソフトマックスを用いて安定化を図る。

3 応用分野

3.1 ニューラルネットワークの出力層

3.1.1 多クラス分類

最も古典的な応用は、ニューラルネットワークの最終層で各クラスのスコア(ロジット)を確率に変換することである。例えば画像認識で10クラスの分類を行う場合、最終層の10個の出力にソフトマックスを適用し、各クラスの推定確率を得る。損失関数にはクロスエントロピーが用いられ、勾配計算の簡潔さとも相まって、学習が効率的に進行する。

3.1.2 マルチラベル分類(二値分類との比較)

マルチラベル分類(1つの入力に複数のラベルが付与される問題)では、ソフトマックスは適切でない。各ラベルの確率は独立ではなく、総和が1に制約されるため、ラベル間の排他性を強制してしまう。この場合、各出力に独立にシグモイド関数(ロジスティック関数)を適用し、二値分類問題として扱うのが標準的である。一方、シングルラベルの多クラス分類ではソフトマックスが不可欠である。

3.2 注意機構(Attention Mechanism)

注意機構(Attention)では、クエリとキーの適合度スコアをソフトマックスで正規化し、値ベクトルの重み付き和を計算する。例えばTransformerアーキテクチャにおけるスケールド・ドットプロダクト注意では、内積をスケーリングした後にソフトマックスを適用して注意重みを生成する。この重みは確率解釈可能であり、モデルが入力のどの部分に注目すべきかを表現する。

3.3 強化学習における方策勾配法

強化学習の方策勾配法(Policy Gradient)では、方策π(as) をソフトマックス関数でモデル化することが多い。例えば行動価値 Q(s,a) や状態価値に基づいて行動の確率をパラメータ化し、ソフトマックス関数が各行動の選択確率を与える。これにより、確率的方策を直接最適化でき、探索と活用のバランスを自然に扱える。

3.4 トピックモデルと確率的分類

トピックモデル(例:LDA)や確率的生成モデルにおいて、ソフトマックス関数は文書中の単語分布やトピック分布をパラメータ化するために使用される。また、確率的分類器(例:多項ロジスティック回帰)では、特徴量の線形結合をソフトマックスに通すことで、各クラスの条件付き確率をモデル化する。これらは統計的学習の基本的なフレームワークである。

4 関連概念と変種

4.1 シグモイド関数との比較

シグモイド関数 σ(x) = 1/(1+e^{-x}) は、実数を (0,1) に写像するが、出力の総和は1にならない。二値分類ではシグモイドを単一の出力に用い、多クラス分類ではソフトマックスを用いる。ソフトマックスはシグモイドの多次元への一般化と見なせる(K=2の場合、ソフトマックスはシグモイドと等価になる)。シグモイドは個々の確率を独立にモデル化するのに対し、ソフトマックスはクラス間の排他性を陽に扱う。

4.2 スパースソフトマックス

スパースソフトマックス(Sparsemax)は、ソフトマックスの出力をスパース(多くの成分が正確に0)にする変種である。これは、ユークリッド射影を用いて単体上への射影を行うことで実現され、不要なクラスに対して確率0を割り当てる。スパースソフトマックスは、解釈性が重要なタスクや、多数のクラスを持つ問題で有効である。微分可能であり、注意機構などでも利用される。

4.3 温度パラメータ付きソフトマックス

温度パラメータ T > 0 を導入したソフトマックスは、σ(z_i; T) = e^{z_i/T} / Σ e^{z_j/T} と定義される。T が大きいほど出力分布は滑らか(エントロピーが高い)になり、T が小さいほど尖った分布(最大値に集中)になる。T → 0 の極限では argmax(one-hotベクトル)に近づく。この温度調整は、モデルの探索・活用バランスの調整や、知識蒸留(Knowledge Distillation)において教師モデルのソフトターゲットを生成するために用いられる。

4.4 階層的ソフトマックス

クラス数が非常に多い場合(例:言語モデルにおける語彙数数十万)、通常のソフトマックスは全クラスに対する総和計算が必要で計算コストが大きい。階層的ソフトマックス(Hierarchical Softmax)は、クラスを二分木など階層構造で表現し、各ノードで二値分類を繰り返すことで、対数時間で確率を計算する。これは効率的な近似手法であり、Word2Vecなどの単語埋め込み学習で広く使われた。損失関数の計算も同様に効率化される。