筋トレ大学生によるアウトプット雑記

筋トレや読書のことをはじめとして、プログラミングその他日常生活における様々なことについて書いていきます。

ニューラルネットワークの仕組み【図解】

スポンサーリンク

f:id:daimori1005:20191015225147p:plain

ニューラルネットワークの内部でどのような処理が行われているか知りたいですか?
ディープラーニングの理解に必要なニューラルネットワークの処理ですが、その中身を詳しくご存じの方は少ないと思います。

本記事では、図を用いて簡単なニューラルネットワークの問題を解いていきます。
基本的な部分が分かれば、後は層やユニット数が増えるだけです。

中身を知ることで、出力結果にも合点がいくようになると思います。
ディープラーニングに興味がある方は必見です。

ニューラルネットワークの仕組み


ニューラルネットワークについて理解しましょう。

ニューラルネットワークの基本的なアルゴリズムを紹介します。

アルゴリズム

1. ネットワーク重みの初期値を適当に設定

2. 学習データからパターンを一つ選んで、順伝播によって出力と誤差を計算する。

3. 出力側から入力側へ、誤差を逆方向に伝播させ、その結果を使って重みを更新

4. 2と3をすべての学習データに対して行う。

5. 重み更新の幅が小さくなるまで繰り返す。

そして今回は、下図のようなネットワークを扱っていきます。

f:id:daimori1005:20191015234929p:plain

こちら即興で作りました。笑
このネットワークを用いて、入力に排他的論理和を取る問題を解きます。
今回は簡単のため、アルゴリズムの3までやります笑

しきい値関数には、

 f(u) = \begin{cases}
0.9 & u > 0\\
0.1 & u ≦ 0
\end{cases}
を使います。

しきい値関数とは、ニューロンに入力された値に対して、条件によって固定された値を出力する関数です。
たとえばこの場合、5が入力されたら出力は0.9になります。

実際にやってみる

排他的論理和について

皆様、排他的論理和はご存じでしょうか?

x_{0} x_{1} b
1 0 0 0
2 0 1 1
3 1 0 1
4 1 1 0

こんな感じのものですね。

今回は、入力に x_{0}x_{1} を取り、教師データに b を取ります。

まず順伝播させる

まずは順伝播させます。

試しに x_{0},x_{1} = 0,0 を入力します。

このとき、g_{0},g_{1} = 0.1,0.1 となります。

そして、h_{0} = 0.1 \times -3 + 0.1 \times -2 = -0.5 となります。
同様に、 h_{1} = 0.1 を得ます。

この結果をしきい値関数にかけると、i_{0},i_{1} = 0.1,0.9 です。

そして、j = 0.1\times -2 + 0.9 \times 1 = 0.7
しきい値関数にとおして、y=0.9 となります。

そして、このときの教師データ b0 なので、出力誤差は0.9となります。

他のデータも同様にやっていくと下記のようになります。

x_{0} x_{1} g_{0} g_{1} h_{0} h_{1} i_{0} i_{1} j y b 誤差
1 0 0 0.1 0.1 -0.5 0.1 0.1 0.9 0.7 0.9 0 0.9
2 0 1 0.1 0.9 -2.1 2.5 0.1 0.9 0.7 0.9 1 -0.1
3 1 0 0.9 0.1 -2.9 -1.5 0.1 0.1 -0.1 0.1 1 -0.9
4 1 1 0.9 0.9 -4.5 0.9 0.1 0.9 0.7 0.9 0 0.9

誤差を逆伝播させていく

順伝播させたことで出力誤差を得ることが出来ました。
この出力誤差を逆方向に伝播させます。

誤差逆伝播の式を記します。
ここでは、誤差をerrorとします。

出力層においては、

 \displaystyle \epsilon_{out} = error \times y \times (1-y)

中間層では、

 \epsilon_{mid} = (\sum_{k} \epsilon_{kp}w_{jk}) \times i_{1} \times (1-i_{1})

入力層も同じような感じです。

数学的なことは置いといて、実際にやってみましょう!

まず出力層の計算です。
 x_{0},x_{1} = 0,0を考えます。
先程の式を使えば、

 \epsilon = 0.9 \times 0.9 \times 0.1 = 0.081

となります。

中間層に移ります。

中間層の上のニューロンを考えていきます。

 \epsilon_{mid0} = (0.081 \times -0.2) \times 0.1 \times (1-0.1) = -0.01458

のようになります。

下も同様にすれば、

 \epsilon_{mid1} = 0.00729 です。

そして最後に入力層に移ります。
上のニューロンを考えます。

 \epsilon_{in0} = (-0.01458 \times -3) \times 0.1 \times (1-0.1) + (0.00729 \times -2) \times 0.1 \times (1-0.1)= 0.0026244

となりますね。

下側は同様にすれば、

 \epsilon_{in1} = 0.0045927

これで逆伝播は終わりです。

重み更新

重みを更新します。

 w'_{ij} = w_{ij} - \rho \epsilon g_{ij}

という式を用いて重みの値を更新していきます。
逆伝播した結果を用いて更新するんですね。
今回は、この過程は省きます。笑


以上までがニューラルネットワークの基本的な仕組みです。
この過程を繰り返すことで、適切な重みを求めるのがニューラルネットワークの仕事です。

意外と簡単ではないでしょうか?

f:id:daimori1005:20191016192729p:plain

まとめ

いかがでしたか?

本記事では、ニューラルネットワークにおける順伝播と逆伝播の機構を簡単な例を用いて解説しました。

これを知っていることで、ライブラリを用いないニューラルネットワーク構築も可能となります。

これを機に機械学習に興味を持ってくれる方が増えると嬉しいです。

スポンサーリンク