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

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

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

f:id:fukuko-parallel-work:20211129194305j: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 我妻善逸(あがつまぜんいつ)


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

善逸の名言です。


善逸は、主人公・炭治郎の同期に当たる鬼殺の剣士

いつもはタダの「ヘタレ」、ですが(笑)

本人は知ってか知らずなのか

実は彼も炭治郎と同様

地獄のような鍛錬に耐え、鍛え抜かれた身体能力を持ちます


そんな彼のコトバは、ホントそのとおり!

1発勝負よりも地道にコツコツが一番大変なんですよ!

毎日毎日続けるうちにやめたいとか、メンドウとか、ゼッタイいろいろ考えちゃいますもん。
苦笑(>ー<)


そんな時唯一できることは

やらないとなんか落ち着かないくらいルーティン化しちゃうコト。

とにかくいちいち毎日あんまり考えこまず、

とにかく最初はとりあえず毎日こなすことだけ考える


すると…


いつのまにか、毎日終わってないと落ち着かないくらいルーティン化していて


そして、

気がついたら目標を達成☆彡していてビックリみたいな。笑

それぐらい、毎日やるのが当たり前になってしまったら「こっちのモノ」なんですよね。



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

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

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

というコトで、

今日もこなすのが当たり前! 地道にコツコツ、私はノルマをこなしますよ! 笑


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




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

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

本の目次

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



ちなみに…

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

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

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



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


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

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

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


6.2.3 ReLUの場合の重みの初期値


「Xavierの初期値」は、活性化関数が線形であることを前提に導いた結果


Sigmoid関数tanh関数は、「Xavierの初期値」に適している


たいする、


ReLU関数は、「Heの初期値」が適している

「Heの初期値」とは??


前層のノードの数がnこの場合、\sqrt{\dfrac{2}{n}}標準偏差とするガウス分布を用いる


直感的に

「Xavierの初期値」は、 \dfrac{1}{\sqrt{n}}標準偏差を持つガウス分布で初期化なので、


「Heの初期値」は、\sqrt{\dfrac{2}{n}}標準偏差とするガウス分布で、

より広がりを持たせるために倍の係数が必要となる、と考えられる。


ー重みの初期値のまとめー

- Sigmoid関数とtanh関数:Xavierの初期値を使う
- ReLU関数:Heの初期値を使う


6.2.4 MNISTデータセットによる重みの初期値の比較


では

実際のところ「Xavierの初期値」と「Heの初期値」が

どれだけニューラルネットワークの学習に影響を与える
か見てみる。


3つのケース、①std = 0.01, ②Xavierの初期値 ③ Heの初期値で実験


Pythonで実装が↓のとおり。

# 6.2.4 MNISTデータセットによる重みの初期値の比較

# 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.util import smooth_curve
from common.multi_layer_net import MultiLayerNet
from common.optimizer import SGD

# 0:MNISTデータの読み込み==========

(x_train, t_train), (x_test, t_test) = load_mnist(normalize = True)

train_size = x_train.shape[0]
batch_size = 128
max_iterations = 2000#イテレーション:反復回数

# 1:実験の設定==========

weight_init_types = {'std=0.01': 0.01, 'Xavier': 'sigmoid', 'He': 'relu'}#重みの初期値の設定
optimizer = SGD(lr=0.01)

networks = {}
train_loss = {}
 
for key, weight_type in weight_init_types.items():
    networks[key] = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100],
                                  output_size=10, weight_init_std=weight_type)
    train_loss[key] = []

# 2:訓練の開始==========

for i in range(max_iterations):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
    
    for key in weight_init_types.keys():
        grads = networks[key].gradient(x_batch, t_batch)
        optimizer.update(networks[key].params, grads)
        
        loss = networks[key].loss(x_batch, t_batch)
        train_loss[key].append(loss)
        
    if i % 100 == 0:
        print("============" + "iteration:" + str(i) + "==========")
        for key in weight_init_types.keys():
            loss = networks[key].loss(x_batch, t_batch)
            print(key + ":" + str(loss))
       
    
# 3.グラフの描画==========
markers = {'std=0.01': 'o', 'Xavier': 's', 'He': 'D'}
x = np.arange(max_iterations)
for key in weight_init_types.keys():
    plt.plot(x, smooth_curve(train_loss[key]), marker=markers[key], markevery=100, label=key)
plt.xlabel("iterations")
plt.ylabel("loss")
plt.ylim(0, 2.5)
plt.legend()
plt.show()


実装結果は↓のとおり


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



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



↑の図のとおり、結果を見ると

グリーンの「Heの初期値」がイチバン学習の進みが早いことがわかる


ポイント!!

重みの初期値の重要性は見落とされがちだが、

何事もスタート(初期値)が肝心!!


6.3 Batch Normalization


Batch Normalizationとは?

"強制的に"アクティベーションの分布を調整する手法


6.3.1 Batch Normalizationのアルゴリズム


Batch Normalizationは、2015年に提案された手法


メリット3点

1.学習を早くする

2.初期値にそれほど依存しない

3.過学習を抑制する


今日のまとめ


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

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

引き続き頑張りまっす。


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

フクコ


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


E資格とは?

www.fukuko-parallel-work.com