2016年1月3日日曜日

再帰型ニューラルネットの一種、LSTMをsynaptic.jsで試す

再帰型ニューラルネット

再帰型ニューラルネットは回帰(型)ニューラルネット、あるいは循環ニューラルネットと訳されることもあるがどちらも同じもの1。再帰型ニューラルネットワークとは、内部に閉路をもつニューラルネットの総称2

1岡谷 2015 p.112
2岡谷 2015 p.114

synaptic.js

synaptic.jsはアーキテクチャによらないJavaScriptのnode.jsおよびブラウザ向けのライブラリ。
今回はDemoとして公開されている下記Discrete Sequence Recallを試す。

Discrete Sequence Recall (処理に時間が掛かるためPCブラウザでの閲覧を推奨)

このデモでは入力として色で分けられた●からなるSequenceを受け取り、灰色、黒色●(いずれもPromptsクラス)を受け取った時に水色と緑色(Targets)を、Sequence内の順番通りに出力する。Sequenceの中には、Targets、Promptsいずれにも含まれないDistractors()が含まれる。このネットワークはどれがTargetsか、Promptsか、Distractorsかを事前に知らない。

var LSTM = new Architect.LSTM(6,7,2);
LSTM.trainer.DSR({  
    targets: [2,4],  
    distractors: [3,5],  
    prompts: [0,1], 
    length: 10 
});

Architest.LSTM

ソースコード
Synaptic.jsが提供するLayerオブジェクトを活用し、ネットワークの構築が下記の様に行われる。peepholesが何を意味しているのかは不明。
architest.js 90行目-159行目
architest.js 165行目-173行目
165行目以降で新たに作成するTrainerオブジェクトのプロパティ値を用意する。new Trainer()の第一引数として指定された値は、Trainerのnetworkプロパティとなる。

Trainer.DSR

ソースコード
iterationの値(規定値:100000)の数だけ、シーケンスの作成、訓練を行う。

"TRY ANOTHER SEQUENCE"ボタンをクリックした時の挙動

ソースコード

validate関数が呼び出される。その後一連の手続きを経て(next関数に入る)新たなinput配列が生成され、それを引数として LSTM.activateが呼び出される。LSTM.activateはpredictionを返却し、このpredictionを引数としvalue関数を呼び出すと、その戻り値としてLSTMの出力が何番目のTargetsに当たるのかが得られる(Targetの出力がない場合はvalue関数の戻り値が"none"となる)。
next関数はinput, output行を出力する度に呼び出される。そのためnext関数内で実行されるLSTM.activateもその分だけ呼び出しを受ける。

参考書籍

  • 岡谷貴之(2015)『深層学習 』(機械学習プロフェッショナルシリーズ)講談社