ベイジアン研究所

プログラミング言語(アルゴリズム的な話が中心)やガジェットの紹介をしています。時々心理学の話も。

【深層学習入門】ニューラルネットワーク編

1. 記事の目的
深層学習の基本に関して理論的な解説を行う。本記事ではニューラルネットワークについて解説を行う。

2. ニューロン
ニューラルネットワークは、人の脳の構造を模して作られている。人の脳は「ニューロン」と呼ばれる、神経細胞の1単位を組み合わせて構成されていると考えられている(図1参照。参考文献[1]より引用。)

f:id:camelsan:20210116090541j:plain
図1 ニューロン

人はニューロンに電気信号を伝わせてる。ある閾値を超えた時に次のニューロンに電気信号を送ることで様々な判断や認識をしている(図2参照)。

f:id:camelsan:20210116092246p:plain
図2 ニューロン間の電気信号の伝達

3. 単純パーセプトロン
ニューロンをモデル化したもので、最も単純な構造を単純パーセプトロンという。二つの頂点から一つの頂点に電気が流れてくると想定する(図3参照)。

f:id:camelsan:20210116092901p:plain
図3 単純パーセプトロンのモデル

左側の二つの頂点の電気量がそれぞれ、 x_1 x_2とし、各頂点を結ぶ辺に重みを付加する。それをw_1w_2とする。閾値\thetaとすると右の頂点での値は次のように計算される(図4参照)。

y = \begin{cases} 1  &(w_1x_1+w_2x_2 \geq \theta) \\ 0 & (w_1x_1+w_2x_2 \lt \theta) \end{cases}

f:id:camelsan:20210116100940p:plain
図4 単純パーセプトロンの伝達方法

4. 単純パーセプトロンによる論理回路
単純パーセプトロン論理積を表すことができる。論理積とは、二つの入力値x_1x_2に対して値yが次のように01の2値で計算される演算子である。

x_1 x_2 y
0 0 0
0 1 0
1 0 0
1 1 1

x_1, x_2 \in {0, 1}に対し、出力値yが次のように計算されるとすると、論理積を表すことができる。

y = \begin{cases} 1 & (x_1+x_2 \geq \frac{3}{2}) \\ 0 & (x_1+x_2 \lt \frac{3}{2}) \end{cases}

つまり、論理積を、重みが11閾値\frac{3}{2}とした単純パーセプトロンで表現することができる。

幾何学的に表現すると次のグラフの白点と黒点を分ける直線のグラフを求める問題と等価になる(白点が0、黒点が1の値を表す)。

f:id:camelsan:20210116103840p:plain
図5 論理積のグラフ

同様にして、論理和、論理否定も表現することができる。

5. 単純パーセプトロンの限界
単純パーセプトロンは線形分離的な問題にしか適用することができない。つまり非線形な問題に対しては適応できない。例えば、次の排他的論理和は単純パーセプトロンでは表現することはできない。

x_1 x_2 y
0 0 0
0 1 1
1 0 1
1 1 0

幾何学的には、次のグラフの白点と黒点を1本の直線で分離することは不可能である。

f:id:camelsan:20210116110552p:plain
図6 排他的論理和を表すグラフ

5. ニューラルネットワークの導入
上記の限界の対策方法として、単純パーセプトロンを組み合わせるというものがある。重みと、途中の頂点での関数の働きにより非線形な問題にも対応することができる。例えば、排他的論理和は次のように表すことができる。

f:id:camelsan:20210116112025p:plain
図7 排他的論理和を表す構造

ただしy_1y_2yは次のように計算される。

y_1 = \begin{cases} 1 & (2x_1+2x_2 \geq 1) \\ 0 & (2x_1+2x_2 \lt 1) \end{cases}
y_2 = \begin{cases} 1 & (-2x_1-2x_2 \geq -3) \\ 0 & (-2x_1-2x_2 \lt -3) \end{cases}
y_1 = \begin{cases} 1 & (2y_1+2y_2 \geq 3) \\ 0 & (2y_1+2y_2 \lt 3) \end{cases}

ここで、ニューラルネットワークを数学的に定式化するために式を整理する。各頂点における不等式の閾値を左辺に移動させる。これをバイアスと呼ぶことにする。このようにすると各頂点には前の頂点の値とバイアスから値が集まっていると考えることができ、この値をステップ関数と呼ばれる次の関数を作用させていると考えられる。

f(x) = \begin{cases} 1 & (x \geq 0) \\ 0 & (x \lt 0) \end{cases}

これを活性化関数と言うことにする。ニューラルネットワークは、各頂点の値とバイアスを重みで線形和をとって活性化関数を作用させると言う操作を繰り返したものとなる。

6. ニューラルネットワーク
上記の定式化のしたがってニューラルネットワークを定義する。例として3層からなるニューラルネットワークを定義する(何層の定義でも繰り返すのみなので定義は基本的に同様である)。ここで層とは同列の頂点の並びのことを表す。すなわち図8のような3列に頂点が並んでるようなニューラルネットワークを定義する。

f:id:camelsan:20210116115422p:plain
図8 ニューラルネットワーク
最初の層を入力層、最後の層を出力層、間の層を全て隠れ層と言う。

隠れ層における出力は次の式で表現される。\ \textbf{x} = (x_1,\dots,x_I)を入力値のベクトル、\textbf{b} = (b_1,\dots,b_J)を隠れ層へのバイアスベクトル、\textbf{h}=(h_1,\dots,h_J)を隠れ層での出力値ベクトル、fを隠れ層での活性化関数とする。入力層と悪れ層を繋ぐ辺に付加された重みを行列で次のように表すとすると(第1インデックスが辺の終端の頂点のインデックス、第2インデックスが辺の始端の頂点のインデックスという対応)、

W = \begin{pmatrix}
w_{11} & \cdots & w_{1i} & \cdots & w_{1I}\\
\vdots & \ddots & & & \vdots \\
w_{i1} & & w_{ii} & & w_{iI} \\
\vdots & & & \ddots & \vdots \\
w_{J1} & \cdots & w_{Ji} & \cdots & w_{JI}
\end{pmatrix}

となる。これらの記号のもとで、隠れ層の出力は次の式で表される。

\textbf{h} = f(W\textbf{x}+\textbf{b})

また、\textbf{y} = (y_1,¥dots,y_K)を出力値のベクトル、gを出力層での活性化関数、¥textbf{c}=(c_1,¥dots,c_K)を出力層へのバイアスベクトル、Vを隠れ層と出力層を繋ぐ重みの行列とする。この記号のもとで出力層での出力値は次のように表示される。

\textbf{y} = g(V\textbf{h}+\textbf{c})

ただし、\textbf{h}は隠れ葬での出力値のベクトルである。

以上のように定式化される、ニューラルネットワーク(数学的には関数となる)という構造において、重みを調整(学習という)することで人の脳の働きを真似て画像の分類などを行う。

近年のコンピューターの計算能力の向上とともにその性能は飛躍的な成功を収めた一方で、ニューラルネットワークが実際にどのような働きを行なっているのかが不明であるという問題(ブラックボックス問題という)がある。

7. 参考文献
[1] http://www.tamagawa.ac.jp/teachers/aihara/kouzou.html
[2] 詳解ディープラーニング第2版

[3] ゼロから作るDeep Learning