【DeepLearning特訓】MLPの基礎 出力ユニット
E資格向けの自習アウトプット
自分用メモ
出力ユニット は出力層の直前で使う、目的(求めたい解・問題)で使うものが変わってくる
ガウス出力分布(回帰問題) ➔ 線形ユニット
ベルヌーイ出力分布(2クラス) ➔ シグモイドユニット
マルチヌーイ出力分布(多クラス) ➔ ソフトマックスユニット
シグモイドユニット
2クラス分類問題(ベルヌーイ分布)で使う「赤いボール? Yes or No とか」
出力分布を確率として正規化する(積分して1になる、かつ正の値)、求める出力は確率 [0~1](片方のクラスに属する確率)
大小関係を変えないまま正の値にするには exp を用いる
活性化関数でのシグモイド関数と考え方は同じ
ソフトマックスユニット
他クラス分類問題(マルチヌーイ分布)
出力されてきたすべて数値を確率に変換する、全部足すと 1 になる
exp()で変換した後、全て足して「1」になるようにスケーリングする
(例)3個の入力に対して、それぞれ 5クラス(種類)に分類する問題
# 入力データを準備 x = np.random.randn(3,5) # 標準正規分布(平均0、標準偏差1、[3, 5]) print(x.shape) x (3, 5) array([[-0.83612882, -1.28141582, -0.03435628, 0.32397076, -0.16363977], [-0.1353119 , -2.52239138, -0.09070115, 1.65950783, -0.28504982], [ 0.86785516, -0.40719017, -0.82658902, 0.64749179, 0.16061809]])
# ソフトマックス関数 def softmax(x): # ※[N, M] - [N]はできないので、 転置して[M, N] - [N] x = x.T # [10, 3] > [3,10] _x = x - np.max(x) # [10, 3] - [3] _x = np.exp(x) / np.sum(np.exp(x), axis=0) return _x.T y = softmax(x) print(y) print(np.argmax(y, axis=1))
ソフトマックス関数を通すとそれぞれの要素が確率にスケーリングされる
一番確率の大きいインデックスを返す。この場合は [3 3 0]
[[0.11087104 0.07102846 0.24718579 0.35370643 0.21720829] [0.11090358 0.01019178 0.11596308 0.66746094 0.09548061] [0.3625354 0.10129903 0.06659823 0.29083578 0.17873157]] [3 3 0]
確認の為、各入力ごとに全要素を足してみる
np.sum(y, axis=1) === array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])