AIでよく使われるSoftmax関数について

—

by

in

Softmax関数とは?
Softmax関数は、機械学習や深層学習の分野でよく利用される関数のひとつです。特に「分類問題」において、モデルの出力を確率分布に変換する役割を持っています。

数式で表すと
入力ベクトルを $$ \mathbf{z} = (z_1, z_2, …, z_n)$$ としたとき、Softmax関数は次のように定義されます:

$$
\mathrm{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^n e^{z_j}}
$$

この式によって、各出力は 0から1の範囲 に正規化され、さらに 全ての出力の総和は1 になります。これにより「確率」として解釈することができます。

主な用途
– 分類問題:多クラス分類の出力層で使用され、各クラスに属する確率を算出します。
– ニューラルネットワーク:出力層で活性化関数として用いられることが多いです。
– 意思決定:強化学習などで、行動の選択確率を決めるのに利用されることもあります。

注意点
– 入力値が大きすぎるとオーバーフローが発生する可能性があるため、実装時には数値安定化の工夫(例:最大値を引いて計算する)が必要です。
– 出力確率が「信頼度」と完全に一致するとは限らないため、過信しないように注意が必要です。


図解イメージ(Softmaxの動作)

例えば3クラス分類を考え、モデルの出力(スコア)が次のようだったとします:

  • クラスA:2.0
  • クラスB:1.0
  • クラスC:0.1

Softmaxを適用すると、それぞれを指数関数に通した後に正規化し、以下のように確率に変換されます:

  • クラスA:約0.65
  • クラスB:約0.24
  • クラスC:約0.11

これにより「クラスAが一番可能性が高い」と解釈できます。

(ここに棒グラフ風の図を入れるとさらに分かりやすいです)


Pythonによる実装例

import numpy as np

def softmax(x):
    # 数値安定化のため最大値を引く
    x = x - np.max(x)
    exp_x = np.exp(x)
    return exp_x / np.sum(exp_x)

# サンプル入力
scores = np.array([2.0, 1.0, 0.1])
probs = softmax(scores)

print("入力スコア:", scores)
print("Softmax出力:", probs)
print("合計:", np.sum(probs))

出力例:

入力スコア: [2.  1.  0.1]
Softmax出力: [0.65900114 0.24243297 0.09856589]
合計: 1.0

このようにSoftmaxを使うと、出力を確率分布として扱えるようになります。