#1. LSTMとは
LSTM(Long Short Term Memory )とは、勾配消失問題が起こらない構造にしたRNNの一種である。
RNNは、多くの中間層を持つが、この層をLSTMブロックという、長期記憶と短期記憶を司るブロックに置き換えた構造を持つ。実際には、一つのメモリと、三つのゲートから成る。
勾配消失問題とは、逆伝搬するときに、出力側から入力側へ、勾配が上手く伝わらなくなること。
中間層が増えれば増えるほど微分値が増える。この際に、シグモイド関数の微分とかが入ると、微分値が0.25以下になり、連鎖律が広がるとどんどん値が小さくなっていく。
逆に、勾配爆発問題というのがある。これは逆に、勾配がどんどんどんどん大きくなってしまう状態である。例えば、恒等関数があると、発生する可能性がある。
これを防ぐには、勾配クリッピングをする。勾配のノルムが閾値を超えたら、勾配のノルムを閾値に正規化すること。
#2. LSTM全体像
#2.1. CEC
RNNの問題点:シグモイド関数の微分系が、RNNの中間層にあるため、時系列をさかのぼって微分していくと、勾配消失問題が起こる。
RNN問題点の解決策:RNNには、考える機能と記憶する機能が同じ中間層にある。このため、記憶させようと思えば思うほど学習が出来なくなっていた。そこでこの2つを分離して、過去の情報を記憶するためだけのCECというブロックを設ける。
数式的には
以下の式は、時間をさかのぼる前後の勾配の関係を示しているが、これが1よりすくなければ、勾配消失問題が起きる。1より大きければ勾配爆発問題がおきる。1なら何も起こらない。この1を実現するために導入されたものが、CECである。
\delta^{t-z-1} = \delta^{t-z} \left( W f' (u^{t-z-1} ) \right) = 1
\frac{\partial E }{\partial c^{t-1}}
=
\frac{\partial E }{\partial c^{t}} \frac{\partial c^t }{\partial c^{t-1}}
=
\frac{\partial E }{\partial c^{t}} \frac{\partial }{\partial c^{t-1}} (a^t - c^{t-1} )
=
\frac{\partial E }{\partial c^{t}}
##2.2. CECの課題
CECは覚えるだけなので、学習が出来ない。つまりこれはもはやNNではない。
このため、CEC以外に学習する機能ブロック(入力ゲート、出力ゲート、忘却ゲート)が必要である。
##2.3. 入出力ゲート
CECに何を覚えさせるかと、どのように何を使うかを決めるブロックが、入力ゲート、出力ゲートである。
入力ゲートは、時刻tでの入力値と、時刻t-1での出力値を使って、今回の入力値をCECがどう使うかを決める。
出力ゲートは、時刻tでの入力値と、時刻t-1での出力値を使って、今回のCECのデータをどう使うかを決める。
#2.4. 忘却ゲート
問題:CECはずっと情報を貯め続ける。このため、過去の不要な情報によって、判断を誤る場合が出てくる。しかし、覚えるだけなので、過去の情報が削除されない。
解決策:不要な情報を忘れる機能を入れる(忘却ゲート)。今回の入力、前回の出力から、不要な情報を決める。
※出力ゲートでも対応出来そうだが、出力ゲートは、あくまで何をどれだけ使うかだけを決める機能。不要な情報があると、使われる可能性が残る。
#2.5. 覗き穴結合
上記の入力ゲート、出力ゲート、忘却ゲートは、前回の出力と今回の入力を、CECを制御するための判断材料として使っていた。
そして、どうせならCEC自体の情報も、その判断材料の一つに加えてやろうと考える事が出来る。そして、これを実現する仕組みが覗き穴結合である。
覗き穴結合は、CEC自体に重みを掛けて、各ゲートに情報を入力する。しかし、これの効果は大したことはない。
#3. GRU
LSTMは、かなり効果があり有名になったが、その複雑な構造に基づくパラメータ数が多く、計算負荷が高かった。これを改善するのがGRU(Gated Recurrent Unit)である。GRUのほうが、LSTMより計算量が少ない。
参考