以下の内容はhttps://pydocument.hatenablog.com/entry/2023/10/06/024044より取得しました。


機械学習におけるソフトマックス(Softmax)関数の解説とPythonでの実装

この記事では、ソフトマックス(Softmax)関数について具体例を挙げながら概要を解説し、最後にPythonでの実装方法を解説します。

ソフトマックス関数とは

ソフトマックス関数は、多クラス分類問題において、各クラスに属する確率を計算するために使用される関数です。 出力は0から1の範囲の値をとり、すべての出力値の合計は1になります。 この性質により、ソフトマックス関数の出力は確率分布として解釈できます。

ソフトマックス関数の役割

ソフトマックス関数は、主に以下の役割を担います。

  1. クラス分類確率の算出: 多クラス分類において、各クラスに属する確率を出力します。例えば、「入力データがクラスAである確率は0.7、クラスBである確率は0.2、クラスCである確率は0.1」といった情報を得られます。
  2. 多クラス分類モデルの学習と評価: モデルの学習時には、出力された確率分布と正解ラベルとの誤差を計算します。評価時には、最も高い確率を持つクラスを予測結果とします。
  3. ニューラルネットワークの出力層: 分類問題において、ニューラルネットワークの出力層にソフトマックス関数を用いることで、モデルの出力を確率分布として扱えます。

ソフトマックス関数の定義

ソフトマックス関数は、以下の式で定義されます。

 \displaystyle
\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}}

ここで、

  •  x_i : i番目のクラスに対応する入力値
  •  K : クラスの総数
  •  \text{softmax}(x_i) : i番目のクラスに属する確率

を表します。

具体的な計算例

シナリオ ある画像認識システムを開発しているとします。このシステムは、写真に写っている動物が「犬」「猫」「鳥」のどれであるかを判定します。システムは、それぞれの動物である可能性を数値(スコア)として出力します。

入力データ ある写真に対するシステムの出力スコアが、[2.0, 1.0, 0.1] だったとします。 * 2.0: 「犬」であると判定されたスコア * 1.0: 「猫」であると判定されたスコア * 0.1: 「鳥」であると判定されたスコア

ソフトマックス関数による確率計算 このスコアをソフトマックス関数に入力して、各クラスに属する確率を計算してみましょう。

  1. 各入力値の指数関数を計算:
    •  e^{2.0} \approx 7.389
    •  e^{1.0} \approx 2.718
    •  e^{0.1} \approx 1.105
  2. 指数関数の合計値を計算:
    •  7.389 + 2.718 + 1.105 \approx 11.212
  3. 各指数関数値を合計値で割る:
    •  7.389 / 11.212 \approx 0.659 (犬である確率)
    •  2.718 / 11.212 \approx 0.242 (猫である確率)
    •  1.105 / 11.212 \approx 0.099 (鳥である確率)

結果 以上の計算により、入力スコア[2.0, 1.0, 0.1]に対するソフトマックス関数の出力(確率分布)は[0.659, 0.242, 0.099]となります。 つまり、システムは、写真に写っている動物が、約65.9%の確率で「犬」、約24.2%の確率で「猫」、約9.9%の確率で「鳥」であると判定したことになります。

ソフトマックス関数を通すことで、単なるスコアの比較(この例では犬のスコアが一番高い)だけでなく、それぞれのクラスに属する確率を具体的な数値で把握できるようになります。これにより、システムの判定結果をより詳細に解釈したり、閾値を設けて判定の信頼性を評価したりすることが可能になります。

Pythonによる実装

基本的な実装

引数に入力配列を受け取るsoftmax関数を実装します。NumPyのexp関数を利用し、配列の各要素に対して指数関数を計算します。 計算した指数関数の配列の各要素をその合計値で割ることで正規化し、確率分布を返します。

import numpy as np

def softmax(x):
    exp_x = np.exp(x)
    return exp_x / np.sum(exp_x)

# 使用例
input_data = np.array([2.0, 1.0, 0.1])
output_probabilities = softmax(input_data)

print("入力データ:", input_data)
print("出力確率:", output_probabilities)
print("出力確率の合計:", np.sum(output_probabilities))

数値安定性を考慮した実装

ソフトマックス関数の計算では、入力値が大きい場合にオーバーフローが発生する可能性があります。 対策として、入力値から最大値を引くことで数値的な安定性を向上できます。

基本的なコードからの変更点

  • 入力の最大値計算: max_x = np.max(x)
  • 安定化指数の計算: exp_x = np.exp(x - max_x)
import numpy as np

def softmax(x):
    max_x = np.max(x)
    exp_x = np.exp(x - max_x)
    return exp_x / np.sum(exp_x)

# 使用例
input_data = np.array([2.0, 1.0, 0.1])
output_probabilities = softmax(input_data)

print("入力データ:", input_data)
print("出力確率:", output_probabilities)
print("出力確率の合計:", np.sum(output_probabilities))

実行結果

どちらの実装でも、以下の結果が得られます。

入力データ: [2.  1.  0.1]
出力確率: [0.65900114 0.24243297 0.09856589]
出力確率の合計: 1.0

まとめ

本記事では、ソフトマックス関数の定義、役割、計算例、およびPythonでの実装方法を解説しました。ソフトマックス関数は、機械学習の多クラス分類問題において重要な役割を果たす関数であり、その理解と実装は機械学習の応用において不可欠です。最後にPythonの学習に利用できるUdemy iconのサイトを紹介します。ぜひ活用ください。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com




以上の内容はhttps://pydocument.hatenablog.com/entry/2023/10/06/024044より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14