ろぐれこーど

限界組み込みエンジニアの学習記録とちょっぴりポエム

Multi-Dimentional Recurrent Neural Networkを読んだ

Recurrent Neural Networkは系列データに対して適用されるが、時刻と対応している必要はなく、系列順序に意味のあるデータならなんでもよい。

前回の記事

dlrecord.hatenablog.com

で取り上げたように、画像、動画、ボリュームデータなど、多次元データに対してもRNNは利用できる。

しかし、例えば画像データに対してj行目の画素一列を一つの系列として扱いそのまま学習を行うと、空間的なcontextをことになる(ボリュームデータに対しても同様)。そこで多次元の結合を考慮したmulti-dimentionalなRNNを利用することで、画像などのデータに潜む構造を学習できるようにしよう、という試み。

論文は↓
[0705.2011] Multi-Dimensional Recurrent Neural Networks

とあるサーベイ論文を読んでいたら出てきたのでざっくり読むことにした。現在の主流な手法ではないのかもしれないが、多次元データに対する先駆け的な存在なのだろう。被引用数がそれなりになっている。
あとslide shareに完成度高めのMDRNN紹介スライドが上がっている。

MDRNNベースの最近の手法が多く取り上げられているため、ざっと調べるときには便利だと思う。

Introduction

モチベーションとしては上でも述べたように、「画像などの多次元データを、前処理することなくRNNで、その意味するところを学習させたい」というところ。多次元データを扱うニューラルネットとしてメジャーどころはCNNであるが、CNNの欠点として

  • 回帰構造を持っておらず、contextを理解するためのカーネルサイズを手動で設定する必要がある
  • 大きい画像に対してのスケール不変性を持たない

の二点が挙げられている。

他の多次元データに対する統計モデルとしてmulti-dimentional HMM(Hidden Markov Model)があるが、データが大きい場合は計算時間とメモリ消費が膨大になるとのことで、こちらも少々しんどい。 これらの課題を解決した方法がいくつか提案されている1が、多次元構造を全て利用したモデルはないらしい。


Multi-dimentional RNN(MDRNN)

そこで筆者らが提案するのが、多次元の隠れ層結合を持つ以下のようなRNN(二次元の場合)。

f:id:gco46:20170930222923p:plain

数式で厳密に表すと

... on the set of point { \{ (x_1, \ldots, x_n) \} }.
One exapmle suitable ordering is { (x_1, \ldots, x_n) \lt (x^{\prime}_1, \ldots, x^{\prime}_n) } if { m \ \exists \  (1, \ldots, m) }
such that { x_m \lt x^{\prime}_m } and { x_i = x^{\prime}_i \in (1, \ldots, m-1) }.

・・・とのことだが、要するに隣接する一つ前のデータ点からの出力を受け取る、という理解でいいと思う。


これを、定めたデータの原点から一列ずつ伝播させていく。画像データでの例は以下

f:id:gco46:20170930231347p:plain

点(i, j)を入力とする隠れ層への入力は、点(i-1, j)と(i, j-1)の隠れ層の出力を含む。


Multi-directional MDRNN

上の図のように、二次元データの左上を原点として系列データを処理すると、(i, j)まで処理した時点で原点と(i, j)の間の空間のcontextを学習していることになる。これはつまり原点の取り方によってネットワークが利用できるcontextが異なってくるということであり、通常の双方向RNNと同様に"未来"のcontextも利用できるようにmulti-directionalにすることが、MDRNNにも可能であるという。


f:id:gco46:20171001111812p:plain

上図の左が、左上ピクセルを原点とした一方向MDRNN、右が四方向(隠れ層4層)のMDRNNである。それぞれの層が異なる領域のcontextを学習する。

これでいくとn次元データに対しては{ 2^n }個の隠れ層が必要となる。高次元データに対してはかなりパラメータ数が増えてしまうため、一部の結合を捨てて効率化を図った手法としてReNetとかがあるようだ。これはSemantic Segmentation用のモデルとして提案されたReSegの前進になったモデルらしい。Semantic SegmentationにRNNを用いるのはあまりメジャーではないのかもしれないが、たまにRNNベースの手法も見かけるので勉強しておいたほうがいいかもしれない。MDRNNに関して言えば、筆者は大きい(wideな)layer一つを使うより小さい(narrow)layerを複数重ねたほうが精度があがると言っている。まあそれはそんな気がする。


Analysis

手法の概要としては以上の通りである。あとLSTMとか使って実験してるっぽい。Air Freight databaseという、レイトレースにより人工的に作成したデータセットとMNISTを使って実験している。ピクセル単位でラベリングする、いわゆるSemantic Segmentationにより評価している。MNISTではCNNと比較しているが、MNIST自体がそこまで難しいデータセットではないので顕著な差は表れていない、ような気がする。

各隠れ層のactivationを可視化したこの図

f:id:gco46:20171001120037p:plain

はまあまあ面白い。二層目と三層目がマスク的な役割をしており、それぞれが担当するcontextに注目しているのだと思う。推定結果を見るにそこそこいい感じになっているので他のデータセットに対しても上手く働くのかもしれないが、計算時間に関して何も言及がなかったのでそこは気になるところ。


おわり

とりあえずざっくり読んだ。今出回っているようなdeep learning系のライブラリで実装できるのだろうか?いずれにせよ手持ちのマシンのスペックでは足りない気がするけど・・・
次RNN系の論文読むとしたらReNetReSegか。


  1. 元論文[7][8][9][11]