konchangakita

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

【DeepLearning特訓】MLPの基礎 活性化関数

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

活性化関数は原則パラメータを持たず学習には関与しない。アフィン変換後に活性化関数による非線形写像により表現力の高いニューラルネットワークを構成する。

f:id:konchangakita:20210101225946p:plain

代表的な活性化関数

・ステップ関数:超シンプル出番ほぼ無し
シグモイド関数
・ハイパボリックタンジェント
ReLU

ステップ関数

import numpy as np
# ステップ関数
def step(x):
    return np.array(x > 0, dtype=np.int)

x = np.sort(np.random.randn(1000)) # 標準正規分布(平均0、標準偏差1、1000個)
y = step(x)
plt.plot(x, y, label='test')

f:id:konchangakita:20210101224501p:plain


シグモイド関数

入力を 0~1 になめらかに押し込める
中間層では勾配消失が起こるので使わない(最適化が難しい)
f:id:konchangakita:20210101224749p:plain

f:id:konchangakita:20210101233456p:plain:w20numpy で np.exp(x)

import numpy as np
# シグモイド関数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.sort(np.random.normal(0, 5, (1000))) # 正規分布(平均0、分散5、1000個)
y = sigmoid(x)
plt.plot(x, y)

f:id:konchangakita:20210101231832p:plain


ハイパボリックタンジェント

シグモイド関数に似ているが、恒等関数により近い
中間層で訓練においてよりよい性能を出すことが多い
f:id:konchangakita:20210101232132p:plain

numpy には、np.tanh() が用意されている

import numpy as np
# ハイパボリックタンジェント
def tanh(x):
    return np.tanh(x)

x = np.sort(np.random.normal(0, 5, (1000))) # 正規分布(平均0、分散5、1000個)
y = tanh(x)
plt.plot(x, y)

f:id:konchangakita:20210101232837p:plain


ReLU(ランプ関数)

ディープラーニングを学習する上で一番よく聞くかもしれない
線形関数に近く最適化しやすい、活性化値が 0 になると勾配に基づく学習ができなるが、問題になることは少ないらしい
f:id:konchangakita:20210101234938p:plain

import numpy as np
# ReLU
def relu(x):
    return np.maximum(0, x)

x = np.sort(np.random.randn(1000)) # 標準正規分布(平均0、標準偏差1、1000個)
y = relu(x)
plt.plot(x, y)

f:id:konchangakita:20210102002144p:plain

ReLUには多くの派生がある
試験に出そうなので抑えておく

Leaky ReLU:勾配 0 の領域をなくす
f:id:konchangakita:20210102115611p:plain
PReLU:𝛼_𝑖 を学習可能パラメータに
f:id:konchangakita:20210102115454p:plain
absolute value rectification:𝛼_𝑖を-1に固定
f:id:konchangakita:20210102115347p:plain


活性化関数は中間層(隠れ層)で使う

入力(x) x 重み(w) + バイアス(b) の計算は、行列の計算になるが、numpy にはあらかじめ便利な行列計算用の関数が用意されている
活性化関数はあくまで、中間層での非線形写像を行うモノ。出力層では出力ユニットを使う。
<出力ユニットへつづく>