見出し画像

ゼロからつくるDeepLearning学習中~その3

4章 ニューラルネットワークの学習」、「5章 誤差逆伝播法」を終了しました。ここまではテキストに従って自分でコードを記述していましたが、コード量が増えてきたので、ここからはダウンロードしたコードを使うようにしました。

学習アルゴリズムの実装

いよいよ学習部分を実装していきます。まずは2層のネットワークをクラスとして実装します (TwoLayerNet) 。コード自体は、ここまでで学習してきた内容です。

ミニバッチ学習の実装

先に作成した TwoLayerNet にミニバッチ学習を適用します。

バッチサイズ分のマスクを使って訓練データの一部について勾配を計算、勾配のマイナス向きに微小量移動・・・を繰り返します。

テキストに損失関数の推移がグラフとしてでてくるのですが、サンプルコードには無かったので、下記のコードを追加して train_loss_list をプロットしてみました。

import matplotlib.pyplot as plt

x = np.arange(iters_num)
plt.plot(x, train_loss_list)
plt.xlabel("iteration")
plt.ylabel("loss")
plt.xlim(0, 1000)
plt.ylim(0, 9)
plt.show()

ここでトラブル。下記エラーが発生。

...
File "../dataset/mnist.py", line 117, in load_mnist
dataset['train_label'] = _change_ont_hot_label(dataset['train_label'])
NameError: name '_change_ont_hot_label' is not defined

dataset.mnist.py の 117, 118行目 に誤植がありました。下記のように修正する必要がありました。(one とすべきところ、ont になってますね)

_change_ont_hot_label → _change_one_hot_label

※作者にご連絡を・・・と思ったらすでに直ってました。一時的なものだったようです。

グラフは下記の通り。あれ?テキストと違う。

テキストだと、iteration 軸の 0 (loss軸上) で発散する感じになっていて、そこから急激に減少、iteration が 1,000 あたりでは loss = 0.5 くらいに収束してる感じです。

時間短縮のため誤差逆伝播法版の gradient で勾配計算させたためかな?と思い、念のため numerical_gradient (数値微分版の勾配計算) でも計算させてみましたが変わりませんでした。

※ちなみに、繰り返し数を 10,000 → 1,000 として計算させたところ、私の環境 (Core i7 、コア数 4、メモリ 8GB の VirtualBox ゲスト Linux で実行。) では、gradient 版は 3秒程で計算できましたが、numerical_gradient 版は 16時間かかりました。。。

パラメータか訓練データが何か違うのだろうということで、ここは深くは追及せずに先へ進みます。

5章 誤差逆伝播法

微分の計算に誤差逆伝播法を使う方法を学習。あぁ、もう微分の計算かなり忘れてるなぁ。計算グラフは、逆伝播の様子が視覚化されるのは良いけれど、なぜこれでうまく微分が計算できるのかはよくわらなかった。

後半は、誤差逆伝播法を使ったより実践的なニューラルネットワーク実装方法の解説。この方法で、レイヤを重ねていっても同じようにコーディングしていけるわけですね。

ここまででだいぶ進んだ気になってますが、本の分量的にはまだ半分です。


慣れない Twitter (https://twitter.com/alt_area) でも少しずつ学習状況をつぶやいてますのでよろしくお願いします。
ブログ (https://jade.alt-area.jp/) もまたまたリニューアルしました。


Note やるからには、サポートがいただけるような役立つ記事を書きたいものです。サポートは資料購入に宛てます。