Python での NumPy Softmax

Muhammad Waiz Khan 2023年1月30日
  1. Python で 1 次元配列に対する NumPy ソフトマックス関数
  2. Python での 2 次元配列のための NumPy ソフトマックス関数
Python での NumPy Softmax

このチュートリアルでは、Python の NumPy ライブラリを使って softmax 関数を実装する方法を説明します。softmax 関数は、ロジスティック関数の一般化された多次元形式です。多項ロジスティック回帰や人工ニューラルネットワークの活性化関数として使用されます。

softmax 関数は、配列のすべての要素を確率として扱えるように、区間 (0,1) の中で正規化します。softmax 関数は次の式で定義されています。

softmax 式

Python で NumPy ライブラリを使って 1 次元配列や 2 次元配列にソフトマックス関数を実装する方法を見ていきます。

Python で 1 次元配列に対する NumPy ソフトマックス関数

1 次元配列を入力とし、正規化された配列を返すソフトマックス関数を定義する必要があるとしましょう。

softmax を適用する際に発生する一般的な問題は、数値的安定性の問題です。このオーバーフローエラーは、配列の各値を最大値で減算することで解決できます。

以下のコード例は、softmax 関数のオリジナルの実装と、Python の NumPy ライブラリを用いた max 減算による実装を示しています。

  • オリジナルの softmax
import numpy as np


def softmax(x):

    f_x = np.exp(x) / np.sum(np.exp(x))
    return f_x
  • 数値的に安定した softmax
import numpy as np


def softmax(x):

    y = np.exp(x - np.max(x))
    f_x = y / np.sum(np.exp(x))
    return f_x

Python での 2 次元配列のための NumPy ソフトマックス関数

2 次元配列の softmax 関数は、行に沿って softmax 変換を行います。1 次元配列の場合、これらのことを気にする必要はありません。

以下のコード例は、Python の NumPy ライブラリを用いて、2 次元配列の入力に対してどのように softmax 変換が行われるかを示しています。

import numpy as np


def softmax(x):

    max = np.max(
        x, axis=1, keepdims=True
    )  # returns max of each row and keeps same dims
    e_x = np.exp(x - max)  # subtracts each row with its max value
    sum = np.sum(
        e_x, axis=1, keepdims=True
    )  # returns sum of each row and keeps same dims
    f_x = e_x / sum
    return f_x

2 次元配列の列に沿って softmax 変換を行う必要があるとしましょう。上記の softmax() メソッドの入力と出力を転送するだけでそれを行うことができます。

コード例:

softmax(x.T).T