Python Colaboratory Ⅳ
LSTM(Long Short Term Memory)概要
ここまで、RNN で時系列デ-タを予測することについて勉強してきました。
理論上、RNN は「長期の依存性」を取り扱うことが十分できるとされてきました。
しかし、実際には、RNN はそれを学習できるようにはならないようです。
この問題は Hochreiter (1991)[ドイツ語]と Bengio,et al.(1994)により徹底的に調査され、
それが難しいいくつかのかなり基本的な理由が見つかりました。
そこで、考案された方法が LSTM です。
詳細については
LSTMネットワークの概要
で詳しく述べられています。
どうもすべてを理解できずとも LSTM は利用できるようなので、私のわかる範囲を説明します。
LSTM は鎖のような構造を持ちますが、繰り返しモジュールは異なる構造に変化します。
非常に特別な方法で相互作用します。
出力状態として2つの状態を出力し、これが次の入力になります。
セル状態 Ct-1 Ct Ct+1
出力 ht-1 ht ht+1
ここに新たな入力が加わることになります。
入力 Xt-1 Xt Xt+1
図にすると下記のようになります。
LSTM を実現するためのアイデア
LSTM の鍵はセル状態Ct-1 Ct Ct+1 図の上部を通る水平線です。
セル状態は一種のコンベア・ベルトのようなものです。
それはいくつかのマイナーな線形相互作用のみを伴い、鎖全体をまっすぐに走ります。
必要に応じて忘却され、そして活性化された Xt は加算されますが、全体として活性化はされず情報は不変です。
LSTM はセル状態に対し情報を削除したり追加する機能を持っています。
この操作はゲートと呼ばれる構造により制御されます。
上図の×印が書かれた場所がゲ-トです。
ゲートは選択的に情報を通します。
これはシグモイド・ニューラルネット層と一点の乗算により構成されます。
σ はシグモイド関数です。
シグモイド曲線は下記のようになっています。
通常、時系列デ-タは
標準化(-1~+1)、ないしは正規化(0~+1)
されています。
入力デ-タ ht-1 ~ Xt をシグモンド関数に入れると 0~ 1となります。
この σ は、忘却ゲート、入力ゲ-ト、出力ゲ-トにも適用されます。
忘却ゲート
忘却ゲートはシグモイドによって開閉されます。
半開き状態(例 0.5)もあり得ます。
それは、ht−1 と Xt を見て、セル状態 Ct−1 の中の各数値のために 0~1 の間の数値を出力します。
1 は「完全に維持する」を表し、0 は「完全に取り除く」を表します。
言い換えると
入力デ-タ ht-1 ~ Xt をシグモイド関数に入れると 0~ 1となり
0(完全閉塞) ~ +1(全開放)
にすることができます。
すなわちシグモイド値 σ を、セル状態 Ct-1 に乗算するとCt-1 の値を適宜制御することができます。
入力ゲート
入力デ-タ ht-1 ~ Xt を活性化関数 tanh に入れます。
これを入力ゲートで開閉します。
その方法は忘却ゲートと同じでシグモイドによって行なわれます。
その開閉結果は忘却ゲートを通過した Ct-1 に加算されます。
加算された結果は Ct となります。
出力ゲート
加算結果は Ct を活性化関数 tanh に入れます。
これを出力ゲートで開閉します。
その方法は忘却ゲートと同じでシグモイドによって行なわれます。
その開閉結果は ht となります。
結果
上記の動作を繰り返した結果得られた ht が予測値です。
ただ、学習中は予測値が既知です、これに合うように重みを計算しながら動作が進みますので、
その計算量は多大です。
ここまで説明してきたのは、かなりノーマルな LSTM です。
Keras でもモジュ-ル化されています。
ですから、自分でファイルを構築する作業は大幅に簡略化することができます。
LSTM はさらにいろいろ改善の試みがされています。
一般的な LSTM のバリエーションの一つは「のぞき穴の結合」です。
これは、各3つのゲート層にセル状態 Ct-1 を見させています。
アルゴリズムとしてはかなり複雑です。
のぞき穴結合 は Keras では LSTMCell でサポ-トされています。
また、GRU なる方式も考えられています。
高速化が計られています。
これも Keras でサポ-トされています。
詳しくは
Keras Documentation LSTM
を参照してください。
引き続き、LSTM を Keras で実現していきます。