edo1z blog

プログラミングなどに関するブログです

ソフトマックス関数

合計が1になるように、うまく数字を調整してくれる関数らしい。確率を確認するのに便利。

[mathjax] $$y_k = \frac{\exp(a_k)}{\displaystyle \sum_{i=1}^n \exp(a_i)}$$

aがn個あるときの、k番目のyを取得する。分母は全てのaの指数関数の和。分子はk番目のaの指数関数。

pythonで書くと下記になります。

a = np.array([0, 2.3, 3.5])
exp = np.exp(a)
sum_exp = np.sum(exp)
y = exp / sum_exp
print(y)

指数関数を使っているので数字がものすごく大きくなる可能性があり、それによってオーバフローで変な数値が返ってくる場合があるため、aの最大値をそれぞれのaの値から引きます。これで全部0かマイナスになります。

a = np.array([0, 2.3, 3.5])
c = np.max(a)
dexp = np.exp(a - c)
sum_exp = np.sum(exp)
y = exp / sum_exp
print(y)

ソフトマックス関数は、aのそれぞれの値の大きさの順番は変えません。なので、一番大きいaを取得したい場合は、ソフトマックス関数は不要です。

ディープラーニングの出力層で使う活性化関数は、回帰問題だと恒等関数、2クラス分類問題はシグモイド関数、多クラス分類問題はソフトマックス関数を使うのが一般的だそうです。シグモイドは0か1かを表すし、ソフトマックスは、複数の選択肢の確からしさを数値で表すからだと思います。回帰は数値を予測するので確率にする必要がないので恒等関数なんだと思います。