AI

LSTMとGRU|長期記憶を扱う仕組み

AI

RNNには遠い過去の情報が届かないという弱点が残っていました。それを構造の改良で乗り越えたのがLSTMとGRUです。CECと3つのゲート、そして簡略化の流れを整理します。

こんにちは、zawato(@zawato7)です!

本記事はディープラーニング入門ロードマップの第21回です。RNNは時間をさかのぼるほど勾配消失が起き、長い履歴を学習できません。その解決策を見ていきます。

この記事でわかること
  • CEC(メモリセル)が勾配消失を防ぐ理由
  • 忘却ゲート・入力ゲート・出力ゲートの役割
  • GRUによる簡略化と、双方向RNN・多層化の考え方

 

 

LSTMはCECで誤差を保ったまま運ぶ

LSTMは、重みの掛け算を通らない情報の通り道であるCECを持つことで、遠い過去まで誤差を届けます。LSTMはLong Short-Term Memoryの略です。構造図は複雑に見えますが、骨格はシンプルRNNと同じで、過去からの情報と今の入力に全結合をかけて足し、活性化関数に通します。

そこに追加されたのがCEC(メモリセル)です。時刻をまたいで情報を保持する専用の経路で、重みの掛け算が発生しません。勾配消失は同じ重みを何度も掛け合わせることで起きるため、掛け算を通らない道があれば誤差はそのまま伝わります。層を飛び越えて誤差を通すスキップコネクションと同じ発想を、時間方向に持ち込んだものです。

 

 

3つのゲートがCECへの出入りを調整する

LSTMは忘却ゲート・入力ゲート・出力ゲートの3つで、CECに何を入れ、何を残し、何を出すかを制御します。どのゲートも計算の形は同じで、今の入力と過去からの情報を全結合して足し、シグモイド関数に通します。出力は0から1の値になり、それを掛けることで情報を通す割合が決まります。

ゲート制御する対象0のとき
忘却ゲートCEC内の過去の情報をどれだけ残すか過去を全部忘れる
入力ゲート今の入力をどれだけCECに入れるか今回の入力を無視する
出力ゲートCECの内容をどれだけ出力するか外へ出さない

この割合は学習で決まります。どの情報を捨ててどれを覚え続けるかをデータから獲得できるため、長い時系列でも必要な記憶だけを残せます。

 

 

GRUはCECをなくしてゲートを2つに減らした

GRUはLSTMの後に登場した簡略版で、CECを持たずリセットゲートと更新ゲートの2つだけで動きます。GRUはGated Recurrent Unitの略です。リセットゲートは過去の情報をどれだけ捨てて計算するかを決め、更新ゲートは過去の状態と新しい候補をどの割合で混ぜるかを決めます。忘却ゲートと入力ゲートの役割を、更新ゲート1つにまとめたイメージです。

部品が減るぶんパラメータが減り、計算も軽くなります。シンプルRNN・LSTM・GRUの3つは、ゲートの数とCECの有無で区別できるようにしておきましょう。

 

 

双方向RNNと多層化で表現力を広げる

双方向RNNは過去から未来へ進む向きと未来から過去へさかのぼる向きを並べ、両方の出力を結合します。各時刻の出力を使いたい場面では、その時点より後ろの情報も分かっていたほうが判断しやすくなります。前後どちらの文脈も踏まえた出力が各時刻で得られるのが利点です。

もう1つの拡張が多層化です。RNNの層を積み重ね、最終層の出力を全結合につないで回帰や分類を行うのが標準的な構成です。ただし層を深くしすぎると学習がうまく進まないため、過学習対策と同様に層数の調整が必要です。

 

 

まとめ

  • LSTMはCEC(メモリセル)を持ち、掛け算を通さない経路で誤差を運ぶため勾配消失が起きにくい
  • 忘却ゲート・入力ゲート・出力ゲートの3つが、0〜1の値でCECへの情報の出入りを制御する
  • GRUはCECをなくし、リセットゲートと更新ゲートの2つに簡略化した効率重視のモデル
  • 双方向RNNは順方向と逆方向を組み合わせて各時刻の出力を得る。RNNは多層化もできる

 

 

よくある質問

Q. LSTMとGRUの違いを一言で言うと何ですか?
A. LSTMはCECと3つのゲートを持ち、GRUはCECを持たずゲートが2つです。GRUのほうが構造が簡単でパラメータも少なくなります。

Q. CECはなぜ勾配消失を防げるのですか?
A. 勾配消失は重みの掛け算が繰り返されて値が小さくなる現象です。CECは掛け算を挟まずに情報を次の時刻へ渡す経路なので、遠い過去まで誤差が届きます。

Q. ゲートの開き具合は誰が決めるのですか?
A. 学習で決まります。中身は全結合とシグモイド関数なので、重みの更新につれて「どれだけ通すか」がデータから獲得されます。

Q. 双方向RNNが使えない場面はありますか?
A. 未来の情報を先に読む構造なので、系列全体がそろってから処理する用途に限られます。1時刻ずつデータが届く途中で予測を出す場面には向きません。

 

 

コメント