新しい図1.JPGを拝見しました。隠れ層は典型的なLSTMにきちんとなっているように思います。
※配置方法が、小林さんのYouTube動画の通りに見えますが、参考にされていますか?
入力層にReshapeがありますが、これはInputが480×11の2次元になっていれば不要ではないでしょうか。
Reshapeが必要なのは入力データが1項目しかなく480の1次元の場合で、Reshapeで480×1に変換します。
問題は、RecurrentOutputの直後にあるAffineです。
ここにこの形のAffineを置く例が、Qiitaの記事や一部の参考書に散見されるのですが、これは問題だと思っています。
この形だと全体としてRNNとは言えない、と考えますので、説明します。
まず、RNNとは何かで意見が分かれると面倒なので、小林さんの以下のYouTube動画の1:40あたりにある「Recurrent Neural Networksによる時系列データの認識」という図にあるもののことだ、としてください。
「S」「O」「N」の次の文字は「T」ではなく「Y」であることを認識する例です。
この図では、入力層も、隠れ層も、出力層もそれぞれ4つあります。
4つの隠れ層は同一の重み、4つの出力層も同一の重みを持ち、隠れ層が時系列順に結線されています。
これがRNNの基本構造です。
この図は4時刻ですが、480時刻あるととても大変でし、さらにLSTMを使うと隠れ層が複雑になりますが、基本構造はこの形です。
そして、この基本構造のままだと学習が面倒なので、NNCはRecurrentInput/Outputという部品を提供していて、入力データや正解データを配列で渡して、隠れ層と出力層を1つだけにして、4時刻分とか480時刻分とかをまとめて学習できるようにしています。
次に同じ動画の3:25あたりで解説されていますが、時系列データを入力して一つの答えを出力するMany to One、時系列データを入力して同じ長さの時系列データを出力するMany to Many(1)などのバリエーションがあります。
さて、モブさんの場合ですが、出力層のSoftmaxで3項目にしているので、Many to Oneの形ですね。
小林さんの別の動画(以下)の1:15あたりで説明されているのがMany to One型のRNNです。
この動画では小さくて見にくいと思いますが、右側の学習用ネットワークではRecurrentOutputの次にSliceを入れ、最後の時刻のものだけを取り出して、出力層に入れています。
モブさんの図1.JPGはSliceが無くていきなりAffineに100×480を入れていますが、この形だと左側の基本形ネットワークと同じ構造にならず、480日分の隠れ層のすべてのデータを出力層に入れていることになります。
動画の左側の基本形ネットワークで言えば、中ほどにたくさん並んでいるTanhすべてから、下のAffineに結線がある形になります。
なので、これではRNNにする意味が無いと思います(なぜかは後述)。
本来のRNNの形にするためには、RecurrentOutputとAffineの間にSliceを入れて、Start=0, 479、Stop=100, 480、Step=1, 1とすればいいだろうと思います(プロパティの設定は間違っているかもしれないのでレイヤーリファレンスで確認してください)。
ちなみに、正解ラベルを毎日提供できる場合は、Many to Many(1)の形のRNNが作れます。
上記の「S」「O」「N」「Y」の形のネットワークになります。
この場合でも、RuccurentOutputの後にAffine(Outshape=480, 3)を接続すると、RNNではなくなってしまいます。
上記の「S」「O」「N」「Y」ネットワークで言えば、出力層が4つではなくて、1つになってしまい、4つのTanhと全結合している形です。
これだと、「S」「O」「N」「?」という4データを入力して、「SONY」という1データを出力するネットワークです。
Many to One、Many to Manyのどちらの場合でも、RecurrentOutputにAffineを直接接続すると、その出力層は480日分の全データを参照することになるので、隠れ層でわざわざ時系列順にデータを後ろに回して記憶している意味がありません。つまりRNNを使う意味が無い、ということです。
最後に全時刻分を使えるのであれば、LSTMで頑張って忘れたり記憶したりスイッチしている意味がありません。
Many to Manyの場合は、同じ重みの出力層が480個ある形にする必要があるので、出力層全体(Affine、BatchNormalization、Softmax)をRecurrentOutputの前に置くことになります。
この時、AffineのOutShapeは3です。Recurrentの中にあるのでこれで×480,3になります。
RecurrentOutputの出力は480×3になるので、これをCategoricalCrossEntropyで480x3の正解ラベルと比較することになります。
Qiitaの記事や一部の参考書で、(レイヤーリファレンスでは「使うな」と言っている)LSTM部品を使って、その直後にAffineを接続している例が散見されますが、LSTM部品は内部にRecurenntOutputを持っているので上記の問題(RNNとは言えない!)が生じていると考えます。
2021年7月16日金曜日 22:00:23 UTC+9 モグ:
yoshida.hi... 様
ご丁重なるご回答ありがとうございます。
詳しいご解説もいただき素人ながらも理解もできたような気がします。
試行錯誤と構造自動探索の末、このようにもなってもしまいましたが、改めて原点に戻り作成もしてみました。
お手数をお掛けし申し訳ございませんが再度お目通しもいただければ有難いです。
正解ラベルは480日×11項目を1データとしてのものともなってもいますしSliceについては削除も致しました。
Q2については一般的にはYesとこと。
480日間と50次元との兼ね合いで調整もしてみることにします。