今回は「E資格」勉強記録の第2回目です。
前回の記事ではディープラーニングの概要について紹介しました。
今回はニューラルネットワークの基本要素となるパーセプトロンについてです。
パーセプトロン
まずは前回のおさらいです。
ニューラルネットワークは人間の脳を模倣したアルゴリズムでした。
そして、ニューラルネットワークはパーセプトロンを組み合わせて表現されます。
それでは、パーセプトロンの基本的な処理となる順伝搬についてみていきます。
順伝搬とは、 ニューラルネットワークの入力側から出力側へデータを順番に伝える処理のことです。
ニューラルネットワークにデータを入力して予測結果を出力させる推論で用いられる処理ですね。
(ちなみに出力側から入力側へデータを処理するものを逆伝搬といいます。逆伝搬は学習のときに行われます。)
説明を始めるにあたって簡単な例から示していくことにします。
ということで、隠れ層のないネットワークである「単層パーセプトロン」についてみていきます。
単層パーセプトロン
単層パーセプトロンは入力層と出力層だけで隠れ層がないネットワークとなっています。
次の図をみてください。単層パーセプトロンの最も簡単な例です。
ノード\(x\)とノード\(y\)が1対1でつながっているネットワークとなっています。

このネットワークに入力されたデータ\(x\)は、関数 \(f \)によって一次変換されて\(y\)となります。
つまり、次の式で求めることができます。
この関数 \(f \)はアフィン変換に相当します。
$$ \Large \eqalign{ y &= f(x) \\ &= wx + b } $$
ここで、 \(w\)と\(b\)はネットワークのパラメータです。
\(w\)を重み(ウェイト)、\(b\)をバイアスといいます。
具体的に数値を入れて考えてみます。
たとえば、ネットワークパラメータが\(w=3,b=1\)のとき、\(x=4\)を入力すると、
\(y=f(x)=4 \times 3+1=13\)が出力されます。
次に、入力層・出力層ともに複数のノードから成る単層パーセプトロンを考えてみます。

入力層のノード数が2で出力層のノード数が3です。
重み\(w\)の数は入力ノード数×出力ノード数となり、 バイアス\(b\)の数は出力ノード数となります。
この例では\(w\)は6個、\(b\)は3個です。
ちなみに、このネットワークのように隣接する層のノード間すべてが結合しているものを「全結合層」と呼ばれます。
出力\(y_j\)は次の式で算出できます。
$$ \Large { y_j = \sum_{i} w_{ij} x_i + b_j } $$
上記の式ですべての出力\(y_j\)の値を求めることはできますが、
ベクトルと行列を使ってスマートに表現したいと思います。
$$ \Large \eqalign{
\mathbf{x} &= \pmatrix{ x_1 & x_2 } \\
\mathbf{W} &= \pmatrix{ w_{11} & w_{12} & w_{13} \cr w_{21} & w_{22} & w_{23} } \\
\mathbf{b} &= \pmatrix{ b_1 & b_2 &b_3 } \\
\mathbf{y} &= \pmatrix{ y_1 & y_2 & y_3}
} $$
ついでに入力層、出力層、パラメータをベクトル表記で表して、ネットワーク図も簡略化して描くことにします。

ベクトル、行列で表現することでネットワークの出力は行列の内積と和で求まります。
$$ \Large \pmatrix{ y_1 & y_2 & y_3} = \pmatrix{ x_1 & x_2 } \pmatrix{ w_{11} & w_{12} & w_{13} \cr w_{21} & w_{22} & w_{23} } + \pmatrix{ b_1 & b_2 &b_3 } $$
また、ベクトル \( \mathbf{x, W, b, y} \)で表すと次のようになります。
$$ \Large \mathbf{y} = \mathbf{x W} + \mathbf{b} $$
この計算式をpythonで実装します。
numpyの内積を使えば\(y\)を計算するコードは赤枠部分の1行で済みます。
なお、パラメータ\(W,b\)と入力\(x\)には適当な値を入れて\(y\)を出力しています。

多層パーセプトロン
次は多層パーセプトロンについてみていきます。
多層パーセプトロンのネットワークは次の図のようになります。
入力層と出力層の間に隠れ層(中間層)が何層か入っています。

隠れ層が何層あっても、データを次の層へ伝える順伝搬の処理は同じです。
なお、隠れ層は hidden layer の頭文字 \(h\) と書くことにします。
次の図で例を示します。

各層にデータを伝搬させる際にアフィン変換を適用していきます。
式では次のように表します。
$$ \Large \eqalign{
\mathbf{h} &= \mathbf{xW_1} + \mathbf{b_1} \\
\mathbf{y} &= \mathbf{hW_2} + \mathbf{b_2}
} $$
この処理をpythonで実装します。
\(y\)を計算するコードは赤枠部分の2行です。

多層パーセプトロンでも単層パーセプトロンと同様のアフィン変換を繰り返すことで順伝搬を行えるわけです。
隠れユニットと出力ユニット
上述のパーセプトロンの例では、アフィン変換を適用させてデータを順伝搬させていきました。
正確には、順伝搬の際にもう少し処理(関数により変換)を行う必要があります。
その前に、「隠れユニット」と「出力ユニット」について説明します。

隠れユニットは中間層で利用する関数のことで、出力ユニットは出力層で利用する関数のことです。
上の図で緑色の〇が隠れユニットで、赤色の〇が出力ユニットにあたります。
隠れユニットでは、アフィン変換のあとに非線形な変換関数である「活性化関数」を適用します。
非線形な変換を適用することで表現力の高いニューラルネットワークを構成することができます。
ちなみに、活性化関数を入れない線形変換(アフィン変換)だけの多層パーセプトロンは何層重なても表現力は変化しません。
結局のところ、そのようなネットワークは単層パーセプトロンで表現できてしまいます。
出力ユニットでは、ニューラルネットワークのタスクによって処理が異なります。
ここでいうタスクとは、「回帰」、「分類」といったものになります。
最後に
今回はニューラルネットワークの基本要素となるパーセプトロンについて説明しました。
次回は隠れユニットの活性化関数から入っていこうと思います。
今回も最後までお読みいただきありがとうございました!
EOF