投稿

2月, 2023の投稿を表示しています

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

ディープラーニングのお勉強体験記”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項多いので、 と計算されます。 「ar」の項がおまけで付いてますね。 これらの式を見ればわかりますが、 が共通しています。 ほぼほぼRNNの時と同じ感じで、WxとWhに共通したdL/da・da/duを導ければ誤差逆伝搬が計算できるということになります。そしてこのdL/da・da/duはL...

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

イメージ
「ゼロから作るDeep Learning 2 ―自然言語処理編」のRNNコード、P216、第5章「5.5.3 RNNLMの学習コード」をGRUコードに変更する。  ” 「ゼロから作るDeep Learning 2 ―自然言語処理編」のRNNコードを全体が見えるようにする ” で作ったコードを、LSTM同様、まんまGRUに変更します。 実際のコードがこちら。 # ゼロから作る Deep Learning2のP216、第5章「5.5.3 RNNLMの学習コード」でコード全体が見えるようにできるだけ「import」を外したコード これをGRU用に変更 # coding: utf-8 import sys sys.path.append('C:\\kojin\\資料\\AI関連\\ゼロから作る Deep Learning\\ゼロから作る Deep Learning2\\deep-learning-from-scratch-2-master\\') 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_rnnlm import SimpleRnnlm # ハイパーパラメータの設定 batch_size = 10 wordvec_size = 100 hidden_size = 100 time_size = 5 # Truncated BPTTの展開する時間サイズ lr = 0.2 max_epoch = 100 # 学習データの読み込み(データセットを小さくする) corpus, word_to_id, id_to_word = ptb.load_data('train') corpus_size = 1000 corpus = corpus[:corpus_size] vocab_size = int(max(corpus) + 1) xs = corpus[:-1] ...

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

イメージ
「ゼロから作るDeep Learning 2 ―自然言語処理編」のRNNコード、P216、第5章「5.5.3 RNNLMの学習コード」を使って作ったLSTMの「2進数足し算の学習コード」を2層化する。 RNNのところで、P216、第5章「5.5.3 RNNLMの学習コード」に手を加えて、それを 「2進数足し算の学習コード」 にしましたが、前回それを LSTMコード に作り替えました。そして今回はさらにそのコードを2層化します。 それがこれ! P216、第5章「5.5.3 RNNLMの学習コード」を使ったLSTMの「2進数足し算の学習コード」を中間層を2層化したコード # ゼロから作る Deep Learning2のP216、第5章「5.5.3 RNNLMの学習コード」でコード全体が見えるようにできるだけ「import」を外した # 2進数の計算をするLSTMコード (入力データ、テストデータ共にコードでクラスから作成している) # 中間層を1層追加して中間層を2層としたコード # coding: utf-8 # import sys # sys.path.append('C:\\kojin\\資料\\AI関連\\ゼロから作る Deep Learning\\ゼロから作る Deep Learning2\\deep-learning-from-scratch-2-master\\') 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_rnnlm import SimpleRnnlm # np.random.seed(seed=100) # 発生する乱数を固定する() # ハイパーパラメータの設定 batch_size = 8 time_size = 10 # Truncated BPTTの展開する時間サイズ n_in = 2 #...

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

イメージ
「ゼロから作るDeep Learning 2 ―自然言語処理編」のRNNコード、P216、第5章「5.5.3 RNNLMの学習コード」を使って作った「2進数足し算の学習コード」をLSTMにする。 RNNのところで、P216、第5章「5.5.3 RNNLMの学習コード」に手を加えて、それを 「2進数足し算の学習コード」 にしましたが、それをLSTMコードに作り替えました。 それがこれ! P216、第5章「5.5.3 RNNLMの学習コード」を使った「2進数足し算の学習コード」をLSTMに作り変えたコード # ゼロから作る Deep Learning2のP216、第5章「5.5.3 RNNLMの学習コード」でコード全体が見えるようにできるだけ「import」を外した # 2進数の計算をするLSTMコード (入力データ、テストデータ共にコードでクラスから作成している) # coding: utf-8 # import sys # sys.path.append('C:\\kojin\\資料\\AI関連\\ゼロから作る Deep Learning\\ゼロから作る Deep Learning2\\deep-learning-from-scratch-2-master\\') 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_rnnlm import SimpleRnnlm # np.random.seed(seed=100) # 発生する乱数を固定する() # ハイパーパラメータの設定 batch_size = 10 time_size = 10 # Truncated BPTTの展開する時間サイズ n_in = 2 # 入力層のニューロン数 n_mid = 32 # 中間層のニューロン数 n_out = 1 # 出力層のニュ...

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

イメージ
「ゼロから作るDeep Learning 2 ―自然言語処理編」のRNNコード、P216、第5章「5.5.3 RNNLMの学習コード」を使って作ったSIN波の学習コードをLSTMにする。 RNNのところで、P216、第5章「5.5.3 RNNLMの学習コード」に手を加えて、それを「SIN波の学習コード」にしましたが、それをLSTMコードに作り替えました。 それがこれ P216、第5章「5.5.3 RNNLMの学習コード」を使ったSIN波の学習コードのLSTMに作り変えたコード # ゼロから作る 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\\') 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_rnnlm import SimpleRnnlm np.random.seed(seed=773) # 発生する乱数を固定する(773 326 512 138) # ハイパーパラメータの設定 batch_size = 10 time_size = 10 # Truncated BPTTの展開する時間サイズ n_in = 1 # 入力層のニューロン数 n_mid = 45 # 中間層のニューロン数 n_out = 1 # 出力層のニューロン数 # できるだけオリジナルのコードに変更を加えない...

このブログの人気の投稿

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

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

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