活性化関数の実装。Step,Sigmoid,ReLU


深層学習入門。Python,Numpyにも少し慣れてきたので、
Numpyだけで伝搬,逆伝搬を計算することで深層学習に慣れていく。
単に自分の理解のためだけの記事なので、誤りがあっても気にしない。

活性化関数

まず活性化関数。activation function。
3つ\(x_1,x_2,x_3\)の入力があったとする。それぞれに重み\(w_1,w_2,w_3\)がかかるとする。
ノードは入力に重みをかけた和、つまり\(w_1x_1 + w_2x_2 + w_3x_3\)を受けるものとする。
ノードは受けた値の大きさに応じて出力を返す機能を持つ。
受けた値と出力の関係(まさに関数)を活性化関数と言って、
ステップ関数,Sigmoid関数,ReLU,Softmax関数などいくつか種類がある。

Step関数,Sigmoid関数,ReLUをNumpyだけで実装してみる。


import numpy as np
import matplotlib.pyplot as plt

# sigmoid function
def sigmoid(x):
    return 1 / (1+np.exp(-x))

# step function
def step(x):
    return np.array(x > 0, dtype=int)

# ReLU
def relu(x):
    return np.maximum(0,x) / 5

x = np.arange(-5.0,5.0,0.1)
y = sigmoid(x)

x = np.arange(-5.0,5.0,0.1)
y1 = sigmoid(x)
y2 = step(x)
y3 = relu(x)

plt.plot(x,y1)
plt.plot(x,y2)
plt.plot(x,y3)
plt.ylim(-0.1,1.1)
plt.show()

どんなに入力信号が大きくても、出力を0から1の間に押し込める。

入力が大きければ出力が大きいという意図はあるものの、
入力と出力の関係が非線形になっているものが多い。
活性化関数が線形関数だと、ネットワークを重ねていったとしても、
ネットワークの最初の入り口と最後の出口を見たとして、1つの線形関数を通しただけ…
ということになる。つまり加算と定数倍は何回実行したとしても、
一つの定数倍、加算の計算にまとめることができる。

これだと、層を重ねる意味がなくなってしまう。
活性化関数が非線形だと、重ねた活性化関数をまとめることはできず、
複雑な入出力を表現できるため、活性化関数として非線形関数を使用する。