こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の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.4.2 Weight Decay
過学習抑制のために、
Weight Decay(荷重減衰)という手法がある。
荷重減衰とは?
大きな重みをもつことにたいして、ペナルティを課すことで過学習を抑制するもの。
L2ノルムは、
で計算できる。
重みをWとすれば、
L2ノルムの荷重減衰は、
になり、これを損失関数に加算する。
それでは、
としてWeight Decayを適用してみる。
Pythonの実装は↓のとおり。
# 6.4.2 Weight Decay # 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()
↑を実装した↓の結果を比べてみよう。
荷重減衰なしと荷重減衰ありの訓練データとテストデータの認識精度の推移をみると、
訓練データとテストデータの精度の隔たりが小さくなっている。
このことから、
荷重減衰ありの方が、過学習が抑制されたこととなる。
[荷重減衰なし] ー>前回の実装データと同じもの
ー訓練データとテストデータの認識精度の推移ー
[荷重減衰あり]
ー訓練データとテストデータの認識精度の推移ー
6.4.3 Dropout
ニューラルネットワークのモデルが複雑になってくると
Weight Decayだけで、過学習を抑制することは困難。
そこで出てくるのが、
Dropoutという手法。
Dropoutとは?
ニューロンをランダムに消去しながら学習する手法。
それでは、Dropoutを用いてPythonで実装してみる。
Pythonの実装は↓のとおり。
# 6.4.3 Dropout # 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_extend import MultiLayerNetExtend from common.trainer import Trainer (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True) # 過学習を再現するために、学習データを削減 x_train = x_train[:300] t_train = t_train[:300] # Dropuoutの有無、割り合いの設定 ======================== use_dropout = True # Dropoutなしのときの場合はFalseに dropout_ratio = 0.2 # ==================================================== network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10, use_dropout=use_dropout, dropout_ration=dropout_ratio) trainer = Trainer(network, x_train, t_train, x_test, t_test, epochs=301, mini_batch_size=100, optimizer='sgd', optimizer_param={'lr': 0.01}, verbose=True) trainer.train() train_acc_list, test_acc_list = trainer.train_acc_list, trainer.test_acc_list # グラフの描画========== markers = {'train': 'o', 'test': 's'} x = np.arange(len(train_acc_list)) 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()
↑を実装した↓の結果を比べてみよう。
↓の結果を見ると
Dropoutを用いることで、
訓練データとテストデータの認識精度の隔たりが小さくなった。
したがって、
Dropoutを用いれば、
表現力の高いネットワークでも、過学習を抑制することができる。
[Dropoutあり]
ー訓練データとテストデータの認識精度の推移ー
[Dropoutなし]
ー訓練データとテストデータの認識精度の推移ー
今日のまとめ
ハイ、今日はここまで!!
第6章の学習に関するテクニックまだまだ続きます!(^^)
引き続き頑張りまっす。
最後まで読んでくださり、ありがとうございます!
フクコ
ディープラーニング入門書おススメ本
E資格とは?