こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の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章からまとめています。
現在は、第6章からで~す。
第6章 学習に関するテクニックつづき
ニューラルネットワークの学習において
キーとなる重要なアイディアを説明する。
ニューラルネットワークの学習を効率的に進め、認識精度を高める手法を紹介。
6.3.1 Batch Normalizationのアルゴリズム つづき
Batch Normは、
データの分布が平均が0で分散が1になるような正規化をミニバッチごとに行う。
数式で表すと次の↓のとおり。
←
←
6.3.2 Batch Normalizationの評価
Batch Normレイヤを使用して、
学習の進みがどうなるか見てみる。
Pythonで実装すると↓のとおり。
# 6.3.2 Batch Normalizationの評価 # coding: utf-8 import sys, os sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定 import numpy as np import matplotlib.pyplot as plt from dataset.mnist import load_mnist from common.multi_layer_net_extend import MultiLayerNetExtend from common.optimizer import SGD, Adam (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True) # 学習データを削減 x_train = x_train[:1000] t_train = t_train[:1000] max_epochs = 10 train_size = x_train.shape[0] batch_size = 100 learning_rate = 0.01 def __train(weight_init_std): bn_network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100], output_size=10, weight_init_std=weight_init_std, use_batchnorm=True) network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100], output_size=10, weight_init_std=weight_init_std) optimizer = SGD(lr=learning_rate) train_acc_list = [] bn_train_acc_list = [] iter_per_epoch = max(train_size / batch_size, 1) epoch_cnt = 0 for i in range(1000000000): batch_mask = np.random.choice(train_size, batch_size) x_batch = x_train[batch_mask] t_batch = t_train[batch_mask] for _network in (bn_network, network): grads = _network.gradient(x_batch, t_batch) optimizer.update(_network.params, grads) if i % iter_per_epoch == 0: train_acc = network.accuracy(x_train, t_train) bn_train_acc = bn_network.accuracy(x_train, t_train) train_acc_list.append(train_acc) bn_train_acc_list.append(bn_train_acc) print("epoch:" + str(epoch_cnt) + " | " + str(train_acc) + " - " + str(bn_train_acc)) epoch_cnt += 1 if epoch_cnt >= max_epochs: break return train_acc_list, bn_train_acc_list # 3.グラフの描画========== weight_scale_list = np.logspace(0, -4, num=16) x = np.arange(max_epochs) for i, w in enumerate(weight_scale_list): print( "============== " + str(i+1) + "/16" + " ==============") train_acc_list, bn_train_acc_list = __train(w) plt.subplot(4,4,i+1) plt.title("W:" + str(w)) if i == 15: plt.plot(x, bn_train_acc_list, label='Batch Normalization', markevery=2) plt.plot(x, train_acc_list, linestyle = "--", label='Normal(without BatchNorm)', markevery=2) else: plt.plot(x, bn_train_acc_list, markevery=2) plt.plot(x, train_acc_list, linestyle="--", markevery=2) plt.ylim(0, 1.0) if i % 4: plt.yticks([]) else: plt.ylabel("accuracy") if i < 12: plt.xticks([]) else: plt.xlabel("epochs") plt.legend(loc='lower right') plt.show()
↑を実装した結果が図↓のとおり。
Batch Normを使用した方が学習の進みが早いことがわかる。
6.4 正則化
機械学習のモンダイでは、
過学習がモンダイになることが多くある。
複雑で表現力の高いモデルを作ることは可能だが、
その分、
過学習を抑制するテクニックが重要となってくる。
6.4.1 過学習
過学習(Overfitting)が起きる原因は↓の2つ。
- パラメータを大量に持ち、表現力が高いモデル
- 訓練データが少ない
この↑の2つの条件をわざと満たして
過学習(Overfitting)をわざと起こしてみる。
Pythonで実装すると↓のとおり。
# 6.4.1 過学習 # coding: utf-8 import os import sys sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定 import numpy as np import matplotlib.pyplot as plt from dataset.mnist import load_mnist from common.multi_layer_net import MultiLayerNet from common.optimizer import SGD (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True) # 過学習を再現するために、学習データを削減 x_train = x_train[:300] t_train = t_train[:300] # weight decay(荷重減衰)の設定 ======================= #weight_decay_lambda = 0 # weight decayを使用しない場合 weight_decay_lambda = 0.1 # ==================================================== network = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10, weight_decay_lambda=weight_decay_lambda) optimizer = SGD(lr=0.01) max_epochs = 201 train_size = x_train.shape[0] batch_size = 100 train_loss_list = [] train_acc_list = [] test_acc_list = [] iter_per_epoch = max(train_size / batch_size, 1) epoch_cnt = 0 for i in range(1000000000): batch_mask = np.random.choice(train_size, batch_size) x_batch = x_train[batch_mask] t_batch = t_train[batch_mask] grads = network.gradient(x_batch, t_batch) optimizer.update(network.params, grads) 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("epoch:" + str(epoch_cnt) + ", train acc:" + str(train_acc) + ", test acc:" + str(test_acc)) epoch_cnt += 1 if epoch_cnt >= max_epochs: break # 3.グラフの描画========== markers = {'train': 'o', 'test': 's'} x = np.arange(max_epochs) plt.plot(x, train_acc_list, marker='o', label='train', markevery=10) plt.plot(x, test_acc_list, marker='s', label='test', markevery=10) plt.xlabel("epochs") plt.ylabel("accuracy") plt.ylim(0, 1.0) plt.legend(loc='lower right') plt.show()
↑のPythonの実装結果は↓のとおり。
ー訓練データとテストデータの認識精度の推移ー
↑の結果を見るとわかるように、
100エポック過ぎたあたりから、訓練データの認識精度は90%以上と高くなっている。
たいする、
テストデータに対しては100%の認識精度からはかなり隔たりがある。
これは、訓練データに対して適応しすぎ(Overfitting)た状態を表す。
今日のまとめ
ハイ、今日はここまで!!
第6章の学習に関するテクニックまだまだ続きます!(^^)
引き続き頑張りまっす。
最後まで読んでくださり、ありがとうございます!
フクコ
ディープラーニング入門書おススメ本
E資格とは?