こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の2月の試験に向けてE資格試験勉強中のため
E資格とは?の記事はコチラ↓
ゼロつくシリーズでおなじみ
オーライリーから出版されている
ディープラーニングの本格的な入門書でよくおススメされる
「ゼロからつくる Deep Learning」本
この本↑を毎日5ページずつコツコツこなすと
約2か月間で今年中に終了するので
来年のE資格試験までにこれで基礎力をつけることにしました。(^^)
ついつい私は何もないとだらけてしまうので(笑)
毎日5ページ終わった後の記録とまとめを書いていこうと思います。
と、まとめに入る前に…
やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)
「努力することは苦手です。
地道にコツコツが一番大変です。」
by 我妻善逸(あがつまぜんいつ)
私の大好きな「鬼滅の刃」から
善逸の名言です。
善逸は、主人公・炭治郎の同期に当たる鬼殺の剣士。
いつもはタダの「ヘタレ」、ですが(笑)
本人は知ってか知らずなのか
実は彼も炭治郎と同様
地獄のような鍛錬に耐え、鍛え抜かれた身体能力を持ちます。
そんな彼のコトバは、ホントそのとおり!
1発勝負よりも地道にコツコツが一番大変なんですよ!
毎日毎日続けるうちにやめたいとか、メンドウとか、ゼッタイいろいろ考えちゃいますもん。
苦笑(>ー<)
そんな時唯一できることは
やらないとなんか落ち着かないくらいルーティン化しちゃうコト。
とにかくいちいち毎日あんまり考えこまず、
とにかく最初はとりあえず毎日こなすことだけ考える。
すると…
いつのまにか、毎日終わってないと落ち着かないくらいルーティン化していて
そして、
気がついたら目標を達成☆彡していてビックリみたいな。笑
それぐらい、毎日やるのが当たり前になってしまったら「こっちのモノ」なんですよね。
善逸、どうもありがとう! (^0^)
今日もやる気が出てきました!
よし!! 今日も頑張るぞ~! お~!!
というコトで、
今日もこなすのが当たり前! 地道にコツコツ、私はノルマをこなしますよ! 笑
ではでは、いい加減まとめに入ります。笑
その前に本の目次の紹介です。
ゼロつくディープラーニングは、下記↓の合計8章で構成されています。
本の目次
- 1章 Python入門
- 2章 パーセプトロン
- 3章 ニューラルネットワーク
- 4章 ニューラルネットワークの学習
- 5章 誤差伝播法
- 6章 学習に関するテクニック
- 7章 畳み込みニューラルネットワーク
- 8章 ディープラーニング
ちなみに…
ゼロつくディープラーニングの第1章はPython入門のセクション(20ページ分)なので、
とりあえず今回私は飛ばし、第2章からまとめています。
現在は、第6章からで~す。
第6章 学習に関するテクニックつづき
ニューラルネットワークの学習において
キーとなる重要なアイディアを説明する。
ニューラルネットワークの学習を効率的に進め、認識精度を高める手法を紹介。
6.2.3 ReLUの場合の重みの初期値
「Xavierの初期値」は、活性化関数が線形であることを前提に導いた結果。
Sigmoid関数やtanh関数は、「Xavierの初期値」に適している。
たいする、
ReLU関数は、「Heの初期値」が適している。
「Heの初期値」とは??
前層のノードの数がnこの場合、を標準偏差とするガウス分布を用いる。
直感的に
「Xavierの初期値」は、 の標準偏差を持つガウス分布で初期化なので、
より広がりを持たせるために倍の係数が必要となる、と考えられる。
ー重みの初期値のまとめー
- 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()
実装結果は↓のとおり。
↑の図のとおり、結果を見ると
グリーンの「Heの初期値」がイチバン学習の進みが早いことがわかる。
ポイント!!
重みの初期値の重要性は見落とされがちだが、
何事もスタート(初期値)が肝心!!
今日のまとめ
ハイ、今日はここまで!!
第6章の学習に関するテクニックまだまだ続きます!(^^)
引き続き頑張りまっす。
最後まで読んでくださり、ありがとうございます!
フクコ
ディープラーニング入門書おススメ本
E資格とは?