konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【DeepLearning特訓】MLPの基礎 出力ユニット

E資格向けの自習アウトプット
自分用メモ

出力ユニット は出力層の直前で使う、目的(求めたい解・問題)で使うものが変わってくる

ガウス出力分布(回帰問題)    ➔ 線形ユニット
ベルヌーイ出力分布(2クラス)  ➔ シグモイドユニット
マルチヌーイ出力分布(多クラス) ➔ ソフトマックスユニット

線形ユニット

出力されるのは連続値(ガウス分布)「商品の売り上げ予測とか」
条件付きガウス分布の平均を使うことが多い
f:id:konchangakita:20210102135512p:plain

シグモイドユニット

2クラス分類問題(ベルヌーイ分布)で使う「赤いボール? Yes or No とか」
出力分布を確率として正規化する(積分して1になる、かつ正の値)、求める出力は確率 [0~1](片方のクラスに属する確率)
大小関係を変えないまま正の値にするには exp を用いる
活性化関数でのシグモイド関数と考え方は同じ
f:id:konchangakita:20210101224749p:plain

ソフトマックスユニット

他クラス分類問題(マルチヌーイ分布)
出力されてきたすべて数値を確率に変換する、全部足すと 1 になる
exp(f:id:konchangakita:20210101233456p:plain:w20)で変換した後、全て足して「1」になるようにスケーリングする
f:id:konchangakita:20210102142029p:plain

(例)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.])

まとめ

これで、順伝播(MLPの概要、活性化関数、出力ユニット)の流れがひととおり
ここから、コスト関数を計算し、誤差逆伝播で勾配算出、パラメータ(重み、バイアス)更新していきます