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

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

「ゼロから作るDeep Learning 2 ―自然言語処理編」から変更したLSTMコードの数式導出

注)2023/8/27 すみません、本文真ん中へんの(*1s)から(*1 e)の部分が数行ほど前にずれていたのを修正しました。いままで見てくれた方、ごめんなさい。

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


ということで、また、いままでと同じように次のステップは「ゼロから作るDeep Learning 2 ―自然言語処理編」P216、第5章「5.5.3 RNNLMの学習コード」を変更したLSTMコードでバックプロパゲーションの数式を導くことにします。

LSTMの構造は

となっています。

これをもとにバックプロパゲーション(誤差逆伝搬)の数式を導いていきました。

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

スタートの式は


と書けるでしょうか、、、、、

で、求めたいのはWxとWhの誤差勾配なので

Wxに対しては

と導けて、
Whに対しては
と導けます。
ほぼほぼRNNの時と同じ感じで、WxとWhに共通したdL/da・da/duを導ければ誤差逆伝搬が計算できます。そしてこのdL/da・da/duはRNNよりちょっと複雑で4つあって、具体的には
と書かれます。
これは、さらに計算を進めて整理できます。
cとhが
と書かれることから、この関係を使って勾配計算をすると
となります。
この式を具体的に f,i,g について書くと
となります。

得られた式の共通部分を
と「ds」を使って表記することにすると

と書き直せます。

(*1 s)
この変形では、f,i がシグモイド関数、g が tanh() 関数
なので、シグモイド関数の微分がy(1-y)の形に、 tanh() 関数の微分が(1-y^2)の形になることを使いました。
(*1 e)

加えて、o については、(o もシグモイド関数なので微分がy(1-y)の形なのを使って)

と変形できます。

ということで、求めた活性化関数 f,i,g,o の誤差勾配をまとめて書くと、
となります。

これから、もし、ds と dL/dh を求められば、dL/du が得られることが分かります。
もう一度 ds を確認すると
なので、結局、dL/dc と dL/dh が求まれば、dL/du が求まります。

というわけで、ここからは、「 dL/dc と dL/dh をバックプロパゲーション(誤差逆伝搬)で求めましょう」ということになります。

まず、dh/dh のバックプロパゲーション(誤差逆伝搬)の式を求めます。
「(l,t)層の dL/dh」を「(l+1,t)層の dL/dh」と「(l,t+1)層の dL/dh」で展開していきます。

ここに前式を、「層」と「時間」を変えて、代入していくわけです。つまり、

こういう感じです。

この具体的な計算結果は、

となります。「(l,t)層の dL/dh」が「(l+1,t)層の dL/dh」と「(l,t+1)層の dL/dh」からできていることが確かめられますね。

「dL/dh」が求められました。

次は「dL/dc」を求めますと、
最後の式の、第2項は、その最終項から、n=jのみが残るので
と得られます。なお、最終項は
の関係を使っています。

また、この計算では次の関係も考慮します。
ようやくこれで、「dL/dh」と「dL/dc」がバックプロパゲーションで求められますね。

これを絵的に示すと

となります。

RNNと比較して、細かい計算はいろいろ違いますが、大きな計算の流れはRNNと同じなので ”「ゼロから作るDeep Learning 2 ―自然言語処理編」でRNNコードの数式導出” も参照してください



以上です。



コメント

このブログの人気の投稿

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

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