Visualizing and understanding convolutional networks.


# About
Zeiler, M. D., & Fergus, R. (2014).
Visualizing and understanding convolutional networks.
In Computer Vision–ECCV 2014 (pp. 818-833). Springer International Publishing.

# Abstract
1. Deep Learningといえば [Krizhevsky](http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf) で、画像クラス分類において素晴らしい結果を出した
2. ただ、なぜDeep Learningがうまくいくのか、どう改善していけばいいのか、についての明確に記述した文書はない
3. この論文では可視化する手法を提案し、クラス分類におけるDeep Learningの各中間層や分類器の働きについて、見識を与える。
4. また、可視化によって、Krizhevskyを凌駕するモデルも構築した。
5. さらに、比較実験も行い、各層がどれくらいパフォーマンスに影響を及ぼしているのかを探った
6. さらにさらに、構築したモデルがよく一般化されていることも確認した。（Caltech-101, 256のデータセットで最高スコア）

# 1. Introduction
* 1989年に[Yun LeCun](http://www.ics.uci.edu/~welling/teaching/273ASpring09/lecun-89e.pdf)の論文でたたみこみNNが提案されて以降、CNNは驚異的な手書き文字認識や顔認識, 一般物体認識等々で驚異的な結果を出している。
* これらのCNNの成功要因は主に３点
	1. 膨大なトレーニングデータが使えるようになったこと
	2. GPUによる演算
	3. Dropoutといったような、regulationに関する戦略
* ただ、何故うまくいくのか、どううまくいっているのかは以前としてよくかわっていなかった
* この論文ではDeconvNetを用いた、入力画像のどの部分が、各層のFeature mapの特徴を形作っているのかを明らかにする可視化の手法を提案する。
* 学習中にFeatureがどう形成されていくのかが見えるので、モデルの潜在的な問題を発見することも可能にする
* 入力画像の一部を隠して、クラス分類にどんな影響が及ぼされるか、という実験も行った
* KrizhevskyのImageNetから出発して、改良を加えて、凌駕するモデルを構築
* さらに、別データセットで、クラス分類として使うソフトマックス層だけ再学習して一般的な特徴抽出のための学習ができていることを確認
	* これは[Hinton](https://www.cs.toronto.edu/~hinton/absps/fastnc.pdf), [Bengio](http://papers.nips.cc/paper/3048-greedy-layer-wise-training-of-deep-networks.pdf), [Vincent](http://www.iro.umontreal.ca/~vincentp/Publications/denoising_autoencoders_tr1316.pdf)で扱われる教師なし事前学習、とは異なる、「教師あり事前学習」である。

## 1.1 Related Work
### Visualization
* 似たようなダメな取り組みとして、以下がある
	1. 1層目の部分だけ可視化
	2. 高層では、勾配法をつかった手法([8](http://igva2012.wikispaces.asu.edu/file/view/Erhan+2009+Visualizing+higher+layer+features+of+a+deep+network.pdf))や、Hessian([19](http://papers.nips.cc/paper/4136-tiled-convolutional-neural-networks.pdf), [2](http://cogprints.org/4081/1/quadratic.pdf))を使った手法
* 問題としては、invarianceがどーのこーの...
	* find the optimal stimulus for each unit by performing gradient descent in image space to maximize the unit’s activation. This requires a careful initialization and does not give any information about the unit’s invariances
* 似たような方法としては2つ。
	1. [Simonyan(23)](http://arxiv.org/abs/1312.6034)が全結合層からsaliency mapsを得る手法
	2. [Girshick(10)](http://arxiv.org/abs/1311.2524)が高階層の活性化に寄与している入力画像の部分画像の可視化をしている
* 違いは、以下の2点
	1. 入力画像のうち一部分の可視化。
	2. top-down(Feature mapからInputへ)方式である点

### Feature Generalization
* [Donahue(7)(DeCAF)](http://arxiv.org/abs/1310.1531)や[Girshick(10)](http://arxiv.org/abs/1311.2524)もやっている。
* DonahueはCaltech-101とSun scenesのデータ・セットで, GirshickはPASCAL VOCの物体認識で、最高のパフォーマンスを記録している。

# 2. Approach
Deconvnetの詳細はこっち[Adaptive deconvolutional networks for mid and high level feature learning.](http://qiita.com/knao124/items/f8761afb25624f8b572c)
## 使用するネットワークについての前提
* [LeCun(20)](http://dl.acm.org/citation.cfm?id=1351090), [Krizhevsky(18)](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)が構築したモデルを拝借
	* 入力は2次元のカラー画像
	* 各層は以下のような構成
		1. 前の層の出力を畳み込み
		2. ReLUを通し、
		3. （一部は）max-poolingし、
		4. （一部は）正規化するために局所的なコントラスト化をする
			* 詳細は、18, 16
	* 上層はいくつかの全結合層
	* クラス分類にはソフトマックス
* 学習に使う画像はN個のラベル付きの画像
* 損失関数はクロスエントロピー関数
* 損失はバックプロパゲートされ、確率的勾配降下法にてパラメータ（畳み込み層のフィルタ、全結合層の重みとバイアス）は学習される
	* このあたりの詳細はSection3

### 使用するネットワークの全体像
![Kobito.cmu92r.png](https://qiita-image-store.s3.amazonaws.com/0/32783/adc8144a-2691-6866-0bb1-400c78d69780.png "Kobito.cmu92r.png")

## 2.1 Visualization with a Deconvnet
* 入力画像のどの部分が、Feature mapのどの活性化につながっているのか、を可視化する
* Zeiler(というか、著者)が提唱した[Deconvnet(29)](http://www.matthewzeiler.com/pubs/iccv2011/iccv2011.pdf)を使う。
* Deconvnetの論文では、ネットワークの教師なし学習についてかかれているが、今回は単に、学習済の各層のプローブとして使う
* 可視化するために、各層に、Deconvnetを付け、Feature mapを入力画像空間へ再構築する機能を提供する。（下のFig.1参照）
* 手順は以下
	1. 入力画像を普通に畳み込みネットワークにいれて、Feature mapを得る
	2. Feature mapの中のある活性化しているpixelがどの入力画像由来かを調べる場合、それ以外のpixelを0と置き、Deconvnetへ通す。
	3. Deconvnetによる前の層で、活性化に寄与するpixelの推測は以下の３つから構成され、これが入力層にいきつくまで繰り返される
		1. unpool
		2. rectify
		3. filter

### 入力画像から再構築するまでの様子
![Kobito.K7Ymh3.png](https://qiita-image-store.s3.amazonaws.com/0/32783/a96c5b90-4d54-60f8-7172-573ad691a456.png "Kobito.K7Ymh3.png")

### 1. Unpooling:
* Max Poolingの逆。普通ではどこからpoolされたかわからないため、poolされた位置と値を保持しておく変数を定義して使う
* Fig.1の下の方参照

### 2. Rectification:
* ConvnetではReLUを使うことでFeature mapが全て必ずpositive valueになるようにしている
* 提案手法ではUnpoolingされた値を普通にReLUにいれている、らしい。
	* We also tried rectifying using the binary mask imposed by the feed-forward relu operation, but the resulting visualizations were significantly less clear.

### 3. Filtering:
* 畳み込み演算を行う行列の転置行列で定義される
	* オートエンコーダやRBMと同じ

### 注意書き
* 再構築では正規化はしない
* ひとつの活性化されたpixelから再構築された画像は、元の入力画像の一部分に似ていて、活性化の寄与に比例して重み付けられているものになる
* 普通のバックプロパゲーションと似ているが、違いは以下の２点
	1. 普通のReLUと逆操作時のReLUが独立で実行される
	2. コントラスト正規化がなされない
* 欠点は、明らかに、ある一つのみに関する活性化されたpixelの寄与の可視化であること
* しかし、この可視化はものすごく精度がよい。
	* 可視化されて活性化に寄与していると判明した入力画像の一部分を隠すと、活性化が著しく低下したことが実験でも確認されている。

# 3. Training Details
* Krizhenskyのモデルに似ているが、以下の点で異なる。
	* KrizhenskyのモデルではGPU演算を並列で行うためにモデルが分割されていること。使ったモデルではこれの分割しないバージョン。
	* 可視化してチューニングした結果、第1, 2層に少し手が加わっている。
* ImageNet 2012 training set (1.3 million images, spread over 1000 labels)を使って学習
* 各画像には以下の処理を施す
	1. 短い辺を256pixelにして中心から256×256で切り取る
	2. 全ての画像を使った平均画像を引く
	3. 224×224の10枚の切り抜き画像を作る
* 確率的勾配降下法のミニバッチサイズは128, 学習率は0.01, momentum termは0.9
* 第6,7層の全結合層の学習にはDrop率0.5のDropoutを使い、全ての重みは0.01で初期化、バイアスは0で初期化。
* we renormalize each filter in the convolutional
layers whose RMS value exceeds a fixed radius of 10−1 to this fixed radius
* トレーニングは70epochs, GTX580のGPU1個で、12日間の学習時間がかかった

# 4. Convnet Visualization
## まずは例を見よう
### ネットワークを可視化した例
![Kobito.BG8u62.png](https://qiita-image-store.s3.amazonaws.com/0/32783/d93973c4-2259-bbcc-2087-0fe43158490a.png "Kobito.BG8u62.png")

### Feature Visualization
* Fig.2は学習済みのモデルを可視化したもの
* 各層のFeature mapのうち一番活性化されてる9枚を選んで再構築したものと、それに対応する元の画像を並べている
* 見ての通り、元画像はいろんなバリエーションがあり、特徴空間では似たようになっている。
	* 第5層の1行目の2列目の例では、元画像は全然関係ないようにみえて、実は背景の芝生の特徴が学習されていることがわかる。
* 階層状に、特徴を学習していっているのがわかる。
	* 第2層はコーナーやエッジ・色の交差
	* 第3層はメッシュ, テキストといった複雑なパターン
	* 第4層はもっと高度なパターンでバリエーションも豊富。犬の顔、トリの足、等々...
	* 第5層は全体のオブジェクト. キーボード、犬、等々...

### Feature Evolution during Training
* Fig.4は全学習データで学習中の先ほどの9枚のFeature mapの学習されていく過程を示している
* 低層は数epochsですぐに収束し、高層は40-50epochsかかってようやく収束しているのがわかる。
![Kobito.gpPbMu.png](https://qiita-image-store.s3.amazonaws.com/0/32783/ab9c24d4-168e-7363-f0db-d7bc317ed50f.png "Kobito.gpPbMu.png")

## 4.1 Architecture Selection
* 可視化によって、どう各層が動いているのかがよくわかった。（そうか...？）
* そして第1、第2層で問題があることもよくわかった
	* 第1層: 超高頻度の情報か、低頻度の情報しかフィルタリングできておらず、中間くらいのものはカバーしきれていない
	* 第2層: エイリアシングが発生していることが見えた。これは第1層のstrideが4と大きいため。
* 解決策として2つ
	1. 第1層のフィルタサイズを11×11 -> 7×7にした
	2. 第1層, 第2層の畳み込み層のstrideを4 -> 2にした
* Fig.5(b),(d)に改善の様子を示す
* これによりクラス分類器の精度もよくなった
* こんな感じに改善すればいいんだよ、ということ？

## 4.2 Occlusion Sensitivity
* 疑問: クラス分類の際に対象オブジェクトの位置って有効？それとも周辺の情報が有効？
* これに答えるために、入力画像の一部を隠しながら、クラス分類器の出力がどうなるか追った (Fig.6)
* 明らかにオブジェクトの位置は大事。
	* オブジェクトが隠されたらクラス分類器の精度ががくっと落ちた

![Kobito.bpy53s.png](https://qiita-image-store.s3.amazonaws.com/0/32783/b4eb591e-3108-10c8-7681-650b966b80af.png "Kobito.bpy53s.png")

# 5. Experiments
## 5.1 ImageNet 2012
* 1000カテゴリの、1.3Mのtraining, 50kのvalidation, 100kのtestのデータセット
* Krizhenvskyのモデル、4.1で説明した通り、第1層、第2層に手を加えたオリジナルのモデルとで比較すると、test top-5のエラー率で、1,7%の改善が見られた。（でも表みるとval top-5と比較しているような）
* 複数のモデルを組み合わせた場合だと、14.8%のテストエラー率を達成。これはKrizhenvskyの16.4%に比べて1.6%の改善（Table1の6 convnets, (a)&(b) combinedとKrizhevsky et al 5 convnetsとの比較）
![Kobito.LwWPZN.png](https://qiita-image-store.s3.amazonaws.com/0/32783/535f3407-2b3f-4401-627d-657846404311.png "Kobito.LwWPZN.png")

### Varying ImageNet Model Sizes
* 各層の大きさを変える、もしくは層自体を消す、という操作をしてパフォーマンスがどう変わるかを実験
* いずれの場合もモデルは一から学習しなおした
* 第6,7層を削除したことで、少しだけエラー率が向上した (!!)
* 中間にある畳込み層を消してもそこまで違いはなかった
* どっちも消したら結果は最悪だった。
* 良い精度を得るにはモデルの深さが重要だということ
* 全結合層の大きさを変えてもとくに影響はなかった
* 畳み込み層の大きさを変えることはパフォーマンスに良い影響を与えた
* 畳み込み層を大きくしながら、全結合層も大きくすると、過学習するようになってしまった
![Kobito.Bg9vnK.png](https://qiita-image-store.s3.amazonaws.com/0/32783/25fc9368-b820-4a20-85f9-5300dd1a24a1.png "Kobito.Bg9vnK.png")

## 5.2 Feature Generalization
* 構築した提案モデルの特徴抽出の能力が、他の画像においても通用するような一般性を持っているかどうかの実験。
* Caltech-101, Caltech-256, PASCAL VOC2012のデータ・セットを使った
* 一番最後のsoftmax layerの部分だけ再学習させた
### Caltech-101
* 学習には15 or 30 images/ class使用
* テスト時は 50 images / class 使い、結果の平均値を使った
* 30images/classの時は学習は17mins 
* 結果はBo(3)を2.2%上回った
![Kobito.ZALRXl.png](https://qiita-image-store.s3.amazonaws.com/0/32783/c0fc3d5f-c0cd-f49b-d995-316bcb27cd2e.png "Kobito.ZALRXl.png")

### Caltech-256
* 既存手法よりすさまじい性能向上を示した
![Kobito.5hH82G.png](https://qiita-image-store.s3.amazonaws.com/0/32783/50344d38-b1c7-443e-9248-72eb95d5064d.png "Kobito.5hH82G.png")

### PASCAL 2012
* 結果は3.2%下回る結果に。
* PASCALとImageNetでは学習する画像の性質が少しことなる。PASCALはいろんな物体が写っていて、ImageNetは一つの物体が中心の画像。これが下回っった結果では。
* Oquab et al. [21]がPASCALのデータセットにとって良いクラス分類器の手法を提案しているらしい
![Kobito.6skruW.png](https://qiita-image-store.s3.amazonaws.com/0/32783/81c612fd-47fc-5447-48a3-66725355fd3e.png "Kobito.6skruW.png")

## 5.3 Feature Analysis
* 学習済みのモデルの各層の出力にSVMを付けて、クラス分類の精度を比較した実験
* 層が進むにつれ、精度が改善していき、最終層で一番いい結果がでているのがわかる
* 深くすればするほど、良い特徴を学習していく傾向があるのがわかる。
* 一方で、少ないクラスだと、深すぎても逆効果となっているのがわかる。
* 目的によって、適切な深さ、というものがありそう。

![Kobito.4otNTt.png](https://qiita-image-store.s3.amazonaws.com/0/32783/83a2b751-09fa-13cb-1520-4f248bce7e1f.png "Kobito.4otNTt.png")

# 6. Discussion
* 交差エントロピー以外の別の損失関数を使うことでPASCALでも良い性能がでるのではないか？
* そしてそれはそのまま一般物体認識のモデルとして拡張できそう