ニューラル ネットで使用されるシグモイド関数を確認すると、https : //en.wikipedia.org/wiki/Softmax_function#Softmax_Normalization から次の式が見つかりました。
標準のシグモイド方程式とは異なります。
一番上の最初の方程式には平均値と標準偏差が含まれています(記号を間違って読んでいないことを願っています)が、2番目の方程式はマイナス平均を一般化し、標準偏差で割った定数です。これは、ベクトル内のすべての項で同じであるためです。 /マトリックス/テンソル。
したがって、方程式を実装すると、異なる結果が得られます。
2 番目の式 (標準のシグモイド関数) を使用すると、次のようになります。
def sigmoid(x):
return 1. / (1 + np.exp(-x))
これらの出力が得られます:
>>> x = np.array([1,2,3])
>>> print sigmoid(x)
[ 0.73105858 0.88079708 0.95257413]
私は最初の関数が似ていることを期待していましたが、最初と2番目の要素の間のギャップはかなり広がっています(ただし、要素のランキングは残っています:
def get_statistics(x):
n = float(len(x))
m = x.sum() / n
s2 = sum((x - m)**2) / (n-1.)
s = s2**0.5
return m, s2, s
m, s, s2 = get_statistics(x)
sigmoid_x1 = 1 / (1 + np.exp(-(x[0] - m) / s2))
sigmoid_x2 = 1 / (1 + np.exp(-(x[1] - m) / s2))
sigmoid_x3 = 1 / (1 + np.exp(-(x[2] - m) / s2))
sigmoid_x1, sigmoid_x2, sigmoid_x3
[アウト]:
(0.2689414213699951, 0.5, 0.7310585786300049)
おそらく、最初の方程式に何らかのソフトマックス正規化が含まれているという事実に関係している可能性がありますが、それが一般的なソフトマックスである場合、要素は合計して 1 になる必要があります。
def softmax(x):
exp_x = np.exp(x)
return exp_x / exp_x.sum()
[アウト]:
>>> x = np.array([1,2,3])
>>> print softmax(x)
[ 0.09003057 0.24472847 0.66524096]
しかし、最初の方程式からの出力は合計が 1 にならず、標準のシグモイド方程式と類似/同じではありません。質問は次のとおりです。
- 式 1 の関数を間違って実装しましたか?
- ウィキペディアの式 1 は間違っていますか? それとも、実際にはシグモイド/ロジスティック関数ではなく、何か他のものを参照していますか?
- 1 番目と 2 番目の式に違いがあるのはなぜですか?