NIPS2017論文読みメモ: Tensorized LSTM(その1)

以下の論文を読みます。

Zhen He, Shaobing Gao, Liang Xiao, Daxue Liu, Hangen He and David Barber. Wider and Deeper, Cheaper and Faster: Tensorized LSTMs for Sequence Learning. arXiv: 1711.01577, 2017. https://arxiv.org/abs/1711.01577
※ 以下、キャラクターが会話します。それぞれの原作とは関係ありません。内容の誤りは本ブログ筆者に帰属します。
前回:その0 / 次回:まだ
f:id:cookie-box:20180108144114p:plain:w60

前回この論文を読もうとしたけど、RNN や LSTM の話をして、全く論文に入らなかった…。

f:id:cookie-box:20180108144126p:plain:w60

ごめん…今回は論文の内容に入るね。でも、前回は LSTM は図を出しただけで、LSTM ってどんなものか全然話してなかったから、その話だけ先にしておきたいかな。LSTM の原論文は以下だよ。

Sepp Hochreiter; Jürgen Schmidhuber. Long short-term memory. Neural Computation, 9 (8): 1735–1780, 1997. http://www.bioinf.jku.at/publications/older/2604.pdf
前回の絵も再掲しておくね。あ、絵の黄色い箇所は上の論文にはなくて、わかるLSTM ~ 最近の動向と共に - Qiita を参考に描き足したものだよ。該当する論文はそちらの記事を見てね。
f:id:cookie-box:20180117205719p:plain:w600

f:id:cookie-box:20180108144114p:plain:w60

前回と違って、一部線が太くなってる?

f:id:cookie-box:20180108144126p:plain:w60

太い線の箇所だけみるとシンプルなRNN(シンプルな RNN のことを、Tensorized LSTM の論文では vanilla RNN と呼んでいるね)なんだ。LSTM は vanilla RNN にどんなパーツを付け加えたものかわかるようにしてみたよ。

f:id:cookie-box:20180108144114p:plain:w60

バニラ…シンプルな味で、おいしそう。じゃなかった、vanilla RNN の周りに結構ごてごてパーツが付いてるんだ…わたしのPCみたい…でも、どうしてこんなに色々なパーツが?

f:id:cookie-box:20180108144126p:plain:w60

絵理さん、PC自作だもんね。じゃなかった、vanilla RNN には以下の欠点があって、この前者を解決するのが上図の「記憶」のライン(原論文の constant error carrousel)、後者を解決するのが上図の Input Gate / Output Gate というように対応付いているよ。

  • 勾配や発散や消滅することにより学習が不安定になる: これは前回も話したけど、誤差を時間ステップをさかのぼらせて伝播させる毎に各時間ステップの誤差が掛け合わさることで発散や消滅の恐れがある問題だね。これは RNN の再帰構造に起因する問題ではなくて、再帰しない多層ネットワークでも層をさかのぼる度に誤差が掛け合わさるんだけど、RNN では時間ステップの長いデータを処理したいときさかのぼる回数が多くなるのと、再帰ゆえに同じ重みを何度も通るパスが存在することから特にクリティカルになっているね。
  • 重み係数のコンフリクトにより表現力が制限される: こちらは再帰構造ならではの悩みだね。ある入力パターンを受け取ったらその特徴を何ステップも保持したいとする。このとき、ある入力パターンから特徴を受け取るように学習しなければならないのはもちろんだけど、そうやって得た特徴がその後の入力によってかき消されないようにもしないといけない。あるときには受け取りたいけどあるときには受け取りたくない、これが Input 側のコンフリクト。他方、特徴があるパターンのときにだけ何か信号を出力したいとして、別のパターンのときにはそのような信号を出力しないようにしたいこともある。あるときには読み出したいけどあるときには読み出したくない、これが Output 側のコンフリクト。
前者を解決するには、再帰させる特徴ベクトルに重み係数を掛けることも活性化することも許されない(正確には原論文を見てね)。誤差を安定的に過去に伝播させるには、言い換えると、過去から今まで続く系列の特徴を学ぶには、そのような特徴には毎ステップ何か加算するくらいしかできない。このような「記憶」という特徴を再帰させる。後は、記憶を毎ステップ加算して読み出せばいい。LSTM では記憶にどのように加算するかをこそ学ぶ。でも、それだけだと重み係数のコンフリクトから逃れられない。だから、受け取りたいときだけ受け取れるように、読み出したいときだけ読み出せるように、制御するゲートを付けてしまってこのゲートの開閉も学べばいい。これが LSTM。

f:id:cookie-box:20180108144114p:plain:w60

パーツパーツに意味があるんだ。

f:id:cookie-box:20180108144126p:plain:w60

前回話しそびれたのはここまでだよ。

f:id:cookie-box:20180108144114p:plain:w60

ありがとう泉さん。いまの話で読みやすくなった…今回読む論文のイントロダクションでも「LSTM によって記憶の保持期間の長期化と、ゲートによる情報フローの制御ができるようになった」とある…それで次の課題は…どうやって LSTM のキャパシティを大きくする?

f:id:cookie-box:20180108144126p:plain:w60

LSTM のキャパシティ?

f:id:cookie-box:20180108144114p:plain:w60

うん…いくら記憶をずっと保持することができても…複雑な記憶をもつことができなければ LSTM の適用場面は限られる。LSTM のキャパシティを広げる1つの方向は、単に記憶の次元を増やす…これは、一度にもてる情報量を増やす。もう1つは…特徴抽出の深化(という表現はわたしが勝手にあてているけど…)。LSTM をいくつも積み重ねる(Stacked LSTM が既に提案されている)ことで、より高レベルな特徴を抽出できるようになる…深層学習がなぜ深層なのかという話でよく挙げられるように…ピクセルからエッジを、エッジから顔のパーツを、顔のパーツから人の顔を…。時系列なら音素、言葉、会話文とか…?Stacked LSTM の原論文は読んでない…ごめん…。

f:id:cookie-box:20180108144126p:plain:w60

その2つの方向が、論文タイトルの Wider と Deeper ということかな?

f:id:cookie-box:20180108144114p:plain:w60

うん。もちろん、記憶の次元を増やせば Wider になるし、LSTM をいくつもスタックすれば Deeper にはなる…。でも…前者は追加的なパラメータを…後者は実行時間を要する…。

f:id:cookie-box:20180108144126p:plain:w60

そりゃあパラメータは必要になるでしょ…記憶の次元を  d だけ大きくするなら、必要な追加パラメータは…あ、2乗で効くんだね。

f:id:cookie-box:20180108144114p:plain:w60

そう。もう一方の Stacked LSTM は実行時間もかかるし、それに、多層化によって LSTM が払拭したはずの勾配の発散や消滅の懸念がまた首をもたげてくる…。

f:id:cookie-box:20180108144126p:plain:w60

それは確かに問題って感じがするね。

f:id:cookie-box:20180108144114p:plain:w60

それでこの論文では、上図の「記憶」を、テンソル―多次元配列の意味だと思う―で表現する手法で、LSTM を、パラメータの追加なしに Wider に、ほとんど実行時間の増加なしに安定的に Deeper にする…以下の順序でそれを実現していく…。

  • まず RNN の出力をテンソルにすることで、パラメータを共有しながら一度にもてる情報量を増やす。
  • 次に上の Tensorized RNN で特徴抽出の深化を時間ごとの再帰ループにマージさせていく。
  • Tensorized RNN を Tensorized LSTM に拡張する。

(その2があれば)つづく