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

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

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


前回、GRUのバックプロパゲーション(誤差逆伝搬)の式を導きました。なので、続いてGRUコードと数式の関係を確認していきたいと思います。


で、コードの全体は基本的にRNNと同じ内容なので、確認するのは「class GRU」「class TimeGRU」の「def backward(self, ***)」に対して行います。


この部分ですね。

「class TimeGRU」の「layer.backward()」と数式の関係は



つまり、「class TimeGRU」の部分では、(l+1,t)層と(l,t+1)層から誤差勾配をもらって、バックプロパゲーション(誤差逆伝搬)を行うわけですね。

RNNの時にも、LSTMの時も、書きましたが、 ”(l+1,t)層” は、コード的には1層違うタイミングで計算しているので、一旦リストに保存しています、だから「dhs[:,t,:]」と書かれる訳ですね。( ”RNNバックプロパゲーションの「アルゴリズム」と「数式」の間のちょっとしたギャップ” を参照してください)

でもって、コードと数式の対応は(まず、「層方向の式とコード」から確認すると)

コードの開始は「(l+ 1)層」と「(t+ 1)層」から得られた勾配「dL/dh」を「dh_next」に入力するところから始まります。



続いて、「時間方向の式とコード」を確認すると



となります。

ちょっと ”ごちゃごちゃ” し過ぎですかね、、、、、でも一つ一つ、丁寧にコードと数式を追っかけていけば、コードが数式通りに作られていることを実感できるんじゃないでしょうか、、、、、、、どうでしょう?


RNNやLSTMでも言いましたが、数式とアルゴリズムではちょっと違いがあるので、注意が必要です。
上記はアルゴリズムに対応する式なので、前回のブログで導いた数式と少し異なっています。一応、「アルゴリズムに対応する式」を、下に書いておくと、、、、
「層方向の式」は
で。
「時間方向の式」は

となります。




*****2024年1月5日追記_開始******
すみません。下の「ちょっと感想」は、「学習」と「推論」を区別して書くべきでした。

私は主として「学習」の場合でコメントしていて、
「LSTMと比較してGRUが遅いと思う」と書きました。
(実際に下の「測定時間」は、「学習と推論」のトータル時間です)

一方、考えてみれば、当たり前ですが、
一般に言われる特徴については、活用時の「推論」単独の場合のことだと思います。
その場合、
「GRUがLSTMと比較して早い」
ということなのですね。

大変失礼いたしました。
*****2024年1月5日追記_終了******

ちょっと感想

なんか、ゼロつく2のGRU紹介文や、ネットを検索すると、
GRUは、LSTMに対して

”簡易版” ”計算効率化版” ”軽量化版” ”改善版” ”シンプルにしたもの” ”計算量が少なくて済む” ”高速で簡単に実行できる”

などと紹介されていて、

「記憶セルがない」
「ゲートが1つ少ない」

というのが、LSTMと比較したときの特徴とされているようです。

でも、いままでのLSTMとGRUのコードと数式の関係を見てくると、「そうかなあー?」と感じています。実際、このブログに載せているコードを実行して時間を測定すると、

LSTM:1分09秒
GRU :1分15秒

でした。(私のPCで)



また、「詳解ディープラーニング 第2版」
(ちょっとこのブログの第一回目で紹介していないんですけど、、、、、「とりあえず」という感じで買うだけ買っていました。ちゃんと読んでもいないんですけど、、、、、ただ、こんな感じで、「どっかでフレームワークを使ったコードを利用しよう」という魂胆だったんです。)

これから、TensorFlow を使った「sin波の学習コード」を実行したところそれぞれ

「05_sin_lstm_tf__EarlyStopping.py」:4分01秒
「11_sin_gru_tf__EarlyStopping.py」  :5分05秒

という結果になりました。(私のPCで)

この結果からも、別に ”GRU” は ”LSTM” を ”軽くしたもの” ではなく、単に ”LSTMの兄弟” で、「得意分野が違う」というだけなのでは、、、、?
使い分けについても、単に、LSTM、GRUのどっちかが得意な分野で使えばいいわけですものね。

それに数式展開でもわかると思いますが、GRUは「ゲートが1つ少ない」ですが、代わりに、「活性化関数が入れ子構造」になっていて、「絵的にシンプル」になっていても「計算的には簡単ではない」ように見えます。
実際 ”class GRU:” のコードはLSTMよりも大きいですよね?


個人的にはGRUの方がLSTMより、コードの実行時間が長いのは納得いきますけどねーーーーー。




以上です。



コメント

このブログの人気の投稿

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

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

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