1. ホーム
  2. パイソン

[解決済み】PythonでSoftmax関数を実装する方法

2022-04-02 09:35:46

質問

から Udacityのディープラーニングの授業 y_i のソフトマックスは、単純に Y ベクトル全体の指数和で割った指数となります。

どこ S(y_i) のソフトマックス関数です。 y_ie は指数であり j は入力ベクトルYの列数である。

以下のように試してみました。

import numpy as np

def softmax(x):
    """Compute softmax values for each sets of scores in x."""
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum()

scores = [3.0, 1.0, 0.2]
print(softmax(scores))

を返します。

[ 0.8360188   0.11314284  0.05083836]

しかし、提案された解決策は

def softmax(x):
    """Compute softmax values for each sets of scores in x."""
    return np.exp(x) / np.sum(np.exp(x), axis=0)

を生成します。 最初の実装と同じ出力 最初の実装では、各列の差分と最大値を明示的に取り、その合計で割っているにもかかわらず、です。

誰かその理由を数学的に示してくれませんか?一方が正しくて、もう一方は間違っているのでしょうか?

コードと時間の複雑さの点で、両者の実装は似ていますか?どちらがより効率的ですか?

どのように解決するのですか?

どちらも正しいのですが、数値の安定性の観点から、あなたの方が好ましいと思います。

でスタートします。

e ^ (x - max(x)) / sum(e^(x - max(x))

a^(b - c) = (a^b)/(a^c) であることを利用すると、次のようになります。

= e ^ x / (e ^ max(x) * sum(e ^ x / e ^ max(x)))

= e ^ x / sum(e ^ x)

というのは、もう一つの答えに書いてあることです。max(x)を任意の変数に置き換えても打ち消されます。