ITと哲学と

IT系エンジニアによる技術と哲学のお話。

Recurrent Neural Networks

CouseraのDeepLearningのコースの講義メモ. 今週からSequence Modelsということで時系列データを扱う. 文章なんかもSequence Modelで扱う.

Why sequence models

RNNなどの時系列データを扱うためのモデルについて勉強する. 音声認識や楽曲生成,感情分析なんかがseruence modelのタスクとなる.

Notation

表記法について.

入力xとしてセンテンスを想定する. 入力x:「Harry Potter and Hermione Granger invented a new spell.」という感じのセンテンス.

この時,入力の要素をそれぞれx^{<1>},x^{<2>},x^{<3>},...,x^{<9>}と表す.一番後ろの要素は入力系列の長さを使ってx^{ \langle Tx \rangle }と表す.

出力が例えば各単語が人名であるか?のフラグだとすると 出力:「1 1 0 1 1 0 0 0 0」と表せる. これをy^{<1>},y^{<2>},y^{<3>},...,y^{<9>}と表す.

ニューラルネットに入力を入れる際に,Harryという文字列はそのまま扱うことができないので,ベクトルに変換する必要がある. このための方法はいろいろある.

例えば,ボキャブラリーVを次のように考える.

Voc = [a,...,and,...,Harry,...Potter,...zoo ]の転置

このボキャブラリーは入力の各要素が取りうる単語をひとまとめにしたベクトルであり,1番目が[a],4075番目にHarry,6023番目にPotter,100000番目にzooがくるとする.

この時,x^{<1>}は次のようになる.

x^{<1>} = [0,0,...0,1,0,....0]

ここで,4075番目の要素が1であり,ほかの要素は0である. これは1番目の入力要素であるHarryがVocの中で4075番目だからである.

同様に,2番目の入力であるPotterはVocの中で6023番目なので,6023番目が1で他は0のベクトルになる.

Recurrent Neural Network Model

なぜ通常のニューラルネットが使えないのか

これまでのネットワークではInputとOutputのサイズが一定であることが前提だった.これが,センテンスや音声を入力とすると可変長になるため,これまでの仕組みでは扱えない.

さらに,とある箇所で学習した内容を他の箇所に使い回すことができないという問題もある.文の先頭にHarryがきていたら人名として認識されるのであれば,文の途中にHarryがきた場合でも同様に認識してほしいが,普通のニューラルネットワークではこれはできない(CNNであればこれは可能だが).

RNN

RNNのアーキテクチャを図1に示す.

f:id:masamasah:20181003212134j:plain

ここで,縦長の箇所がニューラルネットワークであり,重みを共有した同じネットワークを常に使用する.

ここでポイントになるのが,\hat{y}^{<2>}の予測にx^{<2>}だけでなくa^{<1>}も使うことが大きな特徴である.

これによって現在より昔のデータを加味した推定を行うことができるようになる.

順伝播の計算式を図2に示す.

f:id:masamasah:20181003212147j:plain

これを簡略化し,図3となる.

f:id:masamasah:20181003212159j:plain

Backpropagation through time

各重みの学習はこれまで同様に誤差逆伝播で行う.

誤差は図4で表される.

f:id:masamasah:20181003212209j:plain

この誤差を,逆伝搬するので,図5のようなイメージになる. 赤字が逆伝搬を示している.最終的な誤差から,逆方向に伝搬していく様子がわかる.

f:id:masamasah:20181003212304j:plain

Different types of RNNs

これまでは入力と出力の要素数が等しい例をみてきた. これをMany-to-manyのパターンと呼ぶ.

他にも,Many-to-oneのパターンやOne-to-manyのパターン,Many-to-manyのパターンの亜種がある(図6).

f:id:masamasah:20181003212218j:plain

  • Many-to-many Tx=Tyのパターン.単語の人名判定などに使われる.

  • Many-to-one Ty=1のパターン.センテンスから感情を分析したりするなどに使われる.

  • One-to-many Tx=1もしくは0のパターン.楽譜の自動生成とかに使われる.

  • Many-to-manyの亜種 Tx!=Tyだがそれぞれが1ではないようなパターン.言語の翻訳とかに使われる.

Language model and sequence generation

言語モデルとは

音声認識のタスクにおいて「The apple and pear salad.」という発話が会った時,①「The apple and pear salad.」なのか,②「The apple and pair salad.」なのか,音声からだと判断が難しい.

この時,言語の特性上①である確率が②である確率より高いので,①を採用すべきだということをやるために,確率P(センテンス)を求めることができるモデルを言語モデルという.

対象とする言語の大量のコーパスを用いてモデルを学習させる.

RNNを用いる

確率P(センテンス)はP(x^{ \langle 1 \rangle }) \times P(x^{ \langle 2 \rangle }|x^{ \langle 1 \rangle })\times P(x^{ \langle 3 \rangle }|x^{ \langle 1 \rangle },x^{ \langle 2 \rangle }) \times ... \times P(x^{ \langle T_x \rangle }|x^{ \langle 1 \rangle },x^{ \langle 2 \rangle },...,,x^{ \langle T_{x}-1 \rangle })で求められる.

Many-to-manyモデルで,各値が求まるモデルを考える(図7).

P(Harry Potter and Hermione Granger invented a new spell.)を求める.

f:id:masamasah:20181003212319j:plain

ここで,y^{<1>}は,全てのボキャブラリに対して,センテンスが各単語で始まる確率をとなる.y^{<1>}の単語「I」に相当する部分は他のものに比べて高い確率を示すだろう.「Harry」に相当する部分は逆にそんなに大きくはないかもしれない.

次に,x^{<2>}=Harryとして,Harryが与えられた時のボキャブラリVの各単語の確率を求める. これを最後まで繰り返すことで,各単語の出現確率が求まり,それらを掛け合わせることでP(センテンス)が求まるわけである.

Sampling novel sequences

学習した言語モデルを使って,センテンスの生成ができる.

学習したRNNから得られた\hat{y}^{<1>}の確率分布に従って,1単語を選び出す. その単語をx^{<2>}として入力し,\hat{y}^{<2>}を得る.さらにそこから\hat{y}^{<2>}に従って単語を選び出してx^{<3>}に入力していく.ピックアプした結果が文の終端文字であるところまで進めると,最終的にセンテンスを生成できるわけである(図8).

f:id:masamasah:20181003212328j:plain

Vanishing gradients with RNNs

RNNは系列が増えるに従ってどんどん深いネットワークになっていくので,勾配消失問題と勾配爆発問題が起きる. 勾配爆発の方は,勾配が閾値を超えたら調整するGradientClippingという技術を使うことでなんとかなるが,消失問題はそうもいかない.

これが起きると,RNNにおいては,時系列的に離れた情報は影響を及ぼしにくいという状態が起こる.

例えば「The cat which .... was full.」という文章の動詞部分は主語のcatが単数か複数かで異なる.主語が複数であれば「The cats which ... were full.」となるべきである.

これが,勾配消失問題により,離れた情報は影響を及ぼしにくいため,解決できない.

Gated Recurrent Unit

勾配消失問題を解決するためのRNNのシリーズとしてGated Recurrent Unit(GRU)とLong Short Term Memory(LSTM)がある. まずGRUについて説明する.

通常のRNNを細かく図示すると図9のようなイメージになる.

f:id:masamasah:20181003212339j:plain

GRUとLSTMでは,メモリーセルcというものを考える. GRUではメモリーセルc^{ \langle t \rangle }=a^{ \langle t \rangle }である.

GRUの単純化したモデルについてまずは説明する.

メモリセルを導入した順伝搬を図10に示す.

f:id:masamasah:20181003212350j:plain

ここで,Γはゲート関数と呼ばれる.

ゲート関数が1であれば c^{\langle t \rangle}=\widetilde{c}^{\langle t \rangle}となる. ゲート関数が0であれば c^{\langle t \rangle}=c^{ \langle t-1 \rangle}となり,メモリセルは更新されない. つまり,ゲート関数がメモリーセルに格納されている過去の情報を更新するか,保持するかを制御するような動きになる.

言い換えると,ゲート関数が0であれば記憶を保持し,1であれば過去の情報は忘れて新たな情報を記憶し直すということになる.

ここで,単純化したGRUのイメージを図11に示す.

f:id:masamasah:20181003212359j:plain

「The cat which .... was full.」の例で言うならば,catの時点でゲート関数が1になり現在の情報を記憶して,主語が単数形であったことを記憶し続ける.wasの直前まで主語についての記憶があるので,間違いなくwas(wereではなく)を予測できるわけである.

これはあくまで単純化したもので,実際にの順伝搬は図12のようになる. ゲート関数が1つ増えている.

f:id:masamasah:20181003212409j:plain

たくさんの研究者が試した結果,ゲート関数をもう一つ増やしたほうが精度が高かったため,こんな形に落ち着いた.

Long Short Term Memory

LSTMという手法の紹介. GRUとLSTMでどっち使うべき?というのは一概には言えない. LSTMの方が良いケースが歴史的には多いようだ.

なので,まずはLSTMを使ってみることがオススメ.ただ,GRUの方がシンプルではあるので,学習しやすいという利点がある.それによってより深い構造を取ることができたりもする.

LSTMの順伝搬を図13に示す.

f:id:masamasah:20181003212422j:plain

この場合のイメージを図14に示す.

f:id:masamasah:20181003212433j:plain

ΓuをupdateGate,ΓfをforgetGate,ΓoをoutputGateと呼ぶ.

Bidirectional RNN

これまでの枠組みでは,「過去のデータ」のみに依存していた. センテンス「He said, "Teddy bears are on sale!"」と「He said, "Teddy Roosevelt was a great President!"」の人名判断をしようとした時,過去のデータのみなので「He said」に従って「Teddy」を判定しなくてはいけない.これは不可能である.

なので,図15のような未来の情報にも依存するようなRNNも考案されている.

f:id:masamasah:20181003212445j:plain

この時,順伝搬は図16のように表せる.これをBidirectionalなネットワークと呼ぶ.

f:id:masamasah:20181003212455j:plain

これは通常のRNNの例だが,LSTMやGRUでも同様にBidirectionalなネットワークにできる.

Deep RNNs

これまで単層のRNNをみてきた. これらを縦に並べてDeepなネットワークを構築することが可能.

RNNやLSTMやGRUやBindirectionalRNNでも同様に積み重ねることができる. BindirectionalRNNは計算コストが高いのであまり深いのはみないが,可能は可能である.