ディープラーニングのお勉強体験記”30:番外編「XP」の各sin波コード”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

イメージ
「ゼロから作るDeep Learning 2 ―自然言語処理編」のRNNコード、P216、第5章「5.5.3 RNNLMの学習コード」から作ったWindows XPの各sin波コード 前回「Windows xp」でAnacondaを使えるようにしたと紹介しました。でもって、ここではそこで動く「sin波学習コード」紹介します。わざわざ紹介する内容でもないかもしれませんが、、、、、、 「Jupyter Notebook」を使うということと(普段は「Jupyter Lab」を使ってます)、コードの先頭部分に「%matplotlib inline」を追加する、グラフの表示部分をちょっと書き換えるだけ(1波形1コマンドラインにする)と、簡単ですから、、、、、 でもまあ、一応書かせてもらいます!(簡単なことでも、それなりに苦労はしていますので) 目次 1:xp用のRNNのSIN波コード 2:xp用のLSTMのSIN波コード 3:xp用のGRUのSIN波コード 1:xp用のRNNのSIN波コード # 完成版 Windows xp用 RNNコード # ゼロから作る Deep Learning2のP216、第5章「5.5.3 RNNLMの学習コード」でコード全体が見えるようにできるだけ「import」を外した # プログラムの動作検証用にSINカーブを学習させるため変更したコード # coding: utf-8 # import sys # sys.path.append('C:\\kojin\\資料\\AI関連\\ゼロから作る Deep Learning\\ゼロから作る Deep Learning2\\deep-learning-from-scratch-2-master\\') %matplotlib inline import matplotlib.pyplot as plt import numpy as np # from common.optimizer import SGD # from dataset import ptb # このimportを有効にするには上記パス設定「sys.path.append('C:\\kojin\\AI関連\\・・・」が必要! # from simple_r...

ディープラーニングのお勉強体験記”04:DNNコードと数式”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

ゼロから作るDeep Learning2ー自然言語処理編」のディープラニング”DNN”コードと数式の関係


前回、DNNのバックプロパゲーション”誤差逆伝搬”の式(活性化関数がシグモイド関数の場合)

を導きました。

この関係があれば、1つ上の(l+1)層から

をもらってくれば「(l)層のdL/du」を求めることができるということですね。
(いままで同様バイアスに関しては省略させてもらってます)
つまり、この式に(l)層の活性化関数の微分を掛けて(今の場合シグモイド関数の微分、「(1-y)y」を掛けて)
となって
が得られます。(これをそのまんま、以下、コードで確認します)

ここまでくると、
「数式とコードの関係をきちんと理解したい!」
となりまして、、、、、、

まず、メインルーチンを確認しますと、、、、
「class TwoLayerNet」を「model」として、インスタンス化して、「model.backward()」でバックプロパゲーション”誤差逆伝播”の計算をしているとなっています。

それではということで、「class TwoLayerNet」を確認すると、、、、、、
レイヤーが、

「Affine(W1, b1)」
「Sigmoid()」
「Affine(W2, b2)」
「SoftmaxWithLoss()」

で構成されていて、バックプロパゲーション”誤差逆伝播”の計算を、「この順番をひっくり返して行う(reversed)」というコードになっています。


ここからさらに、個々のレイヤーのバックプロパゲーション(誤差逆伝播)つまり「backward」を確認しますと、、、、、

まず、レイヤーの順番をひっくり返して、

さらに対応する、それぞれのレイヤの「backward」部分だけを書き出すと、
この4つのレイヤーを逆に並べて、「backward」からバックプロパゲーション”誤差逆伝播”を行っているというわけですね。




ここまでコードを確認したので、DNNコードと数式の関係を確認できそうです。

確認したいのは、バックプロパゲーション(誤差逆伝播)の式
が、「コードでどのように対応しているか」です。

まず、出力層の「SoftmaxWithLoss」は、Softmax関数を交差エントロピー誤差で計算しています。その場合、交差エントロピー誤差の勾配(微分)は(y - t)になりますので。

(y - t) は 「dL/du(l+1)層」

に対応するということですね。というわけで
これを「dx」としてreturnします。

で、「dx」は「dout」として「Affine(W2, b2).backward」レイヤーに入りますので、
また、同じようにこれを「dx」としてreturnします。ここまでが(l + 1)層で、次は(l)層になって
「dx」を「dout」として「Sigmoid().backward」レイヤーに渡すので
となって、
が得られました。
なのでこれを、またまた「dx」で「dout」として「Affine(W1, b1).backward」レイヤーに渡すと
と計算できるので、

     w(更新後) = w(更新前)ー η(dL/dw)

から、ウェイトwを学習していくことができるというわけですね。


一応、今の流れを、もう一度、矢印を使って確認すると


となるでしょうか。


うーん、ここまでくると、DNNのバックプロパゲーション”誤差逆伝播”をわかった気になりましたねー。
それにですね、バックプロパゲーション”誤差逆伝播”が分かるとディープラーニングそのものが分かったような気になるので、個人的には良かったです。


以上です。



コメント

このブログの人気の投稿

ディープラーニングのお勉強体験記”17:LSTM数式導出”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

ディープラーニングのお勉強体験記”30:番外編「XP」の各sin波コード”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

ディープラーニングのお勉強体験記”18:LSTMコードと数式”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)