LSTMについて

Developers's blog

2019.07.25 都築 勇祐
LSTMについて

LSTM(Long Short Term Memory)は音声認識など、様々な場面で使われるモデルなのですが、意外と歴史のあるモデルでもあります。今はattention等に押されている感はありますが、通常のRNNを大きく改善したと呼ばれる、学ぶ価値のあるモデルです。ここでは、RNNとの違い、実際の仕組みを解説していきたいと思います。

1 RNN

LSTMはRNNの一種ですが、通常のRNNが情報をそのまま次に引き継ぐのに対し、LSTMでは中間層を噛ませて次に渡しています。

Alt text

従来のRNNは、一度データを通して得た情報を、次のインプットと一緒に後続に渡す仕組みでした。

Alt text

Long Short-Term Memoryより引用。

しかしこのモデルでは、長期依存性の問題があります。昔の情報を現在まで保持するのが難しいため、文章などのデータを適切に処理できないのです。関連する情報とそれが必要になる場面が離れていれば離れているほど、RNNはこれらを上手く繋げることができないのです。

Alt text

Long Short-Term Memoryより引用。

LSTMはこの問題を解決するために開発されました。

2 LSTMの仕組み

では、LSTMの具体的な仕組みについて解説していきます。以下に二種類の図がありますが、この二つの図が同じものを表していることがわかるでしょうか。これがわかれば、今回の目標は半分達成です。

Alt text

Long Short-Term Memoryより引用。

Alt text

これらの図は、1999年に開発されたバージョンで、chainerのLSTMに実装されているものです。

ではステップごとに見ていきましょう。この順番は便宜上のものであり、計算が前後しても大丈夫な部分もありますが、例えばOutput Gateに必要なインプットはForget GateとInput Gateで計算されるので、そういった部分は順番に注意する必要があります。

2-1 Forget Gate

一つ目の部品は、Forget Gateと呼ばれる、文字どおり「忘れる」ためのゲートです。これは実は1997年のオリジナルのLSTMモデルにはない部分で、インプットが大きく変わる際、一度メモリセルで記憶した内容を一気に「忘れる」ことを学習します。

一つ目の図で言うと、下図のようになります。

Alt text

Long Short-Term Memoryより引用。

二つ目の図では、

Alt text

Long Short-Term Memoryより引用。

という式によって表現されています。(とりあえずp_forの項は無視してください)

2-2 Input Gate

二つ目のステップは、その段階の新しいインプット(xt)を処理するゲートです。古いリカーリングインプット(y{t-1})と新しいインプット(xt)をそれぞれシグモイド関数とtanh関数にかけ、XORすることで、新たな候補値のベクトル(C^~t)を計算します。そして、この新たな候補値を、forget gateに古い候補値(C_{t-1})をかけたものに足します。

一つ目の図で言うと、

Alt text

Alt text

Long Short-Term Memoryより引用。

二つ目の図で言うと、

Alt text

Alt text

Alt text

になります。

少しややこしくなりますが、最後の式を見ると、インプットを処理して得たCに、古いCの中でforget gateが残すべきと判断したものを足し合わせる、という仕組みになっていることがわかります。

2-3 Output Gate

最後のデートは、出力を処理するためのゲートです。他のゲートと同様にインプットをシグモイド処理した後で、セル状態(C_t)をtanh関数で処理したものと掛け合わせる構造になっています。

一つ目の図でいうと、

Alt text

Long Short-Term Memoryより引用。

二つ目の図で言うと、

Alt text

Alt text

になります。

LSTMは、主にこの3種類のゲートで成り立っています。一つ一つのゲートにおける仕組みは、図や式で表現されている通りですが、今一度まとめると、

LSTMの特徴は

・y_{t-1}という古いアウトプットを次の段階でインプットとして使用する、というRNNの構造を保ちつつ

・C_{t-1}という長期記憶を少しずつ変えていく

という2点で、それを

・Forget Gate(古いC_{t-1}のうちどの部分を忘れるか)

・Input Gate(新しいインプットと一つ前のアウトプットを組み込む)

・Output Gate(更新された長期記憶を再度処理してアウトプットを作る)

の3つのゲートで管理しています。

ここで疑問となるのが、

なんで入力と出力にややこしいゲートがあるの?

という点です。必要以上にややこしいというのは、その通りです。しかし、これには理由があります。

2-4 入力ゲートと出力ゲートの意味

実は、このややこしいゲートは重みを上手く調節するために存在しています。一般的なRNNでは、ユニットiからの出力が重みw_{ij}をつけてユニットjに入力されます。しかし、時系列データを使うと従来の方法ではこの重みが相反する2つの作用によって上手く更新されない、そのような事態が起きていました。具体的には

・ユニットを活性化されることによる入力/出力信号の伝達

・ユニットからの無関係な入力/出力によってユニットが消去されることを防ぐを入力/出力信号の保護

の二つの更新が同時に行われる場合があるのです。これを防ぐために、一見ややこしく不必要な入力ゲート・出力ゲートがLSTMに付けられているのです。

2-5 様々なLSTM

LSTMにも様々なバージョンがあり、実際には仕様によって少しづつ違います。その中でも比較的重要なものを一つご紹介したいと思います。

上でも記したように、LSTMは「忘却する・入力する・出力する」という3つのゲートで成り立っています。しかし、制御対象であるメモリセルの内部状態(C_t)それ自体は制御に使用されていませんでした。そこで、peephole connectionと呼ばれる接続を各ゲートに流し込むことで解決を図りました。

Alt text

上の図の青い線がpeephole connectionにあたります。ご覧の通り、各ゲートに青い線でメモリセルの内部状態(C_t)が流れ込んでいるのがわかると思います。上の式で説明されていなかった項の正体は実はこのpeephole connectionです。

(もっと知りたい人向け)

・LSTMのBack Propagation (逆伝播)

・Gradient Clipping

・Constant Error Carousel (CEC)

参考文献:

LSTMネットワークの概要

わかるLSTM ~ 最近の動向と共に

Long Short-Term Memory

お問い合わせはこちらから