ディープラーニングのお勉強体験記”23:GRU数式導出”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)
- リンクを取得
- ×
- メール
- 他のアプリ
「ゼロから作るDeep Learning 2 ―自然言語処理編」から変更したGRUコードの数式導出
いままでと同じように、コード全体が見えるようになったので、アルゴリズムを追いかけやすくなりました。
ということで、また、いままでと同じように次のステップは「ゼロから作るDeep Learning 2 ―自然言語処理編」P216、第5章「5.5.3 RNNLMの学習コード」を変更したGRUコードでバックプロパゲーションの数式を導くことにします。
GRUの構造は
となっています。
これをもとにバックプロパゲーション(誤差逆伝搬)の数式を導いていきました。
(いままでと同じで、以下ウェイト:wについて書きます、バイアス:bは端折っています)
スタートの式は
g=z、rの場合、「σ()」はシグモイド関数で、
です。
ここでちょっと注意というか、私が困ったことです。GRUの数式の導出は、LSTMと同じように表記したかったのですが、、、、、、、、
GRUコードでは、変数に「h」を使って、活性化関数にも「h」を使っていました。(正確には活性化関数のhは「h hat」でhの上に帽子が乗っていますが、、、、)
こういう感じです。この絵はこのサイトからお借りいたしました。(絵は、少しだけいじっています)
これは、扱い難くて困りました。ということで、LSTMでは活性化関数を「f」などと表記しましたが、GRUでは「z」などの活性化関数は「az」などどと表記しています。
(まあ、LSTMの表記方法をGRUに合わせれば良いのですが、現時点では「心が折れている」ので、、、、、、、いずれ、気持ちが復活すれば書き直そうかなと思っています)
で、本題に戻って、求めたいのはWxとWhの誤差勾配なので
Wxに対しては、g=h,z,rのすべてに対して
と導けて、
Whに対しては、g=z,rに対して
と導けて、
g=h に対しては、活性化関数uhのWh側の項が
と、3項で、Wx側の項と比べて、1項多いので、と計算されます。
ほぼほぼRNNの時と同じ感じで、WxとWhに共通したdL/da・da/duを導ければ誤差逆伝搬が計算できるということになります。そしてこのdL/da・da/duはLSTMよりだいぶ複雑になっています。
ではまず、dL/da・da/duを具体的に求めてみます。
(以下 「・・・と導けます」 と書いていますが、「dL/dh」が現れるように意図的に変形しています、たぶんこれは「式をコードにするための計算」の「センス」が問われる部分ではないのかと思うのです(たぶんですけど、、、)、LSTMのところでも書きましたけど、よくもまあ、誰だか知らないのですが(ここでも開発者に失礼です、すみません)こんな大変な計算したなあー、、、と、やっぱりものすごく尊敬してしまいます。(繰り返しになりますがパイオニアは、ほんと大変で、欧米の社会の人たちの底力を感じずにはいられません!!!!))
g=hの場合は、
と導けます。この計算には、
を使っています。
g=zの場合は、
と導けます。この計算には、
を使っています。
g=rの場合は、ちょっと計算が複雑になります。その理由はuhが、arを介して、urの関数となっているためで、
この関係を使えば「dL/dur」は、「dL/duh」に書き換えられて
と計算されます。
で、最後の式の最後の項は、
となりますので、最終的に
以上をまとめると、(つまり g=h、z、r の場合)
この3つの式から、
が共通しているので、これを求めれば、良いことがわかります。というわけで、ここから「dL/dh」をバックプロパゲーションで求めることを考えていきます。
ということで「dL/dh」を「(l+1)層」と「(t+1)層」の勾配で展開しますと
ここで最後の項は、hについて
- リンクを取得
- ×
- メール
- 他のアプリ
コメント
コメントを投稿