LSTM#
RNNは長期の時間依存に対して勾配消失問題を起こしやすい。つまり、古い情報を忘れてしまうという問題がある。例えば長い文章の系列を入れたときに、主語が忘れられてしまうような現象が起こってしまう。
何も工夫しなければせいぜい過去10時刻分程度しか保持されないという研究もある(Graves, 2013)。
そこで考案されたのがLSTMである(Hochreiter & Schmidhuber, 1997)。 LSTMはRNNに、活性化関数を通さずに過去の情報を運ぶ変数\(c\)を追加したような構成になっている。
LSTMの特徴は3つのゲートをもつこと。すべてのゲートはロジスティック・シグモイド関数で活性化されるため、\([0, 1]\)の値を出力する。0のときはゲートが閉じており、1のときはゲートが開いている、と解釈すると理解しやすい。
シグモイド関数を並べてベクトルを返す関数\(\newcommand{\b}[1]{\boldsymbol{#1}} \b{F}_\sigma\)を用いて、それぞれ、次のようになる
忘却ゲート(forget gate)\(\b{f}_t = \b{F}_\sigma ( W_{xf} \b{x}_t + W_{zf} \b{h}_{t-1} )\)
入力ゲート(input gate)\(\b{i}_t = \b{F}_\sigma ( W_{xi} \b{x}_t + W_{zi} \b{h}_{t-1} )\)
出力ゲート(output gate)\(\b{o}_t = \b{F}_\sigma ( W_{xo} \b{x}_t + W_{zo} \b{h}_{t-1} )\)
tanhを並べてベクトルを返す関数\(\b{tanh}(\cdot)\)を用いて活性化されるベクトル\(\b{g}\)
を用いて、忘却ゲートを通って次の時点の隠れ層に渡される長期記憶\(\b{c}_t\)は以下で与えられる
ここで\(\odot\)は要素ごとの積を表す。この式から、忘却ゲートの調整が効きすぎない限りは長期記憶が残り続ける構造になっていることがわかる。