こんにちは!
現役パラレルワーカー フクコです。
前回の記事↓に続き
来年の2月の試験に向けてE資格試験勉強中のため
ゼロつくシリーズでおなじみ
オーライリーから出版されている
ディープラーニングの本格的な入門書でよくおススメされる
「ゼロからつくる Deep Learning」本
この本↑を毎日5ページずつコツコツこなすと
約2か月間で今年中に終了するので
来年のE資格試験までにこれで基礎力をつけることにしました。(^^)
ついつい私は何もないとだらけてしまうので(笑)
毎日5ページ終わった後の記録とまとめを書いていこうと思います。
と、まとめに入る前に…
やる気を出すためのコトバをシェアします!!(主に私のやる気を出すために 笑)
「お前はそれでいい。1つできれば万々歳だ。
1つのことしかできないならそれを究めぬけ。
極限の極限まで磨け。」
by じいちゃん(桑島慈悟郎)
またまたついつい引用してしまう私の大好きな「鬼滅の刃」から(笑)
善逸の育て、じいちゃんの名言です。
たとえ1つのことでも究めればスゴクなれる!
うう、じいちゃんありがとう! やる気が出てきた!
よし!! 今日も頑張るぞ~! お~!!
というコトで、今日も1つ、私はノルマをこなしますよ! 笑
ではでは、いい加減まとめに入ります。笑
その前に本の目次の紹介です。
ゼロつくディープラーニングは、下記↓の合計8章で構成されています。
本の目次
- 1章 Python入門
- 2章 パーセプトロン
- 3章 ニューラルネットワーク
- 4章 ニューラルネットワークの学習
- 5章 誤差伝播法
- 6章 学習に関するテクニック
- 7章 畳み込みニューラルネットワーク
- 8章 ディープラーニング
ちなみに…
ゼロつくディープラーニングの第1章はPython入門のセクション(20ページ分)なので、
とりあえず今回私は飛ばし、第2章からまとめています。
今回も第4章のつづきからでーす。
第4章 ニューラルネットワークの学習つづき
ニューラルネットワークの学習とは、
訓練データから最適な重みパラメータの値を自動で獲得するようにできるコト。
4.2.3 ミニバッチ学習 つづき
ミニバッチ学習とは??
データの中から1部を選び出し、その1部のデータを全体の「近似」として利用するコト。
例えば、
全体で60,000枚の訓練データから、無作為に100枚選び出して学習をする。
これを、
Pythonで実装してみると…
まずは、MNISTデータを読み込むことから。
#ミニバッチ学習の例 #step1:まずはMNISTデータをを読みこむ import sys, os sys.path.append(os.pardir) import numpy as np from dataset.mnist import load_mnist (x_train, t_train), (x_test, y_test) = load_mnist(normalize=True, one_hot_label=True)#load_mnist関数はMNISTデータを読み込むため #one_hot_label=Trueで、1は正解、それ以外は0となる print(x_train.shape)#正解は、(60000, 784) print(t_train.shape)#正解は、(60000, 10)
この訓練データ↑から
どうすればランダムに10枚だけ抜き出せるのか??
NumPyのnp.random.choice()を使う。
Pythonで実装すると↓のようになる。
#ミニバッチ学習の例 #step2:訓練データからランダムに10枚だけデータを抜き出すには train_size = x_train.shape[0] batch_size = 10 batch_mask = np.random.choice(train_size, batch_size)#np.random.choice()でデータをランダムに抜き出せる x_batch = x_train[batch_mask] t_batch = t_train[batch_mask]
たとえば、
np.random.choice(60000, 10)とすると
0から60000までの数字の中からランダムに10コ数字を選び出す。
Pythonで実装するとこんな↓感じ。
#0から60000までの数字の中からランダムに10コ数字を選び出し np.random.choice(60000, 10)
答えの例は、↓のような感じ。
```
array([53810, 40628, 46862, 51793, 50634, 40459, 5969, 7825, 49238,
14601])
```
あとは、
ランダムに選ばれたインデックスを指定して、ミニバッチを取り出すだけ。
ミニバッチの損失関数は
一部のサンプルデータによって全体を近似して計測する。
要は
全体の訓練データのおおよその近似としてランダムに選ばれた小さな集まり(ミニバッチ)で代替する。
4.2.4 【バッチ対応版】交差エントロピー誤差の実装
では
ミニバッチに対応するような交差エントロピー誤差はどのように実装するのか??
Pythonで実装するとこんな↓感じ。
def cross_entropy_error(y, t): if y.ndim == 1: t = t.reshape(1, t.size) y = y.shape(1, y.size) batch_size = y.shape[0] return -np.sum(t * np.log(y + 1e-7)) / batch_size
また、教師データがラベルとして与えられたときの実装はこんな↓感じ。
def cross_entropy_error(y, t):#【バッチ対応版】交差エントロピー誤差の関数定義 if y.ndim == 1: t = t.reshape(1, t.size) y = y.shape(1, y.size) batch_size = y.shape[0] return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7))/ batch_size#教師データがラベルとして与えられたとき
ここで、
y[np.arange(batch_size), t]は、
各データの正解ラベルに対応するニューラルネットワークの出力を抽出する。
4.2.5 なぜ損失関数を設定するのか??
そもそもなぜ損失関数を設定するのか??
なぜ、損失関数ではなく、認識精度が上がるパラメータを探すとかではダメなのか?
その答え、は「微分」の役割にある。
ニューラルネットワークの学習においては、
損失関数が最小化する最適なパラメータ(重みとバイアス)を探索すること。
認識精度を指標にすると、
微分がほとんどの場所で0となり、パラメータの更新ができなくなってしまう。
微分がほとんど0となる理由は、
認識精度だとパラメータの微小な変化にほとんど反応しないから。
たとえ反応しても、その値は不連続にいきなり変化しやすい。
そのため損失関数を使った方がイイ。