技術は記憶の彼方へと

覚えたつもりですぐに忘れるエンジニアの備忘録

深層学習にて時系列データを扱うLSTMとは

深層学習の中の分析手法の一つとしてあげられるLSTM。
RNNを拡張したこのモデルは長期依存に対応ができるそうです。
時系列データを分析する手法としてはARIMAやARMA、GARCH、移動平均法等様々な手法があるがどの手法も原理的に長期依存に対応できないものが多い。
RNNでも対応しきれなかった長期依存に対応できるようにしたLSTMモデルについて今回はまとめてみようと思います。

目次


そもそもRNNとは...


RNNを拡張してできているというならまずは、RNNについて知る必要があると思います。
RNNとは、Recurrent Neural Network の略です。
時系列を扱うことのできるニューラルネットワークで自己回帰型の構造を持ってるものの総称です。
自己回帰型の構造とは、自分自身が出した出力結果を自身の学習の餌としてもう一度食わせる...といったことを行うことです。
この自己回帰構造のおかげでこれまでの情報を保持した解析が可能になり、音声認識や文章生成等の分野でその有効性が確認されています。

ただ、動画や文章等の長い時系列データを扱う際には、ネットワークが時系列長に比例して非常に深くなってしまい情報がうまく伝達されなくなってしまう「勾配消失」と呼ばれる現象がしばしば生じてしまったり、記憶したとモノ・情報をどのようにして生かすかといった計算量が爆発してしまう「勾配爆発」といった欠点も抱えています。


LSTM


LSTMとはLong Short-Term Memoryの略です。
RNNの中間層をLSTM Blockと呼ばれるメモリユニットに置き換えたものになっており、RNNでは10数ステップ程しか対応できなかったものが1000ステップ越えでも対応できるようになっています。
では、なぜ対応することができるのでしょうか。

LSTMは

  • どの程度、前の層からの入力をユニット内に入れるのか

  • どの程度、前時刻のユニット値を現時刻に持ち越すのか

  • どの程度、現時刻のユニット値を出力として出すのか

といった調整を行うことが可能であり、全情報を次時刻に渡していたRNNと比べ、柔軟性が増したことでより長期間の情報伝達が可能になったと考えられます。

LSTMはデータを重み1でループさせ記憶し、入出力ゲートの学習によって正しい情報のみを通過させることを行い、データを「線形和」で保持する為、極端に勾配が大きくなったり小さくなったりしない為に勾配消失問題が発生しないといえます。

ただ、このままのLSTMでは長期依存に対応できても、記憶したデータを重み1でループして忘れることがない為、外れ値やノイズも取り込んでしまい、大きな状況の変化に対応することができません。
その為、オリジナルのLSTMでは状況に応じて手動で記憶をリセットする必要があり、実用的であるとはいえません。
その為、現在ではLSTMに忘却機能を付与したLSTMが提案され、LSTMと言えば忘却機能付のものであるとされています。

入出力ゲートはなぜ作られたのか

従来のRNNでは入力重み衝突出力重み衝突といった問題が内在していました。
これは、前回と同じパターンの入出力があった際にはさらにこれに適合できるように重みの比率を変えよう、前回とは異なるパターンの入出力があった際にはこのパターンに適合するべく重みの比率を変えようといったことが繰り返されてしまい、重みの値が上下してしまい精度が向上しないという問題です。
この問題に対処するべく入力ゲート・出力ゲートは作られました。
これによって、前回と同じパターンの入出力があった際には、前に来たパターンを通すように適合している為そのまま通しさらに適合するため重みの比率を変えよう、前回とは異なるパターンの入出力があった際には、ゲートは違うパターンを通すような内容になっていない為に通さないので変化がないため重みが変動しない、といった挙動を実現することができるようになります。
この、ゲートを通す・通さないという仕組みは、重みとしてほぼ0か1への活性化ができるSigmoid関数を利用することで実現されています。

忘却機能付きLSTM


先程、オリジナルのLSTMでは大きな状況の変化に対応することができず、あまり実用的ではないといいました。
そこで提案されたのがこの忘却機能を付与したLSTMであり、現在のLSTMにおける主流となっている考え方です。
この忘却機能は2000年に発表された「Learning to forget continual prediction with LSTM」という論文で提案されました。
これはオリジナルのLSTMのメモリユニット内に忘却ゲートを設けるといったものになります。
これは過去のデータを保持しているユニットの中身をどの程度残すのかを調整し、記憶を選択的にリセットすることで効率的に学習を行えるようにするものです。
これによって、RNNではすべて利用しようとして爆発してしまっていた計算も、入出力ゲートによる衝突回避や忘却機能による不要と思われる情報の破棄により、長期依存に対応しかつ大きな状況の変化にも対応ができるようになります。

忘却ゲートはなぜ用意されたのか

忘却ゲートがない機構だと大きな状況の変化に対応することができないといいました。
ではなぜ対応できないのでしょうか。

過去のデータを保持するユニット(以下CEC)では線形和で過去すべての入力を、重み1でループし続けています。
そのため、ある時に大きな変化の入力が来たとしても相対的にその入力の影響は小さくなってしまい、結果として今まで通りの出力結果しか得られなくなってしまいます。
これでは対応することはできません。

そこで、この問題に対応するべく忘却ゲートは用意されました。
Sigmoid関数による忘却ゲートを導入することで入力系列のパターンが大きく変化した際にセルの内容を一気に更新することを実現しました。
これによってCECが記憶している長期記憶をあらかじめ決めておいたどの程度残すのかといった情報をもとに忘却(削除)し新たな変化に対応するようにCECを更新することで、大きな状況の変化に対応できるようになります。

過学習の防止策


深層学習や機械学習において最大の問題は過学習によってノイズや外れ値まで再現してしまい精度がかえって悪くなってしまうといったことが問題となってくるのではないかかと思います。
LSTMにおいてもこの問題は同じで過学習は期待する結果を得られなくなってしまう要因になりえます。
過学習の防止策としてよくドロップアウトが挙げられます。
ドロップアウトとはランダムに選出したノードを存在しないものとして無視し学習を進めるといったもので一般的にニューラルネットワークにおける精度向上や汎化性能の向上(アンサンブル効果というそうです)が認められています。
LSTMにおいてもこれは同じでドロップアウトによる精度向上には期待ができますがいくつかの注意が必要です。

それは、non-recurrentな接続にのみ適用する必要があるということです。
non-recurrentな接続とは入出力ゲート等再帰的な処理を行う部分以外の部分のことを指します。
CECやゲート等の再帰的な部分にドロップアウトを設定してしまうと過去のデータをランダムに落としてしまうため、必要な情報のドロップによってうまく学習ができなくなってしまい、かえって効率が悪くなってしまう原因となるからです。

最後に


今回LSTMについてまとめてみた感想としては、正直なところ理解できているのかと言われれば難しいところがあるといった状態です。
いまだに研究が続いている分野であり、本当の意味での何が最適解なのかといった部分がわかっていないことも多いようですし...
完全な理解にはまだまだ時間がかかるというのは仕方のないこと、目の前のデータに向かい合い試行錯誤を繰り返すほかないのかな...なんて考えています。
ある程度まとめたつもりではあるので、この記事が役に立てば幸いです。