RNN と LSTMの基礎 -- Sequence to Sequence --

2017/02/22 マルレク 「RNN と LSTMの基礎」

RNNは、時系列データや自然言語のテキストのようなシーケンシャルなデータを、別の時系列データや別の言語のテキストのような、同じくシーケンシャルなデータに変換する時によく使われるニューラル・ネットワークのモデルです。

 講演では、まず、これまで取り上げたFull Connectのニューラル・ネットワーク(入力も出力も「順序」を持たない)や、Convolutional ニューラル・ネットワーク(時間のない空間的な配置から特徴を抽出する)との対比で、ネットワークがループを持つRNNの特徴を述べたいと思います。

 講演では、最もよく使われているRNNのモデルであるLSTM(Long Short Term Memory)にフォーカスして、RNNの基礎を解説したいと思います。

講演動画

はじめに

科学でも技術でも、その発展には、飛躍がある。もちろん、飛躍にも小さいものから大きいものまでいろいろあるのだが。面白いことに、何かが共鳴するように、いろんな飛躍が、ある時期に集中して起きることがある。

人工知能の分野では、2012年がそうした時期であった。ImageNetの画像認識の国際的コンテストで、CNNを使ったAlexNetが圧勝し、Googleの巨大なシステム DistBeliefが、教師なしでも猫の認識に成功する。それが、2012年だ。

今また、2012年のブレークスルーに匹敵する目覚ましい飛躍が、AIの世界で起きようとしている。昨年11月にサービスが始まった、Googleの「ニューラル機械翻訳」がそのさきがけである。そこで使われている技術は、RNN/LSTMと呼ばれるものである。

Googleの新しい機械翻訳のシステムは、LSTMのお化けのような巨大なシステムなのだが、 RNN/LSTMの基本原理を理解することは、誰にでもできると思う。また、そうした理解が、新しいAI技術にキャッチアップしようとするIT技術者には、必要だと考えている。

今回は、図を多用した。IT技術者の中で、 RNN/LSTM の基礎の理解が進むことを願っている。

Part I RNNの驚くべき能力について

ここでは、次のようなトピックについて述べる。 いずれも、RNNの驚くべき能力を示している。

 ・機械が学習・理解できることの拡大
  ・RNNの能力について Sepp Hochreiter
 ・RNNによる文の生成 Ilya Sutskever
 ・RNNの驚くべき能力 Andrej Karpathy

どの例も驚くべきものだが、Ilya Sutskever の実験の開いた道は、彼自身の手による機械翻訳への応用を経て、Googleニューラル翻訳技術に合流し、それから現代の「大規模言語モデル」へと発展する。

Chomskyの言語理論とGoogle機械翻訳

形式的言語の形式的文法は、つぎのような階層をなすことが知られている。これをChomsky Hierarchyと呼ぶ。

機械が、この階層の中に位置付けられるどの形式的な文法を理解・学習できたかを考えることができる。

感覚的には明らかなのだが、Google翻訳が実現した「飛躍」が、どのようなものかを正確に述べるのは、意外と難しい。翻訳の評価でよく利用されるBLEU等のスコアは、翻訳改善の重要な目安にはなるのだが、それは、あくまで量的なものだ。質的な「飛躍」は、その数字には、間接的にしか反映していない。

ここでは、英語と日本語の文法の差異に注目して、その差異が、Google翻訳では、どのように埋められているかを、いくつかの具体例で見てみよう。それらは、日本語・英語翻訳の中心的課題であるにもかかわらず、以前の機械翻訳技術では、うまく扱えなかったものである。

英語と日本語の文法の差異については、Chomskyの以前の”Principles and Parameters” 理論を援用した。

Google ニューラル機械翻訳の登場

画像認識でのCNNの成果は、誰の目にもわかりやすいものであったのだが、それと比べると、RNNの利用の成果は、直感的にはわかりにくいかもしれない。

ただ、この点で、誰もが納得できる画期的な前進があった。昨年11月に登場した、Googleの「ニューラル機械翻訳」が、それである。

Part II RNNとは何か

ここでは、次のようなトピックスを取り上げています。

次章の「LSTMの基礎」の基礎になりますので、pdf資料を参照しながら、ゆっくりご覧ください。

 ・RNNは、どう作られるか?
   ・RNNをグラフで表す-- 展開形と再帰形
   ・Sequence to Sequence
   ・RNNでの φ ( WX + b ) の応用
 ・20数年前、いったん放棄されたRNN
 ・RNNの復活

Sequence to Sequence

ここでは、RNNがなぜ "Sequence to Sequence" のNeural Network と呼ばれるのかを説明しようと思う。

入力と状態の変化が、時間上で起きると考えるのは自然である。先の図でも、添え字に用いられている (t-1) -> (t) -> (t+1) は、時間の変化に対応していると考えることもできる。ただ、本当に重要なことは、この変化が、あとさきの「順序」を持って継起することである。時間は、順序を持つ継起の一つの身近な例にすぎない。

こうして、RNNは、順番を持つ入力 x1, x2, x3, …. を、出力 o1, o2, o3, … に変換するのだが、この出力 o1, o2, o3, … も、当然、順番を持ち、順番を保つ。Sequence x1, x2, x3, …. は、Sequence o1, o2, o3, … に変換されることになる。

RNNでの φ ( WX + b ) の応用

フルコネクトのニューラルネットのある層の出力は、φ ( WX + b ) という形で表せる。

ここにφ は、その層の活性化関数、W はその層の重み、b はその層のバイアス、X はその層への入力である。

この計算式 φ ( WX + b ) は、とても基本的なものである。

この基本式が、RNNでどのように利用されているのかみておこう。

Part III LSTMの基礎

Part III -- LSTMの基礎 では、次のようなトピックスを取り上げます。

 ・LSTMをRNNと比較する
 ・LSTMは「記憶」を持つ
 ・LSTMの振る舞いを可視化する
 ・LSTM -- Gateを持つRNN
 ・LSTMの構成を、別のスタイルで概観する
 ・LSTMの働きを詳細に見る
  ・Input Unit と Input Gateの働き
  ・Memory Unit と Forget Gateの働き
  ・Status Unit とOutput Gateの働き
  ・LSTM の働きを式で表す(まとめ)

LSTMは記憶を持つ

ここでは、LSTMが、「記憶」を持つことを述べようと思う。
LSTMでは、RNNに新たに追加された Ct ユニットが、「記憶」を担う。これを Memory Cell と呼ぶことがある。(小論では、Memory Unit と呼んでいる)

かつて放棄されたRNNは、長い「記憶」を持つことができなかった。その主な理由は、RNNの状態が、毎ステップごとに、ループの重みWによって書き換えられるからである。

LSTMでは、Memory Cellのループの重みを1に固定する。このループは、Back Propagationによって学習される重みを持たないと考えればいい。これによって、何回ループを回っても、Memory Cell は書き換えられることがなくなる。「記憶」は、持続する。これをConstant Error Carouselという。

LSTMでの、もう一つの工夫は、ループの途中に、前の記憶を「忘れる」装置を取り付けたことだ。これを Forget Gate と呼ぶ。これは、ある時には、ループの重みがゼロになることに相当する。

これによって、LSTMは、前の「記憶」を忘れるだけでなく、新しい「記憶」に、「記憶」を更新できるようになった。

LSTMが記憶を持つニューロンとしてどのような振る舞いをするのかは、「oLSTMの振る舞いを可視化する」のセクションを、ぜひ読んでほしい。

LSTM -- Gateを持つRNN

RNNは、基本的には、単純な三層構造を持つネットワークをユニットとして、その隣り合う隠れ層同士をフルコネクトで横につなげたものだ。ただし、Feed ForwardのDNNのように、実際に、ユニットを積み重ねるのではなく、隠れ層を結合する重みのパラメーターを共有し、再帰的にシステムを記述する。

RNNの発展系LSTMも、こうしたRNNの基本的なアイデアを踏襲している。ただ、組み合わせの基本となるユニットが少し複雑な構成をしている。LSTMのユニットに導入された新しいアイデアの中心にあるのが、今回、取り上げるGateである。

LSTMの働きを理解するのに、Gateの働きの理解は必須であるのだが、同時に、それは、LSTMの働きを理解する、最も早い近道でもある。

LSTMの各Unitと各Gateの働きを見る

LSTMを構成するのは、次の三つのGateである。

Input Gate:入力 xt と前の層の状態 ht-1 から、この情報をMemory Unitに渡すか否かをコントロールする。

Forget Gate :入力 xt と前の層の状態 ht-1 から、 前の層の記憶 Ct-1 を、Memory Unitに渡すか否かをコントロールする。

Output Gate:入力 xt と前の層の状態 ht-1 から、生成・更新された状態 ht を出力するか否かをコントロールする。

ここでは、まず、Input Unit での Input Gateの働きを見る。
続いて、Memory UnitでのMemory Gateの働きを見る。

LSTMの各Unitと各Gateの働きを見る 2

ここでは、Status Unit でのOutput Gateの働きを見る。

最後の「LSTM の働きを式で表す(まとめ) 」は、しっかりとチェックしてほしい。改めて、構成図を確認するのがいいと思う。

LSTMのヴァリアント

LSTMには、いくつかのヴァリアントがある。
ここでは、そのいくつかを紹介する。

講演資料 「RNN と LSTMの基礎」

資料全体ダウンロード

Part I   RNNの驚くべき能力について

  • 機械が学習・理解できることの拡大
  • RNNの能力について Sepp Hochreiter
  • RNNによる文の生成 Ilya Sutskever
  • RNNの驚くべき能力 Andrej Karpathy
  • 文法の階層性 -- Chomsky Hierarchyについて
  • Google ニューラル機械翻訳

Part II  RNNとは何か?

  • RNNは、どう作られるか?
  • RNNをグラフで表す-- 展開形と再帰形
  • Sequence to Sequence
  • RNNでの φ ( WX + b ) の応用
  • 20数年前、いったん放棄されたRNN
  • RNNの復活

Part III  LSTMの基礎

  • LSTMをRNNと比較する
  • LSTMは「記憶」を持つ
  • LSTMの振る舞いを可視化する
  • LSTM -- Gateを持つRNN
  • LSTMの構成を、別のスタイルで概観する
  • LSTMの働きを詳細に見る
    • Input Unit と Input Gateの働き
    • Memory Unit と Forget Gateの働き
    • Status Unit とOutput Gateの働き
    • LSTM の働きを式で表す(まとめ)

Appendix 各Frameworkでの実装を見る

  • TensorFlowでのLSTMの定義
  • TensorFlowでのLSTMの定義(Python)
  • CNTKでのLSTMの定義
  • MXNetでのLSTMの定義
  • TensorFlow FoldでのLSTMの記述