ディープラーニングのお勉強体験記”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...

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

ゼロから作るDeep Learning2ー自然言語処理編」でDNNコードの数式導出


コード全体が見えるようになったので、私としては、アルゴリズムを追いかけやすくなりました。

ということで、次のステップは「ゼロから作るDeep Learning 2 ―自然言語処理編」P.45、第1章「1.4.3 学習用のソースコード」のDNNのバックプロパゲーションの数式を導くことにします。(DNNは一番基本的なディープラーニングのつもりです)

まず、基本的なDNNでは、ニューロンが






DNNのニューロン例の図:(l)層のj番目のニューロンに(l-1)層の3個のニューロンから信号が入るときの例(元になった画像は他のサイトから頂きました)



という感じで表されるので、これをもとに考えると一般式は

(以下ウェイト:wについて書きます、バイアス:bは端折っています)

と表せます。gは活性化関数ですね。
求めたいのは、「dL/dw」ですから
(wを更新するのに学習率ηを適当に設定して、
     w(更新後) = w(更新前)ー η(dL/dw)
とういうことを皆さんが知っているテイでお話ししてますけど、、、、、、)

上式をもとに、誤差「L」の、wjiの勾配をチェーンルールに従って変形すると
となるので、誤差「L]のwjiの勾配は
を求めれば、得られることになります。
では、「dL/du」をどうやって求めるのか?
このときに、誤差逆伝播法、バックプロパゲーションの登場となるわけですね。

早速、「l層のdL/du」を「l+1層のdL/du」にチェーンルールで書き換えると
上記の2行目から3行目はバイアスbをuで微分すると”0”なので先に落としました。
さらに、y=g(u)を使って
最終的に
が得られます。

ちなみに、gがシグモイド関数の場合は、uで微分すると
となりますので、
とも表せます。

誤差逆伝播とは、上式が、

 「dL/du(l+1)層」 から 「dL/du(l)層」が得られる!

ことを表しているためにそう呼ばれているんですね。(のはず、、、、)

むかし習った数列に似ているようです。何らかの方法で、「最初の項が分かればあとは順番に求まっていく」ということです。ただ、誤差逆伝播法の場合は「最初の項」ではなくて「最後の項」から始まって、逆の順番に求まっていくというところが数列とちょっと違うところです。



式の導出に関しては以上なのですが、ここまでのお話は、結構いろいろなところで見かけると思います。関連する多くの書籍でも、このことは記載されているようで、理系出身であれば「もう知ってるよ!」という方が多いのではないでしょうか?
ただ私としては、式の途中で微分の記号「dL/du」を「δu」とかに書き換えるパターンが、ネットでも書籍でもすごく多くて、読みにくくて大変でした。というわけであえてここに「微分記号だけで書いたもの」を載せさせて頂きました。



以上です。





コメント

このブログの人気の投稿

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

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

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