こんにちは!!ようこそ、当ブログgcbgardenへ。管理人のsakurabaaa(@sakurabaaa_g)です。
機械学習アルゴリズムの一つの手法であるディープラーニングのニューラルネットワークでよく使われるソフトマックス(softmax)関数の特徴と、Python、numpyで記述したコードをまとめました。
コードもあるのですぐ利用できます。
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関数を実装すると次のようになります。
123456import numpy as npdef softmax(x):exp_x = np.exp(x)y = exp_x / np.sum(np.exp(x), axis=1, keepdims=True)return y
np.sum()
では、”axis=1″と”keepdims=True”とします。
Numpyを使ったaxis(軸)を指定については以下のサイトがわかりやすいです。
おわりに
softmax関数でした。
ゼロから作るDeep Learningはわかりやすくておすすめです。
この記事を書いた人。
20代。とあるネットベンチャーでがんばる働き屋さん、ブロガー。
書きたいことを気ままに書いてます!
Python、プログラミング、米株、カメラ、野球観戦がすき。趣味は新宿散策。