Pythonでニューラルネットワークの活性化関数softmax関数を実装

Share

こんにちは!!ようこそ、当ブログgcbgardenへ。管理人のsakurabaaa(@sakurabaaa_g)です。

機械学習アルゴリズムの一つの手法であるディープラーニングのニューラルネットワークでよく使われるソフトマックス(softmax)関数の特徴と、Python、numpyで記述したコードをまとめました。

コードもあるのですぐ利用できます。

※本プログラムは、数値計算ライブラリNumpyや描画ライブラリmatplotlibを使いJupyter Notebookでコードを実行しています。いますぐコードを実行し、結果をみてみたい方は「Jupyter Notebook」にアクセスし、「Try it in your browser」で実践してみてください。
スポンサーリンク

softmax関数とは

ディープーラニングの文脈ではソフトマックス(softmax)関数はニューラルネットワークの出力が多クラスのときに出力層で使われる関数です。

ソフトマックス関数は次式で定義されます。

$$softmax(x) = \frac{e^{x_i}}{\sum_{j=1}^{m}e^{x_j}}$$

例えば、以下のベクトル(行列)\( x \)をsoftmax関数にいれてみると、

$$
x = [1,1,2] $$

出力は次のようになります。

$$[ 0.21194156, 0.21194156, 0.57611688]$$

出力を\( sum \)する(足し合わせる)。

$$[ 1 ]$$

合計は「1」になります。

このように複数の出力がある場合にそれぞれの値を確率のように捉えることができます。

シグモイド関数では1つしか出力できませんでしたが、ソフトマックスでは複数(マルチ)の出力を得ることができるため手書き数字の分類のように2クラス以上の分類が可能になります。

参考A yet another brief introduction to neural networks

Pythonでsoftmax関数

例えば次のような行列\( x \)があったとします。

$$
x = \left(
\begin{array}{ccc}
1 & 1 & 3 \\
5 & 2 & 2 \\
1 & 3 & 1
\end{array}
\right)
$$

ニューラルネットワークの文脈では行(または列)単位で出力を考えます(確率分布)。

mnistで手書きの8に対してのソフトマックス
[0.05, 0.01, 0.04, 0.1, 0.02, 0.05, 0.2, 0.03, 0.4, 0.1]

左の要素から数字の0,1,2,….9の予測確率に対応(4割の確率で8だと予測している)
すべての要素を足すと1になる。

参考ソフトマックス関数実装したヅラ

上の行列\( x \)の出力は次のようになります。

$$
[ 0.21194156, 0.21194156, 0.57611688]\\
[ 0.909443 , 0.0452785 , 0.0452785 ]\\
[ 0.10650698, 0.78698604, 0.10650698] $$

行ごとに足し合わせると「1」になり、3行3列の行列をすべて足すと「3」になります。

Pythonでsoftmax関数を実装すると次のようになります。

      

np.sum()では、”axis=1″と”keepdims=True”とします。

Numpyを使ったaxis(軸)を指定については以下のサイトがわかりやすいです。

参考NumPyでのaxis指定

おわりに

softmax関数でした。

ゼロから作るDeep Learningはわかりやすくておすすめです。

この記事を書いた人。
20代。とあるネットベンチャーでがんばる働き屋さん、ブロガー。
書きたいことを気ままに書いてます!
Python、プログラミング、米株、カメラ、野球観戦がすき。趣味は新宿散策。

スポンサーリンク

Share

Follow