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

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

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

f:id:fukuko-parallel-work:20211124203851j: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章からまとめています。

今回も引き続き、第5章のつづきからでーす。



第5章 誤差逆伝播法のつづき

ココでは、

重みパラメータの勾配の計算を効率よく行える誤差逆伝播法」について学ぶ

5.7.3 誤差逆伝播法の勾配確認


勾配を求める方法は2とおりある。


1.数値微分によって求める方法
2.誤差逆伝播法を使って解析的に数式を解いて求める方法


2番の誤差逆伝播法を使う方が、勾配を効率よく早く求められる

↑の1番と2番で求めた勾配の結果完全に一致するわけではない


だが、

近似値であることを証明する「勾配確認」のPythonの実装が以下のとおり。


# 5.7.3 誤差逆伝播法の勾配確認

# まずはライブラリとかをインポート
import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

# データの読み込み
(x_train, t_train), (x_test, t_test) = load_mnist(normalize = True, one_hot_label = True)

network = TwoLayerNet(input_size = 784, hidden_size = 50, output_size = 10)

x_batch = x_train[:3]
t_batch = t_train[:3]

grad_numerical = network.numerical_gradient(x_batch, t_batch)
grad_backdrop = network.gradient(x_batch, t_batch)

#各重みの絶対誤差の平均を求める
for key in grad_numerical.keys():
    diff = np.average(np.abs(grad_backdrop[key] - grad_numerical[key]))
    print(key + ":" + str(diff))

# 答え:
# W1:2.0366530027062157e-06
# b1:1.4795190663557863e-05
# W2:4.2110134901489165e-09
# b2:1.3961877864121507e-07

↑の結果から、

数値微分誤差逆伝播法でそれぞれ求めた勾配の差はかなり小さいことがわかる。


例えば

一層の重み(W1)の誤差

2.0366530027062157e-06(0.0000020366530027062157)という値なので

ものすごーく誤差が小さいというコトになる。


5.7.4 誤差逆伝播法を使った学習


最後に

誤差逆伝播法を使ったニューラルネットワークの学習の実装を掲載。


これまでと異なるところは

誤差逆伝播法で勾配を求めている点


Pythonで実装すると下記のとおり。

# 5.7.4 誤差逆伝播法を使った学習

# まずはライブラリとかをインポート
import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

# データの読み込み
(x_train, t_train), (x_test, t_test) = load_mnist(normalize = True, one_hot_label = True)

network = TwoLayerNet(input_size = 784, hidden_size = 50, output_size = 10)

iters_num = 10000
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1

train_loss_list = []
train_acc_list = []
test_acc_list = []

iter_per_epoch = max(train_size / batch_size, 1)

for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
    
    #誤差逆伝播法によって勾配を求める
    grad = network.gradient(x_batch, t_batch)
    
    #更新
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key]
        
    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)
    
    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(train_acc, test_acc)

# 答えは
# 0.09673333333333334 0.0975
# 0.90715 0.9098
# 0.9251 0.9278
# 0.9396666666666667 0.9402
# 0.94705 0.9441
# 0.95255 0.9486
# 0.9577666666666667 0.9536
# 0.9604833333333334 0.9567
# 0.9643666666666667 0.9566
# 0.9650666666666666 0.958
# 0.9694333333333334 0.9619
# 0.9708666666666667 0.9634
# 0.9733166666666667 0.9656
# 0.9744833333333334 0.9663
# 0.9756166666666667 0.9681
# 0.9773666666666667 0.9693
# 0.9789333333333333 0.9711

5.8 第5章 誤差逆伝播法のまとめ


第5章の要点のまとめは下記のとおり。

  • 計算グラフを用いれば、計算過程を視覚的に把握できる。
  • 計算グラフのノードは、局所的な計算によって構成される
  • 計算グラフの順伝播は、通常の計算を行う。一方、計算グラフの逆伝播は各ノードの微分を求めることができる

今日のまとめ


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

ようやく第5章の誤差逆伝播法が終わりました!(^^)

あと残すところ、もう3章です~!!(>ー<)

引き続き頑張りまっす。


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

フクコ


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


E資格とは?

www.fukuko-parallel-work.com