Python DeepLearningに再挑戦 4 ニューラルネットワーク 出力層の設計
概要
Python DeepLearningに再挑戦 4 ニューラルネットワーク 出力層の設計
参考書籍
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
恒等関数とソフトマックス関数
恒等関数->入ってきたものに対して何も手を加えずに出力する関数
ソフトマックス関数-> yk = exp(ak)/ nΣi=1 exp(ai) ※普通の表記だと全然表記できないなぁ。 重要なのは、ソフトマックス関数の分子は入力信号Akの指数関数、分母はすべての入力信号の指数関数の和になっている。多分、このことによって、各信号の結果の重さがわかるようになっている。。はず。 あとは、各ニューロンは、すべて入力信号から影響を受ける。
ソフトマックス関数の実装
import numpy as np a = np.array([0.3, 2.9, 4.0]) exp_a = np.exp(a) # 指数関数 sum_exp_a = np.sum(exp_a) # 指数関数の和 y = exp_a / sum_exp_a # ソフトマックス関数 # ソフトマックス関数の実装 def softmax(a): exp_a = np.exp(a) sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y
ただ、指数関数の計算をそのままするとオーバーフローしてしまうため、計算結果が不安定になってしまう。そのため、最大値との差で、数値を置き換えるのが一般的とのこと。
a = np.array([1010, 1000, 990]) np.exp(a) / np.sum(np.exp(a)) # 数が大きすぎてエラーが出てしまう。 c = np.max(a) # 最大値を求める a-c np.exp(a-c)/np.sum(np.exp(a-c)) # 最大値との差を基準にして作成する。 # 上記を踏まえた上での再度softmax関数を実装する。 def softmax(a): c = np.max(a) exp_a = np.exp(a-c) sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y
ソフトマックス関数の特徴
- ソフトマックス関数の出力は、0~1.0の間の実数
- 出力の総和は、1になる。
- そのため、出力を確率として解釈することができる。
- ソフトマックス関数は、大小関係については、変化がないため、推論フェーズでの出力層では省略することが一般的。ただ、学習時にはソフトマックス関数を出力層で使う(こともある?)
出力層のニューロンの数
クラス分類の場合は、出力層のニューロンの数は分類したいクラスの数を設定するのが一般的。例えば0〜9の手書き文字のどれかを予測する場合は、以下のように出力層を設定する。
次回から、実践的な実装をしてみる。