- ニューラルネットワークとは何か
- ニューラルネットワークの順伝播の計算
- ニューラルネットワークと多層パーセプトロンの違い
ニューラルネットワークとは
ニューラルネットワークとは、
です。
具体的な構造は、単純パーセプトロンの活性化関数を変更して複数組み合わせたものです。
単純パーセプトロンの構造
まず、多層パーセプトロンの構成要素である単純パーセプトロンについて詳細に見ていきます。
単純パーセプトロンのアルゴリズムを図で表してみます。
入力xに重みを掛けた値とバイアスの総和を計算し、その値をステップ関数(0以上かどうか判断する関数)に入れた結果が出力yになっています。
ステップ関数は入力値が0以下なら0を返し、0より大きければ1を返す関数です。
数式で書くと、単純パーセプトロンはこのように表されるアルゴリズムです。
$$y=\begin{cases}
0 & (b+w_1x_1+w_2x_2 \le 0)\\
1 & (b+w_1x_1+w_2x_2>0)
\end{cases}
$$
ニューラルネットワークでは活性化関数が使われる
単純パーセプトロンではステップ関数が使われていましたが、ニューラルネットワークでは様々な関数が使われます。
この関数のことを活性化関数と呼びます。
活性化関数には様々なものがありますが、よく使われるのはReLU関数です。
$$f(x)=max(0,x)= \begin{cases}
x & (0 \le x) \\
-x & (x < 0)
\end{cases}
$$
こちらの記事で他の活性化関数についても紹介しています。

この記事は単純パーセプトロンと多層パーセプトロンの知識が事前にあるとより理解が深まるので、こちらの記事を合わせて読んでおくことをオススメします。


ニューラルネットワークの計算をpythonで実装しながら解説
今回作るニューラルネットワークの構成は以下のようなものとします。
入力層が2つ、中間層が3つ、出力層が2つのニューロンから構成されるニューラルネットワークを使用します。
1層目から2層目への伝播
1層目から2層目に伝わる信号は各ニューロンに重みを掛けた値の総和になります。
$$
a_1 = x_1w_1 + x_2w_4 + b_1
$$
$$
a_2 = x_1w_2 + x_2w_5 + b_2
$$
$$
a_3 = x_1w_3 + x_2w_6 + b_3
$$
このように似たような計算処理が何度も発生するので、行列で表してコンピュータが計算しやすくしてみましょう。
まず、入力x、バイアスb、重みwを行列で定義します。
\(
X = \left(
\begin{array}{cc}
x_{1} & x_{2}
\end{array}
\right)\)
\(
B1=\left(\begin{array}{ccc}
b_{1} & b_{2} & b_{3}
\end{array}
\right)
\)
\(
W1=\left(\begin{array}{ccc}
w_{1} & w_{2} & w_{3} \\
w_{4} & w_{5} & w_{6}
\end{array}
\right)
\)
XとWの内積にBを足すことで各ニューロンへの伝播をシンプルに表すことができました。
\(
A1=\left(\begin{array}{ccc}
a_{1} & a_{2} & a_{3}
\end{array}
\right)
=X・W1 + B1
\)
この行列をpython実装すると以下のようになります。
import numpy as np
X = np.array([1, 2])
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])
A1 = np.dot(X, W1) + B1
2層目内部の計算
2層目の内部では活性化関数の計算をしています。
今回は2層目の活性化関数にはシグモイド関数を使います。
シグモイド関数は
$$f(x)=\frac{1}{1+e^{-x}}$$
で表される関数です。
A1の値をシグモイド関数で変換してZにします。
def sigmoid(a):
z = 1 / (1 + np.exp(-a))
return z
Z = sigmoid(A1)
2層目から3層目への伝播
1層目から2層目に伝わる信号と同様に行列の計算をしていきます。
\(
Z = \left(
\begin{array}{ccc}
z_{1} & z_{2} & z_{3}
\end{array}
\right)\)
\(
B2=\left(\begin{array}{ccc}
b_{1} & b_{2} & b_{3}
\end{array}
\right)
\)
\(
W2=\left(\begin{array}{cc}
w_{7} & w_{8} \\
w_{9} & w_{10} \\
w_{11} & w_{12}
\end{array}
\right)
\)
XとWの内積にBを足すことで各ニューロンへの伝播をシンプルに表すことができました。
\(
A2=\left(\begin{array}{cc}
a_{4} & a_{5}
\end{array}
\right)
=Z・W2 + B2
\)
入力Z1、重みW2の内積を計算してバイアスB2を足します。
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
B2 = np.array([0.1, 0.2])
A2 = np.dot(Z, W2) + B2
3層目内部の計算
3層目の内部の活性化関数の計算をします。
計算結果が出力yとなるため、活性化関数にソフトマックス関数を使います。
ソフトマックス関数は
$$f(x)=\frac{\exp \left( a_{k}\right) }{\sum ^{n}_{i=1}\exp \left( a_{i}\right) }$$
で表される関数です。
ただし、指数関数の計算をそのままプログラムしてしまうとオーバーフローになってしまう可能性があるので、
$$f(x)=\frac{\exp \left( a_{k}+C’\right) }{\sum ^{n}_{i=1}\exp \left( a_{i}+C’\right) }$$
という式で代わりに実装します。
C’には何を入れても問題ないのですが、入力信号の最大値にしておきます。
A2の値をソフトマックス関数で変換してYにします。
def softmax(a):
# 素直に定義式を実装するとオーバーフローしてしまう
# np.exp(a) / np.sum(np.exp(a))
c = np.max(a)
y = np.exp(a - c) / np.sum(np.exp(a - c))
return y
Y = softmax(A2)
ニューラルネットワークと多層パーセプトロンの違い
ニューラルネットワークも多層パーセプトロンもパーセプトロンを複数組み合わせたものなのでとても似ていますが、大きく2点の違いがあります。
任意の活性化関数を使用する
多層パーセプトロンは活性化関数がステップ関数なのに対し、ニューラルネットワークは任意の活性化関数を使用します。
つまり、活性化関数にステップ関数を選択したニューラルネットワークが多層パーセプトロンということになります。
重みの調整を自動的に実施
ニューラルネットワークでは、重みパラメータの調整を自動的に実施します。
多層パーセプトロンでは、
という問題がありました。
そこで、重みの調整を最適化する手法として、誤差逆伝播が考案されました。
ニューラルネットワークには誤差逆伝播が取り入れられ、適切な重みパラメータをデータから自動で学習できるようになったことが特徴の1つです。
まとめ
ニューラルネットワークとは、人間の脳機能を模した機械学習手法の一つです。
構造は、単純パーセプトロンの活性化関数を変更して複数組み合わせたものです。
ニューラルネットワークの計算をpythonで実装しながら解説しました。
ニューラルネットワークと多層パーセプトロンの違いは、任意の活性化関数を使用する点と重みの調整を自動的に実施する点です。
コメント