機械学習の一つであるニューラルネットワークをpythonでnumpyを用いて実装します。①ではニューラルネットワークについての説明を行う、次回②では計算の詳細について説明します。③ではそれを実際に実装してみます。

三層ニューラルネットワークのフルスクラッチによる実装②
三層ニューラルネットワークのフルスクラッチによる実装③

ニューラルネットワーク

 ニューラルネットワークは下図のように、入力を受け取り出力を返すユニットを層状に並べたネットワークを指します。今回は三層に並べたものを扱います。
 ユニットiはz^{(l-1)} = {z^{(l-1)}_1,z^{(l-1)}_2,..,z^{(l-1)}_n}をl層目から入力に受け取り、以下のように計算された出力z_i^{(l)}を返します。
u^{(l)}_i = w_{i1}z^{(l-1)}_1 + w_{i2}z^{(l-1)}_2 + ... + w_{in}z^{(l-1)}_n+b_i
z^{(l)}_i = f(u^{(l)}_i)
w_{ij},b_iはそれぞれ係数、バイアスと呼ばれます。

 入力データをx={x_1,x_2,....,x_n}とすると第1層出力はz^{(1)} = xとなります。第1層から出力層まで上記のユニットの計算を行います。これを順伝播計算と呼びます。

係数の学習

 係数ははじめに初期値を決定しますが、そのままで順伝播計算を行った出力は正しい出力ではありません。そこで入力データに対する正しい出力(教師データと呼びます)と出力を比較して正しい出力をするように係数を更新します。
 まず初めに教師データと出力から誤差Eを誤差関数に従って計算します。(今回誤差関数は\frac{1}{2}\|y-d\|^2とします。y,dはそれぞれ出力、教師データです。)
 次に各係数w^{(l)}_{ij}で誤差Eを微分します。その導関数に従って以下のように係数を更新します。詳しくは次回紹介しますが、微分の計算は誤差逆伝播法という手法を用いて計算されます。
  w^{(l)}_{ij} → w^{(l)}_{ij} - \epsilon \frac{\partial E}{\partial w^{(l)}_ij}
上記\epsilonは学習率と呼ばれ、どの程度係数を一度で更新するかを意味します。
 学習の流れは以下のようになります。
1.入力データ1つに対して順伝播計算を行い誤差を計算する
2.1で計算された誤差を各係数で微分する。
3.2の導関数より係数の更新を行う。
 上記を各データに対して行います。この方法は確率的勾配降下法と呼ばれます。

最後に

次回は上記で説明した、順伝播、逆伝播について各計算についてより詳細に説明します。

(著:馬場達之

関連記事