🐮

ソフトマックス関数について

2023/07/28に公開

今回はソフトマックス関数について解説します。

ソフトマックス関数とは

y_k=\dfrac{e^{a_k}}{\sum\limits_{i=1}^n e^{a_i}}

で表される関数です。
難しそうに見えますが、実は簡単な割合計算です。

理解するための例として、{a_1,a_2,a_3}の中で{a_1}の割合を求めたい場合、\dfrac{a_1}{a_1+a_2+a_3}と計算すると思います。
ソフトマックス関数はこの数値を、e^{a_1}のようにeの指数にaを当てはめたものに変えただけです。上記の例では

y_1=\dfrac{e^{a_1}}{e^{a_1}+e^{a_2}+e^{a_3}}

のようになります。
結果として、それぞれの値の割合を出力することができます。

なぜeの累乗を使用するのでしょうか?それは次で説明します。

eの累乗を使用する理由

eの累乗を使用する理由について、4つ簡単に説明します。

・非線形性
 ソフトマックス関数は非線形関数であり、モデルの表現力を向上させることができます。(重要)

・強調効果
 指数関数e^aは、入力値aが大きくなると出力値e^aが爆発的に大きくなる特性があります。
これにより、ソフトマックス関数は、入力の最大値a_{max}を強調(他の値と比較して大きく)します。

・微分可能
 ソフトマックス関数は微分可能であり、これにより誤差逆伝搬法というパラメータ最適化手法を利用することができます。

・ゼロ除算の排除
 仮にaが全て0であっても、ゼロ除算を発生させず計算することができます。

重要な特性

ソフトマックス関数には重要な特性があります。
・出力の合計が常に1になる(規格化)
というものです。割合計算なので当然なのですが、この特性によって、それぞれの出力値を、多クラス分類問題の確率としてそのまま利用することができるようになっています。
※入力画像に対するクラスが(犬、猫、ゴリラ)で、出力(0.1,0.2,0.7)の場合、7割の確率でゴリラである、とそのまま予測できます

ソフトマックス関数は、この特性や微分可能性から、多クラス分類の出力層としてよく利用されています。

今回はここまでです。読んでいただきありがとうございました!

おまけ:実装上の注意

自分でソフトマックス関数を実装する場合、計算のオーバーフローに注意する必要があります。
例えばa_1=10000の場合、ソフトマックス関数はx^{10000}を計算し、PC上ではオーバーフローによってnanが出力されます。

そのため実装する際は分母分子にCをかけて、
y_k=\dfrac{e^{a_k}}{\sum\limits_{i=1}^n e^{a_i}}
=\dfrac{e^{a_k}×C}{\sum\limits_{i=1}^n e^{a_i}×C}
=\dfrac{e^{a_k+logC}}{\sum\limits_{i=1}^n e^{a_i+logC}}
=\dfrac{e^{a_k+C'}}{\sum\limits_{i=1}^n e^{a_i+C'}}

として、C'は分数の等価性よりどんな値でも良いので、
例えばこれに{{a_1},{a_2},{a_3}}の最大値にマイナスをかけた-a_{max}を代入すれば、{a}の最大値が0となり、他のa値は全てマイナスとなる(割合は変わらない)ので、eの指数が大きくなりすぎることを防ぐことができます。

注意して実装しましょう。

Discussion