LSTM ネットワークの理解 (翻訳/要約)
* TensorFlow : コード解説 : RNN – リカレント・ニューラルネットワーク & LSTM で参照されている Understanding LSTM Networks の要約です。原文の図を参照しながらお読みください。
RNN – リカレント・ニューラルネットワーク
人間は刻々とゼロから思考を始めるわけではありません。この文書を読む時でも、前の単語の理解を元に各単語を理解しており、全てを捨ててゼロから再度考え始めるわけではありません。人間の思考には持続性があります。伝統的な NN はこれができません。大きな欠点です。例えば、映画の全てのポイントでどのような種類のイベントが起きているか分類することを望むとして、伝統的な NN が映画の前のイベントについての情報を後のイベントに伝えるための方法が判然としません。
RNN – リカレント・ニューラルネットワーク はこの問題を処理します。RNN はそれらの中にループを持つことで情報を持続することを可能にします。NN の塊 A がある入力 xt を見て値 ht を出力するとします。ループは情報がネットワークの一つのステップから次へ渡されることを可能にします。
これらのループは RNN を幾分神秘的にしていますが、普通の NN とそれほど違うわけではありません。RNN は個々が継承者にメッセージを渡す同じネットワークの複数のコピーとして考えられます。ループを展開して得られる、鎖状 (chain-like) の性質は RNN がシークエンスとリストに親密に関係することを示しています。これらはそのようなデータを使用するために自然なアーキテクチャです。
ここ2、3年で RNN を各種の問題に適用することについて大きな成功があります : 音声認識、言語モデリング、翻訳、画像キャプション …。RNN の成果についての議論は Andrej Karpathy のブログポスト – The Unreasonable Effectiveness of Recurrent Neural Networks に委ねますが、驚異的です。
これらの成功の本質は LSTM の使用にあります。これは RNN の特殊な種類ですが、多くのタスクに対して標準判よりも非常に上手く動作します。RNN 上の殆どの素晴らしい結果はこれによって達成されています。
Long-Term 依存の問題
RNN の主張の一つは、以前の情報を現在のタスクに結合できるということです。例えば、以前のビデオフレームの利用が現在のフレームの理解に情報を与えるというようにです。もし RNN がこれを行なうのであれば非常に有用ですが、本当にできるのでしょうか?それは場合によります。
時として現在のタスクを遂行するために最近の情報を見ることだけが必要となります。以前の単語をベースに次の単語を予測を試みる言語モデルを考えましょう。“the clouds are in the sky.” における最後の単語の予測を試みる場合、それ以上のコンテキスト情報は必要ありません – 次の単語が sky になることは明白です。
しかし更なるコンテキストが必要な場合もあります。テキスト “I grew up in France… I speak fluent French.” の最後の単語を予測する場合、 最近の情報が次の単語は言語名と提案します、しかしどの言語か狭めようとするならば、更に戻ったところから、フランス語のコンテキストが必要となります。関係情報とそれが必要なポイントのギャップが非常に大きくなる可能性があります。
残念ながらギャップが大きくなれば、RNN は情報を結合して学習することができなくなります。理論的には RNN はそのような “long-term 依存” を処理できますが、実践では RNN はそれらを学習できるようには見えません。
LSTM はこの問題がありません。
LSTM ネットワーク
Long Short Term Memory ネットワーク – 通常は LSTM と呼称 – は RNN の特別な種類で long-term 依存を学習することができます。LSTM は Hochreiter & Schmidhuber (1997) で導入されました。
LSTM は long-term 依存問題を回避するためにデザインされ、情報を長時間記憶しておくことがデフォルトの挙動です。
全ての RNN は NN の反復モジュールのチェイン形式を持ちます。標準的な RNN では、この反復モジュールは tanh 単層のような非常に単純な構造を持ちます。LSTM はまたチェイン状の構造を持ちますが、反復モジュールは異なる構造を持ちます。単一のニューラルネットワーク層を持つ代わりに、4つの NN 層があり、特殊な方法で相互作用します。
LSTM の背後の核心の考え
LSTM への鍵はセル状態 (cell state) で、セル状態はベルトコンベアのようなものです。幾つかの小さな線形作用だけを伴い鎖全体をストレートに走り抜けます。情報は変更されないままそれに沿って流れることは簡単です。
LSTM は情報を削除したりセル状態に追加したりする能力を持ち、ゲート と呼ばれる構造により注意深く統制されます。ゲートは選択的に情報を通り抜けさせる手段です。これらはシグモイド NN 層と単点の乗算演算から成ります。シグモイド層は 0 と1の間の数を出力し各コンポーネントのどれだけを通り抜けさせるかを記述します。0 の値は「何も通さない」を、1 の値は「全てを通す」を意味しています。
LSTM はセル状態を保護して制御するためにこれらゲートを3つ持ちます、
Step-by-Step LSTM ウォークスルー
LSTM の最初のステップはセル状態からどの情報を捨てるかを決めることです。この決定は「忘却ゲート層」と呼ばれるシグモイド層により行なわれます。それは \(h_{t-1}\) と \(x_t\) を見て、セル状態 \(C_{t-1}\) の各数値のために 0 と 1 の間を数値を出力します。1 は「完全に保持する」を表す一方で、0 は「完全にこれを除去する」を表します。
全ての前の単語をもとに次の単語の予測を試みる言語モデルの例に戻りましょう。そのような問題では、セル状態が現在の主語の性別を含むことにより正しい代名詞が使用できることになります。新しい主語を見る時には、古い主語の性別は忘れたいです。
次のステップはどのような新しい情報をセル状態にストアするかを決定します。これは2つの部分を持ちます。まず、「入力ゲート層」と呼ばれるシグモイド層がどの値を更新するか決めます。次に、状態に追加される可能性のある、新しい候補値のベクタ \(\tilde{C}_t\) を tanh 層が作成します。次のステップは、これら2つを結合して状態への更新を作成します。
言語モデルの例では、忘れようとしている古いものを置き換えるために、新しい主語の性別をセル状態に追加することを望んでいます。
そして今、古いセル状態 \(C_{t-1}\) を新しいセル状態 \(C_t\) に更新する時です。前のステップが既に何をするか決めているで、実際にそれを行なうだけです。
古い状態に \(f_t\) を乗算して、前に忘れると決めたことを忘れます。それから \(i_t*\tilde{C}_t\) を加算します。これは各状態値を更新すると決めた数によりスケールされた、新しい候補値です。
言語モデルの場合には、ここでは前のステップで決定したように、実際に古い主語の性別についての情報をドロップして新しい情報を追加します。
最後に、何を出力するかを決める必要があります。この出力はセル状態の基づきますが、フィルターされたバージョンになります。まず、シグモイド層を実行します、これはセル状態のどのパートを出力するかを決めます。それから、セル状態に(-1 と 1 の間に値を収めるために) \(\tanh\) を通してからシグモイド・ゲートの出力を乗算します、結果として決めたパートだけを出力します。
言語モデルの例で言えば、単に主語を見てからは、(次に来るのが動詞である場合には)動詞に関連した情報を出力したいかもしれません。例えば、主語が単数か複数かを出力するかもしれません、その結果、(次に来るとして)動詞がどのような形に活用すべきかを知ります。
Long Short Term Memory の変形 (Variants)
ここまで説明してきたものは通常の LSTM です。しかし全ての LSTM が上と同じというわけではありません。事実、LSTM を含む殆ど全ての論文は少し違ったバージョンを使用しています。違いは大きなものではありませんが、幾つかについては言及する価値があります。
Gers & Schmidhuber (2000) で紹介された、一つの有名な LSTM の変形は 「のぞき穴接続 (peephole connections)」を追加します。これはゲート層にセル状態を見させることを意味しています。
のぞき穴を全てのゲートに追加する場合もありますが、多くの論文では幾つかにのぞき穴を与え、他には与えません。
他のバリエーションはカップリングされた忘却と入力ゲートを使用します。何を忘れて新しい情報を何に追加すべきかを別々に決定する代わりに、それらの決定を一緒に行ないます。何かをその場所に入力する時にだけ忘れます。古い何かを忘れる時にだけ新しい値を状態に入力します。
少しばかりよりドラマチックな LSTM バリエーションは、Cho, et al. (2014) で紹介された GRU – Gated Recurrent Unit です。これは忘却と入力ゲートを単一の「更新ゲート (update gate)」に結合します。それはまたセル状態と隠れ状態をマージして、幾つかの他の変更を行ないます。結果としてのモデルは標準的な LSTM モデルよりも単純で、段々と一般的なものになってきています。
これらは最も有名な LSTM バリエーションの2、3に過ぎません。他にも Yao, et al. (2015) による Depth Gated RNNs のようなものがたくさんあります。また Koutnik, et al. (2014) による Clockwork RNN のような、long-term 依存にタックルするための完全に異なる幾つかのアプローチもあります。
これらのバリエーションのどれがベストでしょうか?違いは重要でしょうか?Greff, et al. (2015) は人気のあるバリエーションの良い比較を行ない、すべて大体同じあることを見出しています。 Jozefowicz, et al. (2015) は 10,000 以上の RNN アーキテクチャをテストし、あるタスクでは幾つかは LSTM よりも良く動作したとしています。
結論
LSTM は RNN で達成できることの中で大きなステップでした。他の大きなステップはあるのか? と疑問を抱くのは自然なことです。研究者の共通の意見は : 「はい!次のステップがありそれは『attention』です!」アイデアは、RNN の全てのステップに、情報のある大きなコレクションから、情報を見るために pick させることです。例えば、画像を説明するキャプションを作成するために RNN を使用している場合、それは出力する全ての単語のために、画像の一部を見るために pick するかもしれません。実際に、Xu, et al. (2015) は正確にこれを行なっています – attention を探検することを望むならば楽しい開始点かもしれません。attention を使用した本当にエキサイティングな結果が幾つかあり、角を曲がればより沢山ありそうです…
attention だけが RNN 研究における唯一のエキサイティングな話題ではありません。
例えば、Grid LSTMs by Kalchbrenner, et al. (2015) による Grid LSTM は特に有望に思われます。生成モデルにおいて RNN を使用したワーク – 例えば Gregor, et al. (2015), Chung, et al. (2015), あるいは Bayer & Osendorfer (2015) – はまた非常に興味深く見えます。
ここ2、3年は RNN にとってエキサイティングな時間でしたが、これからの2、3年もそうあるでしょう。
以上