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

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

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

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


こんにちは!

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

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



前回の記事↓に続き

www.fukuko-parallel-work.com




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


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

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

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

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


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




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

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

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


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

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


と、まとめに入る前に…

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



「お前はそれでいい。1つできれば万々歳だ。
  1つのことしかできないならそれを究めぬけ。
  極限の極限まで磨け。」
 
by じいちゃん(桑島慈悟郎)



またまたついつい引用してしまう私の大好きな鬼滅の刃から(笑)

善逸の育て、じいちゃんの名言です。

たとえ1つのことでも究めればスゴクなれる!

うう、じいちゃんありがとう! やる気が出てきた! 

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

というコトで、今日も1つ、私はノルマをこなしますよ! 笑


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



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

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

本の目次

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


ちなみに…

ゼロつくディープラーニング第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となる理由は、

認識精度だとパラメータの微小な変化にほとんど反応しないから

たとえ反応しても、その値は不連続にいきなり変化しやすい

そのため損失関数を使った方がイイ


今日のまとめ


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

今日でついに

ゼロつくディープラーニング毎日5ページチャレンジも10日目☆彡となりました!!

わーい😃 よーし、この調子でがんばるぞ!

ということで、第4章はまだまだつづきます!

引き続き頑張りまっす。


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

フクコ


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