別名・略称:ソフトマックス
softmax(Softmax Function):出力をクラス確率に変換する関数
logits = [2.0, 1.0, 0.1] の場合:
| クラス | logit z | e^z | 確率 |
|---|---|---|---|
| A | 2.0 | 7.39 | 0.659 |
| B | 1.0 | 2.72 | 0.242 |
| C | 0.1 | 1.11 | 0.099 |
| 合計 | — | 11.22 | 1.000 |
argmax は A(最高確率 0.659)。
3 クラス分類(猫/犬/鳥)のロジット = [2.0, 1.0, 0.1] のとき:
SSDSE-B-2026(47 都道府県・2023 年データ)を題材にした最小コード:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import numpy as np def softmax(z, temperature=1.0): z = np.asarray(z) / temperature z = z - z.max() # 数値安定化 e = np.exp(z) return e / e.sum() print(softmax([2.0, 1.0, 0.1])) # [0.659, 0.242, 0.099] # Temperature を上げると分布が平坦に print(softmax([2.0, 1.0, 0.1], temperature=5.0)) |
この用語『ソフトマックス関数』を理解するうえで併せて押さえたい関連キーワード群です。 クリック(ホバー)で関連用語ページに飛べます。
ソフトマックスは「ベクトルを確率分布に変換」する関数。 例えば logit が [2.0, 1.0, 0.1] なら、 指数 → 正規化で [0.66, 0.24, 0.10] となり、 合計が 1 になる。 多クラス分類の出力層、 アテンションの重み計算、 ボルツマン分布、 強化学習の方策表現など、 「離散選択を確率的に表現したい」場面で必ず登場する。
ソフトマックス関数(Softmax Function)は単独で覚えるものではなく、 活性化関数 という大きな枠組みの中での位置づけを理解することで応用範囲が広がります。 本ページの『🌐 関連手法』『🔗 関連用語』『📚 グループ教材』を順に辿ると、 関連概念のネットワークが見えてきます。
特に SSDSE-B のような実データに当てはめてみると、 教科書では抽象的に語られる概念が『47 都道府県の現実』に紐付き、 数字の意味が腑に落ちやすくなります。 次の『🧮 実値で計算してみる』セクションでは、 公開統計データを使って手を動かす例を紹介します。
47 都道府県を「人口に応じた重み付き選択」する場面で softmax が使える。 例:人口(A1101)を logit として softmax をかけると、 各県の人口比重に応じた確率になる。 温度 T を上げると一様、 下げると最大県(東京都)に集中する分布になる。
| 項目 | 条件 / 入力 | 結果 / 解釈 |
|---|---|---|
| 東京都 (1404万) | logit 14.04 | softmax 値 約 0.30 |
| 神奈川県 (922万) | logit 9.22 | softmax 値 約 0.20 |
| 大阪府 (878万) | logit 8.78 | softmax 値 約 0.19 |
| 愛知県 (746万) | logit 7.46 | softmax 値 約 0.16 |
| … | … | … |
| 鳥取県 (54.6万) | logit 0.546 | softmax 値 約 0.003 |
※ 数値は SSDSE-B-2026.csv から抽出した実値、 もしくは典型的な学習設定での目安値です。 細部の数値は前処理・乱数 seed・実装により変動します。
公的データ SSDSE-B(47 都道府県社会・人口統計)を読み込み、 ソフトマックス関数 を実際に動かす最小コードです。 引数のパスは平易さ優先で直書きしています。
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', header=1, encoding='utf-8')
pop = df['A1101'].astype(float).values
def softmax(z, T=1.0):
z = z / T
z = z - z.max() # 数値安定化
e = np.exp(z)
return e / e.sum()
# 各都道府県の人口比重を softmax で表現
weights = softmax(pop / 1e6, T=1.0)
for name, w in zip(df['Prefecture'], weights):
print(f'{name}: {w:.4f}')
※ 上記スニペットは Python 3.10+ / pandas 2.x / numpy / scikit-learn を想定。 環境構築は『conda create -n ds python=3.11 pandas scikit-learn matplotlib』で十分です。
温度 $T$ 付きソフトマックス。 $T \to 0$ で argmax、 $T \to \infty$ で一様分布に近づく。
数式の各記号が『何の量で、 どの空間に住み、 どんな単位を持つか』を意識すると、 暗記でなく構造として理解できます。 SSDSE-B の都道府県データに当てはめて、 各シンボルが何に対応するかを上の Python 実装で確認しましょう。
まずは本ページの『💡 30 秒で分かる結論』と『🎨 直感で掴む』で全体像を掴み、 次に『🧮 実値で計算してみる』を 手を動かして追体験するのが最短です。 数式や深い理論はその後で十分。
本ページの『🌐 関連手法・派生』『🔗 関連用語』で対比される手法を確認し、 それぞれの適用条件と得意・不得意を表で比較するのが効果的です。 SSDSE-B のような共通データセットで両方走らせて結果を見ると違いが体感できます。
サンプル数 n、 特徴次元 d、 反復回数 T のどれに対して、 計算量が線形 / 二乗 / 指数のどれかを必ず把握してください。 47 都道府県(n=47)程度では問題にならなくても、 n=10^6 ではメモリや時間で破綻することがよくあります。
『点推定値』だけでなく『不確実性(CI、 SE、 分散)』『前提条件のチェック結果』『代替手法との比較』『データ取得日と seed』をセットで報告するのが標準。 査読・レビューで問われる典型ポイントです。
『ソフトマックス関数』は『活性化関数』カテゴリに属する重要概念で、 以下の関連概念群と密接につながっています。
活性化関数
├── 前提
│ └── 数学・統計の基礎
├── ソフトマックス関数 ← このページ
│ ├── 派生 1
│ ├── 派生 2
│ └── 応用
└── 並列・対比される手法
├── 別アプローチ A
└── 別アプローチ B
完全な概念マップは 🗺 概念マップ で確認できます。
1959 年 Luce の選択公理で連続化された分類モデルとして登場。 統計力学のボルツマン分布が起源。 ニューラルネットの多クラス分類層として標準。 注意機構(2014, Bahdanau)、 強化学習の方策(policy gradient)、 強化学習の温度サンプリングと、 現代 ML の至る所で活躍。
『誰が、 いつ、 何のために提唱したか』を知ると、 用語が単なる記号ではなく 研究者たちの努力と発見の連鎖 として血の通った概念になります。 関連論文の原典に当たることで、 教科書では削られた『なぜそうしたか』のニュアンスが分かります。
『ソフトマックス関数』は理論だけでなく、 産業・研究の様々な現場で実用されています。 ここでは代表的な応用を 6 つ挙げます。
どの応用も「何を入力とし、 何を出力すべきか」を整理した上で、 上の Python 実装をベースに拡張するアプローチが定石です。 SSDSE-B のような公開データセットで小さく試し、 動作確認できてから本番データに展開すると安全です。
『ソフトマックス関数』には多くの派生・バリエーションがあります。 代表的なものを精度・特徴で比較した表です。
| 手法 / バージョン | 指標 / 特徴 | 備考 |
|---|---|---|
| 通常 softmax | $O(K)$ | K クラス出力 |
| Hierarchical Softmax | $O(\log K)$ | 大語彙向け |
| Sampled Softmax | サンプル近似 | 学習時のみ |
| Gumbel Softmax | 離散変数の連続化 | 微分可能 |
| Sparsemax | スパース出力 | 解釈性↑ |
数値は論文公表時点のもので、 計測条件(データ・前処理・ハイパーパラメータ)が異なります。 自分の問題で再評価することを推奨。
『ソフトマックス関数』は周辺の似た用語と混同されがちです。 ここでは特に紛らわしい用語との本質的な違いを整理します。
data/raw/SSDSE-B-2026.csv。 47 都道府県の社会・人口指標