こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の2月の試験に向けてE資格試験勉強中のため
E資格とは?の記事はコチラ↓
ゼロつくシリーズでおなじみ
オーライリーから出版されている
ディープラーニングの本格的な入門書でよくおススメされる
「ゼロからつくる Deep Learning」本
この本↑を毎日5ページずつコツコツこなすと
約2か月間で今年中に終了するので
来年のE資格試験までにこれで基礎力をつけることにしました。(^^)
ついつい私は何もないとだらけてしまうので(笑)
毎日5ページ終わった後の記録とまとめを書いていこうと思います。
と、まとめに入る前に…
やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)
「後悔しない選択をしたい。未来を選びたいの!」
by エマ
私の大好きな「約束のネバーランド」(約ネバ)から
エマの名言です。
約ネバの主人公、エマはホントに常に前向きな女の子です。
最初はなんて無鉄砲な…(>ー<)と思っていましたが(笑)
エマの行動力と発言に勇気づけられます。(^^)
とにかく未来を変えたいなら…
どんなにくじけそうになっても
たとえ眠くても…(笑)
今頑張るっきゃない!!
エマ、どうもありがとう! (^0^)
今日もやる気が出てきました!
よし!! 今日も頑張るぞ~! お~!!
というコトで、今日も未来を切り開くために、努力の継続!ノルマをこなしますよ! 笑
ではでは、いい加減まとめに入ります。笑
その前に本の目次の紹介です。
ゼロつくディープラーニングは、下記↓の合計8章で構成されています。
本の目次
- 1章 Python入門
- 2章 パーセプトロン
- 3章 ニューラルネットワーク
- 4章 ニューラルネットワークの学習
- 5章 誤差伝播法
- 6章 学習に関するテクニック
- 7章 畳み込みニューラルネットワーク
- 8章 ディープラーニング
ちなみに…
ゼロつくディープラーニングの第1章はPython入門のセクション(20ページ分)なので、
とりあえず今回私は飛ばし、第2章からまとめています。
今回も引き続き、第5章のつづきからでーす。
第5章 誤差逆伝播法のつづき
ココでは、
重みパラメータの勾配の計算を効率よく行える「誤差逆伝播法」について学ぶ。
5.7.3 誤差逆伝播法の勾配確認
勾配を求める方法は2とおりある。
1.数値微分によって求める方法
2.誤差逆伝播法を使って解析的に数式を解いて求める方法
2番の誤差逆伝播法を使う方が、勾配を効率よく早く求められる。
↑の1番と2番で求めた勾配の結果は完全に一致するわけではない。
だが、
近似値であることを証明する「勾配確認」のPythonの実装が以下のとおり。
# 5.7.3 誤差逆伝播法の勾配確認 # まずはライブラリとかをインポート import sys, os sys.path.append(os.pardir) import numpy as np from dataset.mnist import load_mnist from two_layer_net import TwoLayerNet # データの読み込み (x_train, t_train), (x_test, t_test) = load_mnist(normalize = True, one_hot_label = True) network = TwoLayerNet(input_size = 784, hidden_size = 50, output_size = 10) x_batch = x_train[:3] t_batch = t_train[:3] grad_numerical = network.numerical_gradient(x_batch, t_batch) grad_backdrop = network.gradient(x_batch, t_batch) #各重みの絶対誤差の平均を求める for key in grad_numerical.keys(): diff = np.average(np.abs(grad_backdrop[key] - grad_numerical[key])) print(key + ":" + str(diff)) # 答え: # W1:2.0366530027062157e-06 # b1:1.4795190663557863e-05 # W2:4.2110134901489165e-09 # b2:1.3961877864121507e-07
↑の結果から、
数値微分と誤差逆伝播法でそれぞれ求めた勾配の差はかなり小さいことがわかる。
例えば
一層の重み(W1)の誤差は
2.0366530027062157e-06(0.0000020366530027062157)という値なので
ものすごーく誤差が小さいというコトになる。
5.7.4 誤差逆伝播法を使った学習
最後に
誤差逆伝播法を使ったニューラルネットワークの学習の実装を掲載。
これまでと異なるところは
誤差逆伝播法で勾配を求めている点。
Pythonで実装すると下記のとおり。
# 5.7.4 誤差逆伝播法を使った学習 # まずはライブラリとかをインポート import sys, os sys.path.append(os.pardir) import numpy as np from dataset.mnist import load_mnist from two_layer_net import TwoLayerNet # データの読み込み (x_train, t_train), (x_test, t_test) = load_mnist(normalize = True, one_hot_label = True) network = TwoLayerNet(input_size = 784, hidden_size = 50, output_size = 10) iters_num = 10000 train_size = x_train.shape[0] batch_size = 100 learning_rate = 0.1 train_loss_list = [] train_acc_list = [] test_acc_list = [] iter_per_epoch = max(train_size / batch_size, 1) for i in range(iters_num): batch_mask = np.random.choice(train_size, batch_size) x_batch = x_train[batch_mask] t_batch = t_train[batch_mask] #誤差逆伝播法によって勾配を求める grad = network.gradient(x_batch, t_batch) #更新 for key in ('W1', 'b1', 'W2', 'b2'): network.params[key] -= learning_rate * grad[key] loss = network.loss(x_batch, t_batch) train_loss_list.append(loss) if i % iter_per_epoch == 0: train_acc = network.accuracy(x_train, t_train) test_acc = network.accuracy(x_test, t_test) train_acc_list.append(train_acc) test_acc_list.append(test_acc) print(train_acc, test_acc) # 答えは # 0.09673333333333334 0.0975 # 0.90715 0.9098 # 0.9251 0.9278 # 0.9396666666666667 0.9402 # 0.94705 0.9441 # 0.95255 0.9486 # 0.9577666666666667 0.9536 # 0.9604833333333334 0.9567 # 0.9643666666666667 0.9566 # 0.9650666666666666 0.958 # 0.9694333333333334 0.9619 # 0.9708666666666667 0.9634 # 0.9733166666666667 0.9656 # 0.9744833333333334 0.9663 # 0.9756166666666667 0.9681 # 0.9773666666666667 0.9693 # 0.9789333333333333 0.9711
5.8 第5章 誤差逆伝播法のまとめ
第5章の要点のまとめは下記のとおり。
- 計算グラフを用いれば、計算過程を視覚的に把握できる。
- 計算グラフのノードは、局所的な計算によって構成される。
- 計算グラフの順伝播は、通常の計算を行う。一方、計算グラフの逆伝播は各ノードの微分を求めることができる。
- ニューラルネットワークの構成要素をレイヤとして実装することで、勾配の計算を効率よく求めることができる。