[Survey]Deep Residual Learning for Image Recognition

Deep Residual Learning for Image Recognition
Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun


ImageNetのCompetitionで１位になったMSRAの[論文](http://arxiv.org/pdf/1512.03385v1.pdf)

・network層をdeepにすることは性能向上に欠かせない。
・しかし、Deepにすると性能が向上せずに悪くなることが知られている。（下のグラフ）
・これらはOverfittingによるものではなく、勾配が０になったり、発散したりするため。

![範囲を選択_053.png](https://qiita-image-store.s3.amazonaws.com/0/100523/47559e9e-3202-e0da-7901-b0b576f71c20.png)

これを解決しようというのがこの論文の趣旨

# Residual Network
**普通のNetwork**
![範囲を選択_040.png](https://qiita-image-store.s3.amazonaws.com/0/100523/c9fa99b9-ac0a-d695-f943-eb2e1f366cbc.png)

$H(x)$が所望するmapping(求めたい変換）
2 weight layerをH(x)になるように学習する

**Residual Network**
![範囲を選択_041.png](https://qiita-image-store.s3.amazonaws.com/0/100523/49b0c608-57c0-4cab-f8b5-7a1b4d5d5eba.png)
・$x$をshortcutして足し合わせると$H(x)=F(x)+x$とおける。
・2 weight layerを$H(x)$になるように学習するのではなく、$F(x)$になるように学習する

・もしidentity $x$が最適なら、weightは０になる
・かりに最適な関数がidentityに近いなら、微小な変化を見つけやすくするべき

入力から最適な出力学習するという問題を残差を学習するという問題に置き換えることで最適化しやすくした。

**特徴**
・Residual NetworkはShortcut connections付きfeed-forward neural network
・Shortcutは1から数Layer飛ばしてつなぐ
・これにより新たなパラメータも増えないし、入力をShortcutして足しているだけなので計算も複雑にならない。
・今までどおり、Backpropagationもできるし、実装も簡単だし、変更なしで今までのフレームワークが使える
・$F(x)$と＄ｘ＄は同じ次元でなくてはならない
・$F(x)$と＄ｘ＄の次元が異なる場合は以下の方法を使う
　1. Zero Paddingで同じ次元にする
　2. Projectionで同じ次元にする
・Residual Networkは、２または３層にする。１層だとLinear Layerになってあまり意味がない。

![範囲を選択_042.png](https://qiita-image-store.s3.amazonaws.com/0/100523/74d889ef-8dbd-63ec-3fa0-619e3f226e71.png)

# Network Architecture
・３ｘ３のConv Filter
・入力と出力は同じサイズで、Filter数も同じにする
・出力サイズが１/２になる時は、Filterの数を２倍にする
・最終Layerはaverage pooling layerを介して、1000 unitのfully connected layerにつなぐ
・max pooling,hidden fully connected layer, dropoutはなし
・Simple Designでdeepにする。これにより計算コストはVGG netと比べて少ない
34Layerの時

|Network|FLOPs|
|:----------:|------------------:|
|VGG         | 19.6 billion FLOPs|
|Residual Net| 3.6billion FLOPs  |

![範囲を選択_054.png](https://qiita-image-store.s3.amazonaws.com/0/100523/34ceb3bc-3b4f-e3ad-2bc2-d683d0f35017.png)
左が１８layer、右が34layer

# Experiments

## ImageNet Classification

Training   1.28 million
Validation 50K
Test       100K

## 18layerと34layerでのPlainNetとResNetの比較

![範囲を選択_043.png](https://qiita-image-store.s3.amazonaws.com/0/100523/016ccf10-7af7-e72b-413d-9d6facb9ecf9.png)
・細線がTraining Set、太線がValidation Setの結果
・左がPlainNetで右がResNetの結果
・PlainNetでは、３４layerの方が結果が悪いが、ResNetでは３４layerの方が結果が良い

![範囲を選択_044.png](https://qiita-image-store.s3.amazonaws.com/0/100523/11fd2c4c-f5b8-0d04-85fc-ae7f273fc1c1.png)
Validation の結果からResNetでは、よりDeepな方が性能がよくなっている

## Identity vs Projection Shortcuts

A. Zero Padding
B. Dimensionの変化があるところだけProjection
C. 全部Projection

３つの性能比較
![範囲を選択_045.png](https://qiita-image-store.s3.amazonaws.com/0/100523/b774dfb4-b648-3e21-d787-c5e7a3625ffc.png)

Cが一番結果が良いが、CはParameterがすべてのLayerで増えるので、それに見合うほと性能がよくなっていないということで、これ以降はAとBだけ使う

## Deeper Bottleneck Architectures


![範囲を選択_042.png](https://qiita-image-store.s3.amazonaws.com/0/100523/74d889ef-8dbd-63ec-3fa0-619e3f226e71.png)

右と左では計算コストはほとんど同じなので、よりDeepなbottleneckを使う
Bottleneckといっても性能がボトルネックではなくFilter数が中間で少なくなっているという意味

![範囲を選択_046.png](https://qiita-image-store.s3.amazonaws.com/0/100523/217ba732-94ab-b417-1e59-5a6452852e35.png)
Validation Setの結果

![範囲を選択_047.png](https://qiita-image-store.s3.amazonaws.com/0/100523/3b7f0516-e7a5-b794-2c80-dbe6b8b31575.png)
Test setの結果

![範囲を選択_051.png](https://qiita-image-store.s3.amazonaws.com/0/100523/a9f831e0-3bc3-9948-8610-80f098835a8e.png)

![範囲を選択_052.png](https://qiita-image-store.s3.amazonaws.com/0/100523/6606e985-2859-42ca-0e91-e2730df14ab7.png)

## CIFAR-10
![範囲を選択_049.png](https://qiita-image-store.s3.amazonaws.com/0/100523/1855358f-4e63-e3fd-f09e-f4a680e3b7ed.png)

![範囲を選択_048.png](https://qiita-image-store.s3.amazonaws.com/0/100523/437c275f-c8f8-0a44-6979-32bf8d458051.png)
・左がPlainNet,真ん中がResNets、右はResNetsの１１０layerと1202layerの結果
・こちはもImageNetと同様にPlainNetではDeepな方が性能が悪くなっているがResNetではDeepな方がよくなっている
・１２０２layerの時は性能が悪くなっている。これはDataSeｔの大きさに対してDeepすぎるためかもしれないとのこと。

![範囲を選択_050.png](https://qiita-image-store.s3.amazonaws.com/0/100523/90d7778f-6633-7313-181a-52edcb0c2c0c.png)
・Layer Responseの標準偏差
・ResNetの値は０に近く、小さい値になっている
・上は、Layerの順番のまま並べたとき、下はソートして並べた時

# 最後に
Deeperな方がWiderより性能がいいらしいです。最近の[論文](http://arxiv.org/pdf/1512.03965.pdf?platform=hootsuite)に書かれているとのことです。（読んでないので詳細は不明）
論文中にも出てきますが、Shortcutな方式は、ResNetの他に[Highway net](http://arxiv.org/pdf/1507.06228v2.pdf)や[Inception net](http://www.cs.unc.edu/~wliu/papers/GoogLeNet.pdf)があるそうです。
ただ深くではなく、問題を解きやすいようにreformulationしたのがポイントのようです。