Pynote

Python、機械学習、画像処理について

Deep Learning - 順伝播型ニューラルネットワーク

概要

ニューラルネットワーク (neural network) は、生物の脳の神経回路網を参考に考案された数学モデルである。
ニューラルネットワークはあくまで数学モデルであり、実際の脳の仕組みを忠実に再現しているものではない。しかし、継続的な研究のおかげで、近年では複雑な問題を効率的に解くことができる機械学習の手法として使われるようになった。

キーワード

ニューラルネットワークの構造

ニューラルネットワークは、入力 \boldsymbol{x} が与えられたとき、\boldsymbol{y} を出力する関数 f(\boldsymbol{x};\boldsymbol{\theta}) として表される。
学習はニューラルネットワークで近似したい関数が f^* であるとき、f \approx f^* となるようにパラメータ \boldsymbol{\theta} を調整することで行われる。


以下では、ニューラルネットワークが出力を計算する流れを全結合ニューラルネットワークで理解する。


入力層、隠れ層、出力層

図中の丸はニューロン (neuron) またはユニット (unit) を表す。
このニューロンが複数並んで層 (layer) を成しており、さらにこの層が複数並んでネットワークを構成している。
各層を区別するため、1, 2, \cdots, l とラベルをつけ、第 l 層を構成するニューロン数を N(l) 個とし、各ニューロンの下に 1, 2, \cdots , N(l) と番号を振った。

1 層は入力層 (input layer)、第 2 層から第 L - 1 層は隠れ層 (hidden layer) または中間層 (intermediate layer)、第 L 層は出力層 (output layer) という。
また、矢印はニューロン同士の結合を表しており、矢印の方向に値が伝達される。
図のように各ニューロンが前後の層の全てのニューロンと結合しているニューラルネットワーク全結合ニューラルネットワーク (fully connected neural network) という。

順伝播型ニューラルネットワーク

入力層は外部から入力 \boldsymbol{x} = (x1, x2, \cdots, x_{N(1)})^T を受け取り、そのまま第 2 層に伝える。
次に、第 2 層から第 L 層にかけて、後述する計算を行いながら、順番に値を伝えていく。
このように入力層から出力層に向けて、順番に値を伝えていくニューラルネットワーク順伝播型ニューラルネットワーク (feedforward neural network) という。
そして、出力層からはネットワークの計算結果 y = (y1, y2, \cdots, y_{N(L)})^T が出力される。

入力層、出力層のニューロン

入力層及び出力層のニューロン数はそれぞれニューラルネットワークで表現したい関数の定義域及び値域の次元数に一致するように決める。
例えば、表現したい関数が f^*:{\mathbb{R}^n} \to {\mathbb{R}^m} である場合、入力層のニューロン数を N^{(1)} = n、出力層のニューロン数を N^{(L)} = m とする。


ニューロンの働き

2 層から第 L 層の各ニューロンではどのような計算が行われるのかを理解するため、第 l 層の j 番目のニューロンに注目し、ニューロンの入力と出力に分けて見てみる。


ニューロンへの入力

矢印で表されるニューロン間の結合には、重み (weight) または結合荷重 (connection weight) と呼ばれる係数がついている。
l-1 層の i 番目のニューロンと第 l 層の j 番目のニューロンの結合の重みを w_{ji}^{(l)} とする。
l-1 層の i 番目のニューロンの出力値 y_i^{(l-1)} に重み w_{ji}^{(l)} が乗算される。
この働きにより、重みが大きい値ならば次のニューロンが受け取る値は大きくなり、逆に重みが小さい値ならば受け取る値も小さくなる。
これは、脳でいうシナプスが信号を増幅または減衰させる働きを模している。

l 層の j 番目のニューロンは、結合している第 l-1 層のすべてのニューロンから値を受け取るので、これらを足し合わせたものが最終的な入力 u_{j}^{(l)} になる。

 \displaystyle
u_j^{(l)} = \sum_{i = 1}^{{N^{(l - 1)}}} {w_{ji}^{(l)}y_i^{(l - 1)}}

ニューロンの出力

l 層の j 番目のニューロンは、受け取った入力 u_{j}^{(l)}活性化関数 (activation function) f_j^{(l)} を適用して、出力 y_j^{(l)} を計算する。
ニューラルネットワークが考案された当初は次のステップ関数 (step function) が活性化関数として使われた。

\displaystyle
y_j^{(l)} = f_j^{(l)}(u_j^{(l)}) =
\left\{
  \begin{array}{*{20}{l}}
    1 &(u_j^{(l)} \le b_j^{(l)}) \\
    0 &(u_j^{(l)} > b_j^{(l)}) 
  \end{array}
\right.

b_i^{(l)}バイアス (bias) といい、関数は入力がバイアスを超えた場合は 1、そうでない場合は 0 を出力する。
これは、脳のニューロンが受け取った信号がある大きさを超えたら発火し、そうでない場合は発火しない現象を模している。

バイアスを

\displaystyle
u_j^{(l)} = \sum_{i = 1}^{N^{(l - 1)}}{w_{ji}^{(l)} y_i^{(l - 1)}} + b_j^{(l)}

と入力の一部に含めることで、先程のステップ関数は次のようになる。

\displaystyle
y_j^{(l)} = f_j^{(l)}(u_j^{(l)}) =
\left\{
  \begin{array}{*{20}{l}}
    1 &(u_j^{(l)} \le 0) \\
    0 &(u_j^{(l)} > 0) 
  \end{array}
\right.

活性化関数はステップ関数以外も考案されており、最近では ReLU がよく使われる。

順伝播の行列による表現

これを行列で表現する方法は以下の記事を参照されたい。

pynote.hatenablog.com

参考