03-2-出力層の設計
作成日:2022年11月17日
更新日:2022年11月17日
2. 出力層の設計
出力層とは
出力層(ニューラルネットワークの最後の部分)
出力関数の種類
恒等関数
- 与えられた入力をそのまま返す関数
- 主に回帰問題で利用
ソフトマックス関数
- 総和が1になるように分配する関数
- 主に分類問題で使用
回帰問題・分類問題って?
分類問題
- 入力データがどのクラスに属するか分類する
- 「手書き数字の認識」など
回帰問題
- 入力データ数値の予測を行う
- 「株価の予想」など
恒等関数
- 入力をそのまま返す
ソフトマックス関数
- 各入力を全ての入力の相対値にして返す
!
計算方法
- 全ての入力の指数を計算:
の合計を計算 : - 入力を合計でわる :
式
なぜ指数?
- 大きさの順番が保存される
(単調増加な関数だから) - 少しの差でも大きな差に
変換される
いざ実装!
>>> a = np.array([0.3, 2.9, 4.0])
>>>
>>> exp_a = np.exp(a) # 指数関数
>>> exp_a
array([ 1.34985881, 18.17414537, 54.59815003])
>>>
>>> sum_exp_a = np.sum(exp_a) # exp_a の総和
74.1221542101633
>>>
>>> y = exp_a / exp_a_sum # 正規化
>>> y
array([0.01821127, 0.24519181, 0.73659691]) # ← 出力
関数にまとめよう
def softmax(a):
exp_a = np.exp(a) # 指数を求める
sum_exp_a = np.sum(exp_a) # 合計を求める
y = exp_a / sum_exp_a # 合計で割る
return y
オーバーフローに注意!
オーバーフローとは
数字がコンピュータに表現できる限界を超えてしまうこと
指数関数は簡単に桁が大きくなるため、オーバーフローが起きやすい
(Pythonでは小数型float
に無限大を示す値inf
が存在するのでエラーは起きません。代わりにWarningが出るようになっています。)
- あらかじめ最大値を引いておきます
- 先に引いてから
をとっても結果は変わらない!
>>> a = np.array([1010, 1000, 900])
>>> np.exp(a) / np.sum(np.exp(a))
Warning...
array([nan, nan, nan])
>>>
>>> a_max = np.max(a) # a_max = 1010
>>> a - a_max
array([ 0, -10, -110])
>>>
>>> np.exp(a - a_max) / np.sum(np.exp(a - a_max))
array([9.99954602e-01, 4.53978687e-05, 1.68883521e-48])
↑ちゃんと計算できた!
関数にまとめよう!
def softmax(a):
a_max = np.max(a)
exp_a = np.exp(a - a_max)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
出力層のニューロン数は?
例
- 手書き数字の認識(
)では 個のニューロンを設定 - アルファベット(
)の認識では 個に設定
まとめ
- 今回までで、パーセプトロンを勉強してきました
- 論理回路
- 行列、信号伝達の仕組み
- 次回は第3章の最終回手書き数字の分類です