Pythonによるニューラルネットワークの実装➂

機械学習 Python R

pythonで1からニューラルネットワークを実装する第三弾です。今回は、勾配法でパラメーターを更新する為の関数を書きます。いきなり全部のデータでパラメーターを学習すると過学習1しやすいので、データからランダムにデータを取り出して学習を行うミニバッチ方式を採用します。
前回の記事までで作ったクラスや関数の知識があると仮定しているので、まだの方は以下の記事をどうぞ。

Pythonによるニューラルネットワークの実装①
ニューラルネットワークモデルをpython で1から作ります。この記事では、データを受け取って予測値を返す関数と、正解率を計算する関数を作成します。
Pythonによるニューラルネットワークの実装➁
1からニューラルネットワークをpythonで実装します。これは2番目の記事です。誤差関数の計算と、勾配の計算をする関数を実装します。

記事で使っているソースコードはgithub に置いてあります。
https://github.com/msamunetogetoge

ミニバッチ方式の実装

ミニバッチ方式は、パラメーターの更新の回数と、1バッチに含まれるデータの数を決める必要があります。今回は適当に更新回数は10000, バッチサイズを100にします。ランダムにデータを選ぶのはnumpy のrandom.choice を使えばできます。コードを書きます。

パラメーターの更新の実装

ニューラルネットワークモデルの学習の流れは以下のようになります。
ミニバッチ方式でランダムにデータを取り、勾配を計算し、それぞれのパラメーターを更新しますこれを10000回繰り返し、誤差関数を小さくします。 今回は、100回パラメーターを更新するたびに誤差関数の値と正解率 を記録して、グラフを描いてみます。 このひとまとまりの操作をエポック 2 と言います。 python 3.7 で動くのを確認しているコードを載せます。➁までのコードを持っている人は、以下の事をすれば同じコードになります。

  • TwoLayerNet クラスに loss 関数を書き加える
  • test_labels をone hot encording する
  • パラメーターを更新させるコードをコピペする

このコードで学習を実行すると、最終的には正答率87%程度まで到達します。適当に作った行列では5%とかだったので、かなり進歩 3 しました。
また、最後のグラフを描く部分のコードから以下のようなグラフが得られます。

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

注目すべき点を解説します。
正答率と誤差関数のグラフが連動している事に注目しましょう。正答率が上がる=誤差関数の値が小さくなるという状態になっています。この状態は、モデルとデータに対して適切な誤差関数を選べていることを示しています。
また、学習用に使うデータと、テスト用に使うデータの正答率が殆ど変わらないという事にも注目すべきです。これは、使用したデータが”良い”データだった事を示しています。良い、というのは以下のような意味合いです。

  • 学習用データが充分な数存在している
  • 学習用データとテスト用データで極端な違いが無い
  • 学習に意味のあるデータが沢山ある

モデルが素晴らしかったという可能性ももちろんあります。
最後に、勾配のグラフを見ましょう。最初から最後まで勾配の大きさが変化しています。しかし、10エポック辺りから誤差関数値も正答率も殆ど変化が無いので与えた情報やパラメーターでは既にモデルの学習の限界が来ていると見た方が良いでしょう。
ニューラルネットワークモデルを改良するには層を増やしてみる(層を深くする)、というのがあります。次回からはディープラーニングの実装に挑戦しましょう。

まとめ

・ニューラルネットワークのモデルを1から実装した
・mnist はデータが凄く良い
・次回からはディープラーニングの実装

  1. Adam とかなら気にする必要ないかもしれませんが、只の確率勾配法だと誤差関数の極小値で最小値でない場所に捕まると抜け出せません。必ず工夫が必要です。
  2. (100回パラメーター更新) = 1 エポック
  3. ランダムに答えを入れても10%は正解できるはずなので、モデルとして価値のある最低ラインは10%です。
タイトルとURLをコピーしました