Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Python DeepLearningに再挑戦 4 ニューラルネットワーク 出力層の設計

概要

Python DeepLearningに再挑戦 4 ニューラルネットワーク 出力層の設計

参考書籍

恒等関数とソフトマックス関数

恒等関数->入ってきたものに対して何も手を加えずに出力する関数

ソフトマックス関数-> yk = exp(ak)/ nΣi=1 exp(ai) ※普通の表記だと全然表記できないなぁ。 重要なのは、ソフトマックス関数の分子は入力信号Akの指数関数、分母はすべての入力信号の指数関数の和になっている。多分、このことによって、各信号の結果の重さがわかるようになっている。。はず。 あとは、各ニューロンは、すべて入力信号から影響を受ける。

f:id:riikku:20161220144006p:plain

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

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の手書き文字のどれかを予測する場合は、以下のように出力層を設定する。

f:id:riikku:20161220151652p:plain

次回から、実践的な実装をしてみる。