新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。もう新人じゃないかも…

学習記録:ゼロから作るDeepLearning

3章:ニューラルネットワーク

パーセプトロンからニューラルネットワーク

2層のニューラルネットワークでは,0層が入力層,1層が中間層,2層が出力層と呼ばれる。
パーセプトロンでは,バイアスbとxiwiの和が1を超えたら出力が1になった。
これをニューラルネットワークで表すには,bも入力として追加する必要がある。
x1とx2の2入力がある場合,x1は重みw1,x2は重みw2,bは入力が1で重みbの入力として表現され,
式として表すと,y = h(b + w1x1 + w2x2) となる。(h(x)はxが0より大きい時1になる関数)

活性化関数

前述の式は,閾値を境にして出力が切り替わることから,ステップ関数や階段関数と呼ばれる。
では,Pythonを用いてステップ関数をグラフで表してみる。

def step_function(x):
    y = x > 0
    return y.astype(np.int)

上記は[1.0,2.0]のようなNymPy配列に対応した実装になっている。
Numpy配列に対して不等号による演算を行うと,Booleanの配列が作成される。
さらに,astype(np.int)によってBooleanを1か0のint型入れtに変換することができる。

>>> import numpy as np
>>> x = np.array([-1.0,1.0,2.0])
>>> x
array([-1.,  1.,  2.])
>>> y = x > 0
>>> y
array([False,  True,  True], dtype=bool)
>>> y.astype(np.int)
array([0, 1, 1])

それでは,このステップ関数をグラフで表示してみる。

import numpy as np
import matplotlib.pylab as plt

def step_function(x):
    y = x > 0
    return y.astype(np.int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()
  • 5.0から5.0まで0.1刻みのNumPy配列を生成し,それをstep_functionに渡して結果を1か0からの配列として受け取ってプロットしている。

これを実行すると,以下のようなグラフが表示される。

f:id:uriku:20170205191659p:plain

シグモイド関数

ニューラルネットワークでよく用いられる活性化関数の一つが,シグモイド関数である。
h(x) = 1 / (1 + exp(-x))

これはPythonで次のように書くことができる。

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

この関数は,NumPyのブロードキャストと呼ばれる機能により,引数xとしてNumPy配列を受け取ることもできる点に注意。
さて,シグモイド関数を先程と同じようにグラフにプロットすると,次のようになる。

f:id:uriku:20170205192437p:plain

さて,ステップ関数と比べて線が滑らかであることがわかる。
ステップ関数が0か1かしか返さないのに対し,シグモイド関数は実数を返すことができる。
つまり,パーセプトロンニューロン間を0か1の二値の信号しか流れなかったのに対し,ニューラルネットワークでは連続的な実数の値が信号として流れることになる。

ReLU関数

シグモイド関数ニューラルネットワークの歴史の古くから使用されてきたが,最近ではReLU(Rectified Linear Unit)という関数が主に用いられる。
ReLUは,入力が0を超えていればその入力をそのまま出力し,0以下なら0を出力する。

def relu(x):
    return np.maximum(0, x)

f:id:uriku:20170205193117p:plain