Machine Morning

機械学習やWebについて学んだことを記録しています。

なぜソフトマックス関数にeを使うのか

ソフトマックス関数はニューラルネットワークにおいてスコア(affine layerから出力された値)を確率に変換する役割を持っている。しかしなぜわざわざ eを底として累乗するのだろうか。

ソフトマックス関数とは

ソフトマックス関数による出力値はニューラルネットワークでは確率として捉えることができる。すなわち、任意のソフトマックス関数による出力値は[0, 1]の範囲の実数値を得ることになる。これは分類問題では、あるクラス(出力層のユニット)に分類される確率として解釈可能である。なお確率なのですべてのユニットの確率を足し合わせると1になる。ソフトマックス関数は以下の数式で表される。

 y_{k}=\dfrac {e^{s_{k}}}{\sum ^{n}_{i=1}e^{s_{i}}}

ここで y_{k}は出力層のユニットが全部で n個ある場合の k番目のクラスに属する確率、右辺の分母 \sum ^{n}_{i=1}e^{s_{i}} eを各ユニットのスコアで累乗したものの総和、分子は e k番目のスコアで累乗したもの、 sはスコアの値である。

確率を求めるなら、スコアをスコアの総和で割ったものを確率とみなすことはできないのかと疑問になるかもしれない。しかしスコアは負の値を取ることもあるため、そのままでは負の値を出力することもあり確率にはならない。もう一度確認しておくがソフトマックス関数を使う目的はスコアを確率に変換することである。任意のスコアを[0, 1]の範囲の実数値に変換できなければ確率にはならない。

では、絶対値を取って同じ作業をすればよいだろうか。残念ながらこれも確率にはならない。

ネイピア数 eの説明はググればいくらでも出てくるので細かいことはそちらに任せるとして、ここではネイピア数 eがソフトマックス関数に使われる理由を理解するために e ^xという関数の特徴にフォーカスする。

f:id:gensasaki:20180829233857j:plain

これは e ^xのグラフであるが、見てわかる通りスコアが負の値でも e^xを通すと正の値になる。また、右肩上がりの単調増加関数である。

大事なのは e^x正の値を返す単調増加関数であることだ。

スコアの値に正の値と負の値が混在している場合、絶対値を取るとスコアの大小関係がごちゃごちゃになってしまう。例えば[5, -3, 2]というスコアが得られた場合、大小関係は 5 \gt 2 \gt -3である。しかし絶対値を取ると 5 \gt 3 \gt 2という順序に大小関係が変わってしまう。これを解決してくれるのが単調増加関数である。 e^x非線形関数であるため、大小の比率を保つことはできないが、大小関係は維持されるのである。

ソフトマックス関数の出力値を確率と捉えることの妥当性

 e^xという非線形変換を行って確率と捉えてよいのだろうか。結論としては近似値であり予測値でもあるので少々目をつむって確率と捉えてよいである。確率に変換したいのだから線形な関数で変換したいところだが、必ず[0, 1]の範囲の値を返す線形な単調増加関数 y = axは存在しない。そもそも活性化関数に線形関数を用いると層を重ねる意味がなくなってしまう。また勾配を求めて損失を逆伝搬させる際に e^x微分しても e^xであるという性質上便利であるということから、ソフトマックス関数に e^xを用いることは好都合なのだ。しかし各書でソフトマックス関数の出力値を確率として解釈可能であると当然のように書かれていることには疑いの目を持ってよいだろう。