ニューラルネットワークとは?分かりやすく図解で解説!!

スポンサーリンク
ニューラルネットワークとはディープラーニング
この記事を読んで分かること
  • ニューラルネットワークとは何か
  • ニューラルネットワークの順伝播の計算
  • ニューラルネットワークと多層パーセプトロンの違い

ニューラルネットワークとは

ニューラルネットワークとは、

人間の脳機能を模した機械学習手法の一つ

です。

具体的な構造は、単純パーセプトロンの活性化関数を変更して複数組み合わせたものです。

 

単純パーセプトロンの構造

まず、多層パーセプトロンの構成要素である単純パーセプトロンについて詳細に見ていきます。

単純パーセプトロンのアルゴリズムを図で表してみます。

単純パーセプトロンの詳細

 

入力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関数です。

ReLU

$$
f(x)=max(0,x)= \begin{cases}
x & (0 \le x) \\
-x & (x < 0)
\end{cases}
$$

 

 

こちらの記事で他の活性化関数についても紹介しています。

活性化関数の種類!!グラフ付きで分かりやすくの一覧表示
この記事を読んで分かること どのような活性化関数があるか 活性化関数は、ディープラーニングの学習において重要な役割を担っています。 学習モデルを作る際に利用するパラメータの1つでもあり、様々な関...

 

 

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

パーセプトロンとは?図解で分かりやすく解説!!
この記事を読んで分かること パーセプトロンとは何か パーセプトロンでANDゲート、NANDゲート、ORゲートの表現方法 パーセプトロンの問題点 パーセプトロンのpythonでの実装方法 パー...
多層パーセプトロンとは?層を重ねて表現力をアップ
この記事を読んで分かること 多層パーセプトロンとは何か 多層パーセプトロンでXORゲートの表現方法 多層パーセプトロンの問題点 多層パーセプトロンのpythonでの実装方法 多層パーセプトロ...

 

ニューラルネットワークの計算をpythonで実装しながら解説

今回作るニューラルネットワークの構成は以下のようなものとします。

2_3_2層のニューラルネットワーク

 

入力層が2つ、中間層が3つ、出力層が2つのニューロンから構成されるニューラルネットワークを使用します。

1層目から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層目の活性化関数にはシグモイド関数を使います。

sigmoid

シグモイド関数は

$$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層目に伝わる信号と同様に行列の計算をしていきます。

2層目から3層目への伝播

 

\(
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で実装しながら解説しました。

ニューラルネットワークと多層パーセプトロンの違いは、任意の活性化関数を使用する点と重みの調整を自動的に実施する点です。

 

参考文献

コメント

タイトルとURLをコピーしました