Recurrent Neural Network
概要
Recurrent Neural Network (RNN; 再帰型ニューラルネットワーク) は時系列の情報パターンを認識するように設計されたニューラルネットワーク。自然言語処理、遺伝子、センサーデータ、株式など、データのシーケンスを節に分解して時系列として扱うことができるデータを対象としている。このような時系列データの事前学習により、あるシーケンスパターンの続きにどのようなデータが出現するかを予測する。
RNN は学習期間が長くなると過去の入力の影響が低下する (古い情報を忘れる)。この問題を解決するために重要な情報を選択的に長期間記憶するよう改良したアルゴリズムが LSTM である。
RNN の構造
DNN は入力層、隠れ層、出力層で構成されていたが
RNN ではある時点
ここで隠れ層
ある時点
ある時点の状態は遅延フィードバックが進むにつれ何度も
プログラミング
以下 deeplearning4j を対象とする。
入出力データの構造
Feedforward Neural Network での入出力が「バッチサイズ × ベクトル幅」の 2 次元行列だったのに対して RNN (LSTM) は時系列を追加した 3 三次元の形となる。バッチサイズはベクトル処理効率のためにまとめて処理する単位、サンプル数はバッチサイズに基づいてグループ化した 1 処理単位 (DataSet) でのデータ数とする。
ある時点
時系列に並んだベクトル値から deeplearning4j の入力/出力に利用できる形に変換する必要がある (DL4j では出力をラベルと呼んでいる)。
最も簡単な方法はバッチサイズ 1 で一つの DataSet にすべての学習データを詰め込むことだ。単に RNN/LSTM の挙動を見たいだけであればこれで十分だろう。net.fit(dataSet) をepoch 回数繰り返して学習を行う。
計算速度を高めたり、学習データがメモリに乗り切らないほどの量であれば、バッチサイズ × example length ごとに DataSet を分割する DataSetIterator を実装する。この場合、端数部分の DataSet の扱いに注意しなければならない。
DataSet はデータが時系列順に並んで入出力ペアの整合性がとれていれば学習データのどこから始まっていても構わない (たぶんその調整は精度や収束速度に影響するだろう)。例えば上記の図で DataSet 2 を
deeplearning4j の入力/出力は [サンプル数(ミニバッチサイズ), 入力ベクトル, DataSet は