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

以下の論文を読みます。

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
※ 以下、キャラクターが会話します。それぞれの原作とは関係ありません。内容の誤りは本ブログ筆者に帰属します。
前回:その1 / 次回:まだ
f:id:cookie-box:20180108144126p:plain:w60

えっと、LSTM がもてる記憶の複雑さ―つまり、同時にもてる情報量の大きさと特徴抽出の深さ―を上げるにはどうしようって話だったよね。単純に記憶の次元を増やすのじゃパラメータが激増するし、LSTM のスタックじゃせっかくの LSTM の利点である長期依存性の学習が台無しになっちゃうって言ってたよね。

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

うん…それでどうしようという話だけど、一般のニューラルネットワークでパラメータ数を抑制しながら情報量を増やす有名な方法には、Tensor Factorization とパラメータの再利用があるって。前者の Tensor Factorization というのは、パラメータを、低ランクのテンソルの積で表せるようなテンソルにするみたい? 参考文献も読まなければ正しくはわからないけど…低ランクの積で表せるという制限を課すことでパラメータ数を抑えながら、高次元の特徴量を扱える? もう1つのパラメータの再利用は、CNN のように、小さなパラメータセットを繰り返し全体に適用するようなイメージ?

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

じゃあそのどちらか、あるいは両方を採用するとか?

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

それは…後者を。パラメータの再利用なら、特徴量ベクトルの次元数とは独立にパラメータ数を決められるし(CNNでいうと、画像の大きさとは関係なくカーネルサイズを決められる、かな…)、あと、情報をばらばらにして再帰ループさせることができるから、特徴抽出の深化に役立つって。これは、詳しくは後で? あと、それとは別に…RNNの隠れ状態ベクトル(特徴量ベクトル)をテンソルで表すって。あ、この論文では LSTM を拡張するけど、先に RNN で考える? テンソルで表すと、パラメータを共有する軸?をつくれるって。この軸と垂直な方向に隠れ状態テンソルを延ばしても、パラメータ数は増えない。これは、CNNでいう畳込み層のパラメータ数が、カーネルサイズが同じなら画像のサイズを大きくしても変わらないのと同じ。あと、高階のテンソルをつかうと、パラメータ数が同じなら、depth の割に高速にネットワークを wide にできるって。あの、「同時にもてる情報量の大きさ」と「特徴抽出の深さ」と言っていたのを、原文通りに width と depth とかくようにするね…正確ではない訳だと思うから。この、テンソルにする理由の後者はまだよくわからない。

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

うん。その隠れ状態のテンソルは具体的にどんな風に計算されてつくられるものなのか…プログラムでもなければ、よくわからないかな。

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

泉さんには、プログラムの方が読みやすい? でも、論文だから…数式。あ、RNNの隠れ状態ベクトルテンソルにするといったけど、最初は簡単のために2次元のテンソル、つまり行列で考える。まず、普通の Stacked RNN (sRNN) からスタートする。論文3ページの Figure 1 の (a) …下に、絵を描いた。破線の左側。sRNN はある時間ステップ内で多段階の特徴抽出をする。図の例だと、3段階? この特徴抽出を、ある時刻に一段階目、次の時刻に二段階目…としたい。RNN は既に時間方向に「深い」から、特徴抽出も、これに便乗? そのように特徴抽出を時刻ごとに一段階ずつにしたのが、破線の右側。Figure 1 の (b) …これは skewed sRNN といって、sRNN をゆがめただけで…既に過去に別の論文で提案されている…。

f:id:cookie-box:20180126225422p:plain:w500

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

確かに、右側の絵では、データがどんどん次の時刻に流れて行っているね。出力される  h_{t-3}^{3} の上の添え字は何段目の RNN の隠れ状態ベクトルか、下の添え字はどの時刻の入力まで参照しているかという意味?

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

合ってる。上の図を、時間方向に展開しない形で書くと、下図になる。下図の一番左が sRNN で、真ん中が skewed sRNN。skewed sRNN の一層目は、一つ前の時刻の入力データと、一つ前の時刻の一層目の出力を受け取る。でも、一つ前の時刻の二層目以降の出力を受け取ってもいい。二層目の出力も受け取ったのが、下図の一番右。そして、この一番右の図の、各層の隠れ状態ベクトルを束ねた行列を隠れ状態テンソルと見做したものが、Tensorized RNN (tRNN)。

f:id:cookie-box:20180126231548p:plain:w500
tRNN の隠れ状態テンソル H_t \in \mathbb{R}^{P \times M} とかく。 P が sRNN のスタック数に相当… テンソルサイズとよぶ。 M は各層の隠れ状態ベクトルの次元数に相当… M は画像でいうRGBチャネルのように、チャネル数とよぶ。さらに、 H_{t-1} の頭に次元が合うように変換した入力データをくっつけたものを  H_{t-1}^{cat} \in \mathbb{R}^{(P+1) \times M} とかく。 H_{t-1}^{cat} H_t に更新するときは、CNNの要領…カーネルサイズ  K ずつ、畳込み。その後、活性化。テンソルサイズ  P が大きくなっても、この畳込みのパラメータ数は増えない…。そして、例えば  K=3 なら、「一つ前の層のさっきの出力」「この層のさっきの出力」「一つ後の層のさっきの出力」を畳み込むことになる…層をまたいだ畳込み…だから、cross-layer convolution という。
f:id:cookie-box:20180126232714p:plain:w480

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

なるほど。これなら、 P を大きくしてもパラメータは増えないし、時の流れに便乗して特徴抽出の深化が進む…cross-layer convolution で層間でデータを相互作用させることで、複雑な学習もできる…後はこれを LSTM よろしく、記憶とゲートを増設するだけって感じかな?

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

基本的には…。でも、記憶とゲートを増設するだけでは、上手くいかないことが…。単純に記憶とゲートを増設すると以下。これは、Figure 1 の (d) に相当。ただこれだと、記憶は時間方向にしかスムーズに逆伝播しない。いま、cross-layer convolution しているから、層をまたぐ方向にも記憶は伝播しないといけない…。

f:id:cookie-box:20180126235221p:plain:w320

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