ろぐれこーど

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

ReNet: A Recurrent Neural Network Based Alternative to Convolutional Neural Networksを読んだ

CNNに代わる手法としてのRNNを提案したReNetの論文を読んだ。

[1505.00393] ReNet: A Recurrent Neural Network Based Alternative to Convolutional Networks

Multi-dimentional RNNによる多次元データ(画像、動画など)へのRNNの適用はなされていたが、全方向のcontextを利用しようとするとd次元データに対して{ O(2^d) }の計算が 必要になるため、効率的ではなかった。

dlrecord.hatenablog.com

そこで、全次元方向からの隠れ層の結合を受け取るのではなく、特定次元からの隠れ層出力のみを考え、複数のRNNをスタックするという方法で計算量を{ O(2d) }に抑え、かつ精度を高めた手法がReNetになる。例えば画像なら、ピクセルを縦方向の系列とみなしたRNNと横方向の系列とみなしたRNN VGG-16やResNetなどのCNNが様々な手法のベースモデルになっているのに対し、ReNetも多くのRNNベース手法(特にSemantic Segmentation)の基礎になっているらしい。

Introduction

これまでmulti-dimentionalなRNNが提案されてきたが、ここではuni-dimentionalなRNNを構築し、それらを重ねることで多次元データのcontextの 学習に利用している。例えば画像データなら、上から下、下から上、右から左、左から右、の四方向のRNNをスタックする。実際には、垂直方向と 水平方向の二方向に大きく分けられている。

前回も述べたが、CNNのconv+poolによる特徴抽出ではカーネルサイズに依存したcontextしか 取得できないという欠点があるため、著者らはCNNのconv+poolの構造をRNNに置き換えることで、画像全体のcontextを獲得しようと試みた。のちにCNNとの比較も行なっている。multi-dimentionalのRNNと比較した一番の利点は学習するRNNの数が少なくて済む点であり、d次元データなら{ (2d) }個のRNNで実現できる (MDRNNはデータの各頂点を始点としてRNNを計算するため、{ (2^d) }個学習する必要がある)。また実装も簡単になる。

Model Description

入力特徴マップを { X = \{  x_{i,j}  \}, X \in  \mathbb{R}^{w \times h \times c} }とする。w, h, c はそれぞれ幅、高さ、チャネルである。ここでオーバーラップしないようなreceptive field size{ w_p  \times h_p }を定義し、{X}{ I \times J   (I = \frac{w}{w_p},  J=\frac{h}{h_p}) }のpatch { P=\{p_{i,j}  \}, p_{i, j} \in \mathbb{R}^{w_p \times h_p \times c} }を考える。ここでiは水平方向、jは垂直方向のインデックスとする。

以下に手法の概要図を示す。

f:id:gco46:20171010155727p:plain:w300

まず最初に、画像を垂直方向の系列データとしてみた二つのRNNを学習する(一つは下から上、もう一つは上から下)。各patchをベクトル化したデータを入力とし、

{ \displaystyle
v_{i,j}^F = f_{VFWD}(z_{i, j-1}^F, p_{i,j}), \ \ \ \  {\rm for}\ \ \  j=1, \ldots, J
}

{ \displaystyle
v_{i,j}^R = f_{VREV}(z_{i, j+1}, p_{i,j}),  \ \ \ \   {\rm for}\ \ \  j=J, \ldots, 1
}

ここで{ f_{VFWD}, f_{VREV} }は隠れ層のactivationであり、だいたいtanh()が使われる。Vertical ForwardとVertical Reverse の略と思われる。要は一時刻前の隠れ層の出力と現時刻の入力によって現時刻の出力が決まる、普通のRNNである。

両方向での出力が求まると、feature mapとして{ v_{i,j}^F , v_{i,j}^R }が得られる。これらをchannel方向で結合することで、

{ \displaystyle
V = \{v_{i,j}\}_{i=1, \ldots, I}^{j=1, \ldots, J}
}

を求められる。ここで{ v_{i,j} \in \mathbb{R}^{2d} }であり、{d}はrecurrent unitの数である。これにより、縦方向の全てのpatchに関する特徴が得られたことになる。

次は同じように水平方向の2つのRNNを学習する({ f_{HFWD}, f_{HREV} })。上記と全く同じ方法で処理すると、結果的に

{ \displaystyle
H = \{h_{i,j}\}, \ \ \ \ {\rm where} \ \ \ h_{i, j} \in \mathbb{R}^{2d}
}

が求まる。{h_{i,j}}は画像全体のcontextを考慮した特徴となっているわけである。この一連の処理でrecurrent unitの数に応じた次元のfeature mapが得られるので、あとはCNNよろしくdeepにしたり、全結合層で分類したりする。学習も通常のBPTTとSGDで行われる。

Difference between LeNet and ReNet

なんかダジャレみたいになってる。こういう内容を読みたくなるようなユーモアも大事なのかもしれない。この章ではCNNのLeNetとRNNのReNetの違いを考察している。

第一に、両者は同じフィルタやfeature mapを扱っているが、RNNは画像全体に対するlateral connectionを学習しており、CNNのようなlocal filterに依存しない特徴が得られる。かつ、RNNではCNNよりもコンパクトな表現で(冗長ではない)特徴を抽出できる、らしい。 この辺定性的な説明なのでよくわからない。

第二に、LeNetではmax poolingによって微小な変換に対する不変性を獲得しているが、RNNによって学習されたlateral connection featureはこの機能が備わっているらしい(故にmax poolingの必要性が減らせる)。ただしpoolingしてはいけないわけではなく、 downsampleによる次元削減で計算負荷を減らすことはRNNでもできる。

第三に、LeNetのようなmax poolingを含むCNNは、poolingの演算は不可逆なため、オートエンコーダを作成できない(?)という問題がある。実際にconvolutional autoencoderを作るときはupsamplingとかunpoolingとかdeconvolutionとかするんだろうけど、 RNNではその必要はなく、容易に逆演算が可能である。この利点がどれほど効いてくるのかはよくわからない。

以上から、ReNetではmax poolingをlateral connectionに置き換え、オーバーラップなしのconvolutionを実行したものであると考えることができる。LeNetの派生として提案されたこの手法では、poolingをなくしてfeature mapの サイズを維持し、オーバーラップなしのconvolutionを行っているが、結局kernel sizeに応じた画像の局所領域しか扱えていないため、ReNetとは根本的に異なる。

ひとつReNetの欠点として言えることは、並列演算が難しいことである。画像を系列として扱うため、一時刻前の計算が終わらないと出力が計算できない。LeNetは各層で並列演算が容易である。 ただ、 sequential layerによって学習される特徴は高効率であり、パラメータ数も少なくなるので、結果的に計算時間は少なくなるというのが筆者の主張である。ここでいう並列演算はモデルの並列演算であり、データの並列化は両モデルで可能である。

おわり

Experimentsの章でMNIST, CIFAR-10, SNHNの3つのデータセットで実験し、他手法と比較しているが、CNNと張り合ってはいるもののstate-of-the-artには至っていない。他の手法ほとんどCNNなのになかなか健闘している感もある。著者らもこの段階ではまだまだ 研究の余地がある、と締めくくっており、実際このモデルの考え方をベースにRNNをdeepに組み込んでいく手法が数多くある、らしい。(survey)

次はRNN系かもしれないしCNNかもしれない、関係ないやつ読むかもしれない