"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

シンプルRNNの「elman_net」のサンプルを体験する/Neural Network Console

f:id:arakan_no_boku:20190326212937j:plain

目次

2017/12/01追記

>以降の説明の画面は、Version1.00のものです。

>Version1.10で一部のアイコンのデザインが変更になっています。

>しかし、見てわかる程度と判断して、特に張替えてません。

RNN(Recurrent Neural Network)

CNNなどは、「今、現在」の状態だけを扱います。

ですが、例えば、年間の温度変化や降雨量のデータとか、月ごとの売上データとかのように時系列の要素がないと扱えないものもあります。 

そんな用途に使えるモデルがRNN(Recurrent Neural Network)です。  

RNN(Recurrent Neural Network)には大きな種類として3つあります。

  • elman_net
  • LSTM(long_short_term_memory)
  • GRU(gated_recurrent_unit)

簡単に違いを整理しておきますが、ほんとざっくり書いてます。

 

elman_net

一番、シンプルなRNNが「elman_net」です。 

SimpleRNNの代表的なものでもあります。 

時系列データを学習できます。

しかし、時系列が長くなると勾配消失(これ以上学習できない状態になってしまう)になるので、長期間にわたる時系列データを扱うには不適切です。 

 

LSTM

RNNに「ゲート」という機能を導入することで、長期間の時系列データにも対応できるようにしたのが、LSTMです。

LSTMは長期の時系列にも短期の時系列にも対応できます。

なので。

RNNといえばLSTMという位、実際にはよく使われています。

ただ、パラメータの数が多くて使うのが若干難しいという面と、学習に時間がかかるという問題があります。 

 

GRU

LSTMと同じ様に長期と短期の時系列の両方が扱えます。

LSTMと同じように「ゲート」の機能を持ちます。

ただ、LSTMが2つのラインを使うところをGRUは1つであるなど、シンプルにすることで、LSTMよりパラメータも少なく、学習時間を短くできるように工夫されてます。 

これだけ書くと、GRUが最強!・・に見えるのですが、実際のところは、何をするかによってLSTMが勝る場合と、GRUが勝る場合があって、一概に決められないそうですし、研究などの高度な学習には、LSTMかその亜種が使われる方多いみたいです。

ただ、データセットのサイズが小さい場合で繰り返し試行錯誤が必要なケースだと、学習速度が速いGRUが有利ということではあります。

 

Neural Network Console付属のRNNサンプル

ニューラルネットワークコンソールに、RNNのサンプルはたくさん用意されてます。 

RNN(Recurrent Neural Network)のサンプルプロジェクトとして、用意されているものを下に列挙します。

  • bidirectional_elman_net.sdcproj
  • elman_net.sdcproj
  • elman_net_with_attention.sdcproj
  • gated_recurrent_unit(GRU).sdcproj
  • long_short_term_memory(LSTM).sdcproj
  • LSTM_auto_encoder.sdcproj
  • stacked_GRU.sdcproj

 

elman_netのサンプルを動かす

とりあえず、ニューラルネットワークコンソールでサンプルを動かしてみます。 

といっても、LSTNやGRUのサンプルはかなり複雑です。 

なので、比較的短い時間で学習と評価の結果が確認できる「elman_net」を動かしてみ

ニューラルネットワークコンソールを立ち上げます。 

プロジェクト一覧から、「elman_net.sdcproj」を探して開きます。

f:id:arakan_no_boku:20170924221436j:plain

 

赤枠の部分が、特徴的です。 

 

SimpleRNNの構造

RecurrentInputからReccurentOutputの間を時系列データの時間軸で繰り返します。 

SimpleRNNの構造は、入力があって、真ん中に状態を表す隠れ層があって、そこに前回の状態が接合(concatenate)されて新しい状態を更新することで時系列を扱い、時系列の最後までいったら最新の状態から出力する・・っていう、シンプルな構造になってます。

f:id:arakan_no_boku:20170924225055j:plain

 

それがまんま、レイヤーで表現されている感じです。 

イメージ図には、遅延(Delay)がでてきませんが、ここで一定時間保持することで、過去(前回)の状態の結合を実現するために必要な仕組みとでも理解してもらえればと思います。

 

学習の実行

学習してみます。 

とりあえず、今回はサンプルを何も変更せずに、そのまま動かしてみます。

f:id:arakan_no_boku:20170923104852j:plain

このサンプルの入力データは、MNIST(手書き数字の画像)データです。 

画像データを時系列データとみなして、動かすってことですかね。 

学習結果はこんな感じです。

f:id:arakan_no_boku:20170924225814j:plain

 

評価の実行

評価してみます。

f:id:arakan_no_boku:20170923104852j:plain

 

結果はこうです。

f:id:arakan_no_boku:20170924230012j:plain

うーん。 

正直、この結果を見て、RNNならではのトピックは感じませんねえ。 

CNNと何が違うの?・・って感じです。

内部的には全然違う・・と言われても、ピンときません。

なんか、今回はグダグダな終わり方です。

すいません。

 

2017/12/01追記

Version1.10では、このあたりのアイコンのデザインが変更になってます。 

f:id:arakan_no_boku:20171130202351j:plain