03-2-出力層の設計

作成日:2022年11月17日 更新日:2022年11月17日

2. 出力層の設計

出力層とは

出力層(ニューラルネットワークの最後の部分)

output_layer.png (73.3 kB)

出力関数の種類

恒等関数

  • 与えられた入力をそのまま返す関数
  • 主に回帰問題で利用

ソフトマックス関数

  • 総和が1になるように分配する関数
  • 主に分類問題で使用

回帰問題・分類問題って?

分類問題

  • 入力データがどのクラスに属するか分類する
  • 「手書き数字の認識」など

回帰問題

  • 入力データ数値の予測を行う
  • 「株価の予想」など

恒等関数

  • 入力をそのまま返す
id_function.png (32.4 kB)

ソフトマックス関数

  • 各入力を全ての入力の相対値にして返す

!softmax_function.png (40.3 kB)

計算方法

  1. 全ての入力の指数を計算:
  2. の合計を計算   :
  3. 入力を合計でわる   :

なぜ指数?

  • 大きさの順番が保存される
    (単調増加な関数だから)
  • 少しの差でも大きな差に
    変換される
exp.png (171.9 kB)

いざ実装!

>>> 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

出力層のニューロン数は?

クラス分類(入力を種類に分類する問題)では個に設定する

output_layer.png (73.3 kB)

  • 手書き数字の認識()では個のニューロンを設定
  • アルファベット()の認識では個に設定

まとめ

  • 今回までで、パーセプトロンを勉強してきました
    1. 論理回路
    2. 行列、信号伝達の仕組み
  • 次回は第3章の最終回手書き数字の分類です