「ゼロから作るDeep Leaning」4章:ニューラルネットワークの学習

2017年11月8日


「ゼロから作るDeep Leaning」3章:ニューラルネットワークに引き続き、「ゼロから作るDeep Leaning」に関してざっくりまとめます。あくまで主観による重要箇所の備忘録程度!
今回は、ニューラルネットワークの学習フェーズについてまとめます。

損失関数

ニューラルネットワークの学習では、損失関数が使用される。出力値と正解ラベルの値との差が大きいほど損失関数の値は大きくなる。ニューラルネットワークの学習では、損失関数の出力値が小さくなるように重みパラメーターを調整していく。
損失関数に使用されるのは主に以下の二つ。

2乗和誤差

$$E=\frac12\Sigma _k(y _k – t _k)^2$$
pythonで実装すると以下の通り。

※「ゼロから作るDeep Leaning」89pより引用

yはニューラルネットワークの出力値、tは教師データ。

例えば・・・

ニューラルネットワークの出力と教師データの値の差が大きくなれば大きくなるほど損失関数の出力値は大きくなることがわかる。

交差エントロピー誤差

$$E=-\Sigma _k t _k\log y _k$$
pythonで実装すると以下の通り。

※「ゼロから作るDeep Leaning」91pより引用

微小な値であるdeltaを足している理由は、np.log(0)になるとマイナスの無限大を表す-infとなり、それ以上計算を行うことができなくなってしまうから。

数値微分

微小な差分によって微分を求めることを数値微分という。
pythonで実装すると以下の通り。

※「ゼロから作るDeep Leaning」99pより引用

続いて、\[f_(x _0,x _1)=x _0^2 + x _1^2\]
のように、複数の変数からなる関数の微分を偏微分という。
pythonで実装すると以下の通り。

※「ゼロから作るDeep Leaning」102pより引用

勾配

勾配とは、全ての変数の偏微分をベクトルとしてまとめたもの。
勾配法をpythonで実装すると以下の通り。

※「ゼロから作るDeep Leaning」104pより引用

一つ一つの変数に対する偏微分をfor文で求める。
勾配は、各場所に置いて関数の値を最も減らす方向を示している。つまり、損失関数の勾配が示す方向に、入力値である重みパラメーターを少しずつ更新していけば損失関数の値を減らしていくことができる。(勾配法)

数式で表すと以下の通り。
$$x _0=x _0 – \eta\frac{\partial f}{\partial x _0}$$
$$x _1=x _1 – \eta\frac{\partial f}{\partial x _1}$$
pythonで実装すると以下の通り。

※「ゼロから作るDeep Leaning」107,108pより引用

lrは学習率、step_numは繰り返し回数を表す。
学習率の値は大きすぎても小さすぎても学習がうまく進まないので、適切な値を自身で設定する必要がある。

ニューラルネットワークの学習の全体像

  1. ミニバッチ
  2. 勾配の算出
  3. パラメータの更新
  4. 1~3を繰り返す

ここから学習アルゴリズムを実装していく。まずは、2層のニューラルネットワークを実装する。

※「ゼロから作るDeep Leaning」114,115p、本書コード掲載のgithubより引用

このTwoLayerNetクラスを対象に、MNISTデータセットを使い学習させる。pythonで実装すると以下の通り。

※「ゼロから作るDeep Leaning」118p、本書コード掲載のgithubより引用

まとめ

■ニューラルネットワークの学習は、損失関数の出力値を指標に、その値が小さくなるように、重みパラメーターを更新する。
■重みパラメーターの更新には、重みパラメーターの勾配を利用して、勾配方向に重みパラメーターを更新する。


PAGE TOP