【book review】ゼロから作るDeep Learning (Chapter 8: last chapter)

今回読んでいる本

前回は, (然るべき意味で局所的に連続な) 情報をネットワーク・パラメタに反映させるのに適したConvolutional Layerと, それを取り入れたネットワークであるCNNを紹介した.

局所的な情報を張り合わせ, 張り合わせ (のり付け) の情報込みで大域的データを表現するというアイデアは, 数学において Sheaf Manifold, Vector Bundle 等を扱う際に必ず現れる概念だが, Convolutional Layerにもそのような解釈を与えることができる[1]c.f. Fully Convolutional Networks for Semantic Segmentationの「3.2. Shift-and-stitch is filter rarefaction」.. 例えば (channelは考慮せず) m×n pixelの2D画像データを入力とするConvolutional Layerの説明としては, 理論上次のような一般化が考えられる:

Definition (Convolutional Layer).

U_i\subset \mathbb{R}^{m_in_i} \subset \mathbb{R}^{mn}に対し, i\in Iで添字付けられた線形埋め込みF_i, X_i:U_i\hookrightarrow \mathbb{R}^{mn}が与えられてるとする. 更に各i\in Iに対し, (連続とは限らない) pooling関数 P_i:\mathbb{R}^{mn}\to \mathbb{R}^{mn}も与えられてるとする. この時,

    \[\mu_i = F_i(U_i)\cdot X_i(U_i),\]


を(埋め込んだ先の) (m,n) 行列の成分ごとの積で定義し, \mu_i\in {\rm M}(m,n;\mathbb{R})と見做す.

    \[\mu = \sum_{i} P_i(\mu_i)\]


のことを, フィルタ F=\{F_i\}による入力X=\{X_i\}の畳み込みと呼ぶことにすると, Convolutional Layer \mathcal{L}\mathcal{L} = \mathcal{L}(F_i,X_i,P_i,I)と書ける.

書籍で扱われている (CNNの) Convolutional Layerは, 任意のi\in Iに対しm_i=n_i (=sとおく) でU=U_iかつF=F_iである. 更にpooling関数はP_i(\mu_i)=E_{k(i)}(|\mu_i|)で定義される ( E_{k(i)}:\mathbb{R}\to \mathbb{R}^{mn}は, k(i)成分以外は0で与えられた実数をk(i)成分に割り当てる写像, |\mu_i|は行列\mu_iの成分の和).

この書籍の意味でのConvolutional Layerは, フィルタFが正方行列を表すとして\mathcal{L}=\mathcal{L}(F,X_i,P_i,I)と思える.


いよいよ本書のレヴューも最終章に到達した. 8章の表題もディープラーニングとなっており, Neural Networkの応用の可能性や課題, 現行研究について概説がある. 本章前半で説明されている層を深くするメリットについて所感を述べ, 後半の各分野への応用理論は各論になるのでこのレヴューでは全ては扱わない.

層を深くするメリットについて

書籍では以下のメリットが説明されている:

  1. パラメタ数 — Convolutional Layerの矩形領域Uのサイズに対応 — を小さくする,
  2. 受容野[2]Receptive Fieldのこと. Araujo, A.らの論文には, the size of the region in the input that produces the feature と定義されている.を広くする,
  3. 表現力 — Activation Layerにおけるパラメタの取り得る値の自由度 — を下げない.

※これらはConvolutional Layersを通る入出力の次元を固定した時のメリットであることに注意.

受容野はパラメタ数を大きくすれば広くできるが, その分推論と学習に時間がかかる (と考えられる). 出力の次元は固定なので, 受容野を広く保ったままパラメタを少なくすると, 層を重ねないとStrideを大きくするしかない. Strideが大きいConvolusionは, 特徴抽出をに行うことになるので, フィルタが特徴を十分捉えるまでの学習に時間がかかるか, うまく特徴を捉えられない?ことが予想される.

FCN (Fully Convolutional Network) について

Fully Convolutional Networks for Semantic Segmentation が原論文. semantic segmentationの文脈で, ピクセルごとのクラス分類をしたい場合に(非効率な)ピクセルごとのforward処理 (Convolution)を回避するために考案されたネットワークで, 全てのLayerがConvolutional Layerから成る.

1. fully-connected LayerからConvolutional Layerへの変換

The fully connected layers of these nets have fixed dimensions and throw away spatial coordinates. However, these fully connected layers can also be viewed as convolutions with kernels that cover their entire input regions.

Fully Convolutional Networks for Semantic Segmentation

入力の次元がc×w×h, 出力次元がoであるようなfully-connected Layerを, サイズo×c×w×hのフィルタを持つConvolutional Layerに置き換えることが可能. fully-connected Layerとして(biasを略記した) Affine Layerを考えると, 以下の推論 (forward) 処理:

    \[\begin{pmatrix}x^i_1 &\ldots & x^i_{wh}\end{pmatrix}\begin{pmatrix}f^i_{11} &\ldots & f^i_{1o} \\ &\ddots & \\ f^i_{wh,1}&\ldots& f^i_{wh,o} \end{pmatrix}, \quad 1\leq i\leq c\]


が, 対応する次のConvolutional Filterに置き換わる:

    \[F^{ij}=\begin{pmatrix}f^i_{1,j} &\ldots & f^i_{w,j} \\ &\ddots & \\ f^i_{w(h-1)+1,j}&\ldots& f^i_{wh,j} \end{pmatrix}, \quad 1\leq i\leq c,\ 1\leq j\leq o\]

2. end-to-end forward処理

論文を少し読んでみるが, 少し読むくらいでは余り理解できない. 画像・音声のsampling処理の知識がある方が良さそう. まさに「local featureを張り合わせてglobal featureと合わせる」というようなことをやっている.

画像スタイル変換の実装

A Neural Algorithm of Artistic Style が原論文. 心残りだけれども完全に掌握するのは後回しにするとして, 実装の方を進めてみる. 実装も容易ではないので, 手始めにChainerで実装したOpen Source Codeを拝借して動かしてみた[3]chainer v1.*で動くコードになっていたようで, chainer v7.8環境を使った私は少しコードを修正する必要があった.具体的には volatile flag is removed from … Continue reading.

1000回試行した出力画像

1000回すだけでも10分~15分程度かかったので, デフォルトの5000回回そうとしたら一時間超推論処理にかかる. ローカルマシンでDeep Learningの処理を動かす限界が見えた印象.

Footnotes

Footnotes
1 c.f. Fully Convolutional Networks for Semantic Segmentationの「3.2. Shift-and-stitch is filter rarefaction」.
2 Receptive Fieldのこと. Araujo, A.らの論文には, the size of the region in the input that produces the feature と定義されている.
3

chainer v1.*で動くコードになっていたようで, chainer v7.8環境を使った私は少しコードを修正する必要があった.
具体的には volatile flag is removed from chainer.Variabletrain flag is removed from chainer.functions.dropout にある変更に対応した.