Edited at

ゼロから作る Deep Learning 勉強メモ #6

More than 1 year has passed since last update.


はじめに

https://www.oreilly.co.jp/books/9784873117584/

https://www.amazon.co.jp/dp/4873117585

この記事は #5 の続きです。

勉強メモ#1

勉強メモ#2

勉強メモ#3

勉強メモ#4

勉強メモ#5

勉強メモ#7


ソフトマックス関数の実装

ソフトマックス関数を実装します。


式をそのまま実装

数式をそのまま実装してみます。

数式をここに載せたかったんですが、数式を編集する環境がありません。

コメントにて、Qiita で数式が書けることを教えていただきました。

y_k = \frac{exp(a_k)}{\sum_{i = k}^{n} exp(a_i)}

def softmax(x):

top = np.exp(x)
bottom = np.sum(np.exp(x))
return top / bottom

これを #5 で作ったソースコードに合体して、出力層で使ってみます。

### 関数の定義は省略

if __name__ == '__main__':
network = init_network()
X = np.array([0.1, 0.2])
Y = eval_3_network(X, network, sigmoid, identity)
print('identity')
print(Y)
Y = eval_3_network(X, network, sigmoid, softmax)
print('softmax')
print(Y)

実行結果はこのようになりました。

identity

[ 0.37908796 0.61567478]
softmax
[ 0.44112765 0.55887235]


各信号から最大値を減算する場合

出力層の入力の最大値を、各信号から引くことで、np.exp の値がオーバーフローするのを防ぎます。

y_k = \frac{exp(a_k - max(a))}{\sum_{i = k}^{n} exp(a_i - max(a))}

def softmax(x):

c = np.max(x)
top = np.exp(x - c)
bottom = np.sum(np.exp(x - c))
return top / bottom

実行結果はこのようになりました。

identity

[ 0.37908796 0.61567478]
softmax
[ 0.44112765 0.55887235]

当然ですが、結果は同じになります。