時系列データを学習するニューラルネットワーク「RNN」が使えるようになりました(NNPropagator)

「NNPropagator」誠意開発中!

前回,ニューラルネットワークのライブラリを独自に開発を進めていくということをお知らせいたしましたが,今回も開発状況をお知らせ致します.

この「NNPropagator」では,簡単にニューラルネットワークの構造を定義し学習ができる,シンプルなライブラリである,と前回書きました.これは,ニューラルネットワークが層構造をなしているという点から,「層」を「結合」させるという簡単なコードを書くことでニューラルネットワークを定義する事ができる,というものです.これは,TensorflowやChainerなどの機械学習ライブラリと同様な仕組みとなっています.

この層構造を基本に置くことの利点のうちの1つは,新たな仕組みを比較的容易にライブラリに追加することができるということにあると考えることもできます.では,前回から追加された機能の1つを説明してきます.

今回の主題は,「未来方向ディレイコネクタ」です.

ディレイコネクタ

前回までのニューラルネットワークでは,可変長の時系列データを扱うことはできませんでした.データ系列に時系列データを用いると,異なる時刻間で情報に相関が存在する場合,相関がないとして独立したデータとしてニューラルネットワークに学習させる方法や,固定時刻でニューラルネットワークの入力次元=時間幅として学習させる方法など,制限のあるやりかたで時系列データを処理することはできますが,本来可変であるはずの時系列データを扱うのには,少し不便と言わざるを得ません.

そこで登場するのが再帰結合型ニューラルネットワーク「RNN」です.このネットワークは,一部の層間結合に「遅れ(delay)」を導入することで,ネットワークを拡張します.具体的には,次のようになります.前回のニューラルネットワークの構造に比べると,新しいものは三角マークの結合ですね.+マークは,ただ結合を加算合流させるためのものです.

DelayConnect N

この三角マークは遅延結合と言って,制御理論ではおなじみですが入力されたデータを単位時間保持し,その後出力する結合です.この結合によって,過去の情報を現在へ伝える事ができ,過去との層間のあるデータを扱うことができるようになります.

では実装!

とは言っても,やっぱり実際にやってみなければなんだかよくわかりませんよね.実例を以って体感してみましょう.

今回学習に挑戦するのは,簡単な遅延出力器です.ランダムなパルス幅のパルス信号を1単位時間だけ遅らせて出力することを学習させます.

パルス信号
パルス信号の例

入力データにランダムなパルス幅のパルス信号,出力データ(教師データ)に,入力データを1つだけ未来方向にずらしたものをセットし,上図のネットワークを定義しNNPropagatorで学習を実行します.
<NNPropagatorでのネットワークの定義は次のようになりました.delay=Trueでディレイコネクタであることを明示します.

<br />
NNList = [<br />
    OneConnection(1,3,connect = [&quot;plus0&quot;],name=&quot;W&quot;),<br />
    PlusConnection(connect = [&quot;V&quot;,&quot;U&quot;],name=&quot;plus0&quot;),<br />
    OneConnection(3,3,connect = [&quot;plus0&quot;],name=&quot;U&quot;,delay=True),<br />
    OneConnection(3,1,name=&quot;V&quot;)]<br />

実行結果

学習した結果は,次のようになりました.青が入力データで,緑がニューラルネットワークが出した出力データです.

RNN D0 RESULT

見事に1単位時間だけ位相をずらすニューラルネットワークが学習できましたね!これでおしまいです.

余談

上のように定義したRNNでは,勾配消失/勾配爆発問題が発生すると説明されることが多いです.実際,学習係数を順伝播NNと同じにしてやってみると数値が発散してしまうことが確認できました.これを解決する方法がたくさん開発されていますが,今回は割愛します.

 

追記(2016/3/18)

かなり良い学習結果が得られたので追記

出力層の手前にSigmoid層を入れたことによりものすごい改善が起きたことをここに記す.

rnn_delay_good

Posted on