おひとりさま現役パラレルワーカーフクコろぐ

これからの会社員は、複数の収入源をもとう! 会社に翻弄されずアナタらしく仕事ができる。 そんなパラレルワーカーを広めるフクコのブログです。

【文系プログラミング初心者deE資格】ゼロつくディープラーニング #32

f:id:fukuko-parallel-work:20211201192057j:plain

こんにちは!

現役パラレルワーカー フクコです。

f:id:fukuko-parallel-work:20210212204833p:plain



前回の記事↓に続き

www.fukuko-parallel-work.com





来年の2月の試験に向けてE資格試験勉強中のため


E資格とは?の記事はコチラ↓

www.fukuko-parallel-work.com




ゼロつくシリーズでおなじみ

オーライリーから出版されている

ディープラーニングの本格的な入門書でよくおススメされる

「ゼロからつくる Deep Learning」本


f:id:fukuko-parallel-work:20211029220008j:plain





この本↑を毎日5ページずつコツコツこなす

約2か月間で今年中に終了するので

来年のE資格試験までにこれで基礎力をつけることにしました。(^^)


ついつい私は何もないとだらけてしまうので(笑)

毎日5ページ終わった後の記録とまとめを書いていこうと思います。


と、まとめに入る前に…

やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)

「俺は 俺が一番自分のこと好きじゃない。

 ちゃんとやらなきゃっていつも思うのに

  怯えるし 逃げるし 泣きますし。」


by 我妻善逸(あがつまぜんいつ)


私の大好きな鬼滅の刃から

善逸の名言です。


私も上手くいっていなかった頃って、自分のこと一番好きじゃなかったですね。

なーにをやっても上手くいかない

ちゃんとしたい!とは言いつつ、ついつい投げ出したくなるし、逃げだしたくなるし、泣いてばっかりいましたし。苦笑


逃げたくなっても、ぐっとこらえて一歩前にではじめてからですよ。

自分に自信ができて

なんだか自分のことが好きになりはじめて

いろいろうまくいくようになったのは。


やっぱり「人格の差」は「苦労の差」ですね!

何をやっても上手くいかないって常に反省しているぐらいの方が

苦労してるからこそいろいろ学びにつなげられ

飽和するぐらいにこなしているうちに気がついたら開花するんだと思います。(^^)



善逸、どうもありがとう! (^0^)

今日もやる気が出てきました! 

よし!! 今日も頑張るぞ~! お~!! 

というコトで、

今日も、地道にコツコツ、未来をつかむために、私はノルマをこなしますよ! 笑


ではでは、いい加減まとめに入ります。笑




その前に本の目次の紹介です。

ゼロつくディープラーニングは、下記↓の合計8章で構成されています。

本の目次

  • 5章 誤差伝播法
  • 6章 学習に関するテクニック



ちなみに…

ゼロつくディープラーニング第1章はPython入門のセクション(20ページ分)なので、

とりあえず今回私は飛ばし、第2章からまとめています。

現在は、第6章からで~す。



第6章 学習に関するテクニックつづき


ニューラルネットワークの学習において

キーとなる重要なアイディアを説明する。

ニューラルネットワークの学習を効率的に進め、認識精度を高める手法を紹介。

6.4.2 Weight Decay


過学習抑制のために、

Weight Decay(荷重減衰)という手法がある。


荷重減衰とは?

大きな重みをもつことにたいして、ペナルティを課すことで過学習を抑制するもの


L2ノルムは、

 \sqrt{W_{1}^{2}+W_{2}^{2}+\ldots +W_{n}^{2}} で計算できる


重みをWとすれば、

L2ノルムの荷重減衰は、

\dfrac{1}{2}\lambda W^{2}になり、これを損失関数に加算する


それでは、

\lambda = 0.1として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()


↑を実装した↓の結果を比べてみよう


荷重減衰なしと荷重減衰ありの訓練データとテストデータの認識精度の推移をみると、

訓練データとテストデータの精度の隔たりが小さくなっている

このことから、

荷重減衰ありの方が、過学習が抑制されたこととなる


[荷重減衰なし] ー>前回の実装データと同じもの
ー訓練データとテストデータの認識精度の推移ー

f:id:fukuko-parallel-work:20211130215154j:plain



[荷重減衰あり]
ー訓練データとテストデータの認識精度の推移ー

f:id:fukuko-parallel-work:20211201202348j:plain


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あり]
ー訓練データとテストデータの認識精度の推移ー

f:id:fukuko-parallel-work:20211201202501j:plain


[Dropoutなし]
ー訓練データとテストデータの認識精度の推移ー

f:id:fukuko-parallel-work:20211201202540j:plain


今日のまとめ


ハイ、今日はここまで!!

第6章の学習に関するテクニックまだまだ続きます!(^^)

引き続き頑張りまっす。


最後まで読んでくださり、ありがとうございます!

フクコ


ディープラーニング入門書おススメ本


E資格とは?

www.fukuko-parallel-work.com