[Survey]Identity Mappings in Deep Residual Networks

[Identity Mappings in Deep Residual Networks](http://arxiv.org/pdf/1603.05027v1.pdf)


この論文は、**ResNet**の**identity mapping**(**skip connection**)に関して、詳細は解析を行ったものです。

**ResNet**における重要な特徴は、残差$F$を学習することによって、100 layerを超えるdeepなNetworkでも安定した学習が行えるようにした点にあります。また**ResNet**は、モジュール構造になっており、モジュールを単純に組み上げて行くことでDeepなArchitectureを実現しています。論文ではこのモジュールを**Residual Units**と呼んでいます。

**Residual Units**を図で示すと下記になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/b8ed26f8-3091-7669-5198-bdcfe012d2ec.png)

式で示したものが下記です。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/13302a89-655b-9761-9dd3-9f22956198e9.png)

ここで、$F$は残差を表す**Residual Function**です。**Residual Units**の出力は、Unitの入力$x_l$をfunction hに通した値$h(x_l$)と残差$\cal F(\mathbb x_l, W_l)$の和をactivation function $f$に通したものになっています。

この論文では、**残差**のPathを構成している**Batch Normalization(BN)**や**ReLU**の順番を変えたり、入力$x_l$のPathを変えたりしながら性能評価を行い、**identity mapping**の利点や、最適な構成を探っています。本論文の成果としては、従来はweight乗算の後で**BN**を行っていましたが、これを残差のPathの最初に持って行くことでResNetの場合は性能がUpするということを示したことにあります。

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/a156a5c2-026b-de55-a6fb-e4fa1772b42c.png)

# Analysis of Deep Residual Networks
**Residual Units**の式は下記の通りです。
$x_l$はl 番目の**Residual Units**の入力です。$\cal W_l=\\{W_{l,k}|\_{1 \le k \le K}\\}$はweightです。
ここでfunction hを$x_{l+1}$ を $h(x_l) = x_l$ とおいたものを**identity mapping**といいます。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/53220dd1-42b6-a0a0-6d66-d0c960de993c.png)

$h(x_l)=x_l$と置き換えると、下記のようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/f074786a-c1f1-79ba-74f6-9d73038f94f1.png)
更に、再帰的になっている部分を展開する下記のようになり、$x_L$は$x_l$と残差に関する項$\sum _{i=l}^{L-1} F$の和で表現されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/c4dd9308-d14f-10f1-0008-41472edb91d2.png)

通常のネットワーク構造の場合は、$x_0$に重みをどんどんかけていく構造($\prod _{i=0}^{L-1} W_ix_0$)になります。

さらにloss function $\cal E$の勾配は、下記のようになります。勾配はBack propagationに使用します。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/09f69e65-fb9b-f286-16ef-0af66280fd5d.png)

勾配は、$\frac{\partial \cal E}{\partial x_L}$と$\frac{\partial \cal E}{\partial x_L}(\frac{\partial}{\partial x_l}\sum _{i=l}^{L-1} F)$に分解されます。

この形は学習の時に問題となる勾配の消失が起こりづらい形になっています。

勾配が０になるには、$\frac{\partial}{\partial x_l}\sum _{i=l}^{L-1} F$が$-1$にならなければならないからです。

# On the Importance of Identity Skip Connections
$h(x_l)=\lambda_lx_l$とした場合

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/8ca01a15-d6c8-7eee-9c3a-b34ea858b6d6.png)

上記式を展開していくと下記のようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/04b3c067-5640-1547-800f-e4f46117fd61.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/5bfb37fd-836e-758f-63fd-ffd0e262e23b.png)

$\cal \hat F$は$\prod$以降の部分を置き換えたものです。

さらに勾配は下記のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/b05695cf-2462-61b4-2418-3980cc24795c.png)

もし仮にすべてのiにおいて$\lambda_i > 1$ならば、$\prod_{i=l}^{L-1} \lambda_i$が指数的に大きくなります。
逆にすべてのiにおいて$\lambda_i < 1$ならば、$\prod_{i=l}^{L-1} \lambda_i$は指数的に小さくなります。
後の実験でもこのような構造は最適化が難しいことが示されています。

# Experiments on Skip Connections
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/49e08362-f910-d434-60a6-3c754375bbf7.png)

上記６つの構成で実験を行った結果が下記になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/022fb7cc-4586-cb2f-ea0e-843d8e5592b7.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/702c6c38-684a-49c5-cf4f-876deb9a55ca.png)


## (b)Constant Scaling
**Constant Scaling**は２つのPathを$\lambda$および$1-\lambda$でScalingしたものになります。
このタイプは学習の収束が難しく、成功した場合でも性能がかなり悪くなっています。(Table 1, 12.35%)

## (c)Exclusive gating
**Exclusive gating**では、**gating function** $g(x)=\sigma(W_gx+b_g)$で入力と残差の加算を制御しています。
また加算する場合は各値にかける重みの和が１になるようにしています。
この構造の場合にbias $b_g$の初期値が重要になります。そのためcross validationによってbiasの初期値を決めています。結果としてはbiasは−６がbestな値でしたが、性能はもともとのResNetより悪くなっています。

## (d)Shortcut-only gating
**Shortcut-only gating**も**gating function**により制御していますが、制御は入力のみになっています。そのため入力と残差にかけられる重みの和は１になりません。こちらも同様にbiasの初期値が重要になります。biasの初期値が-6の時は、$1-g(x)$の値が1に近くなり、**identity mapping**に近づくため元々の**ResNet**の性能と近い値になっています。

## (e) 1x1 convolutional shortcut
**1x1 convolutional shortcut**は、入力のPathに**1x1 convolution**を入れたものです。この構成は先の論文に記載されているもので、34-layerのResNetで、良い性能が出ていました。構成をよりDeepにすると性能が12.22%と悪くなっています。
1x1 convolutional shortcutはparameterが増えてnetwork自体の表現能力が高くなっていますが、逆にoptimizationが難しくなっているためのようです。

## (f) Dropout shortcut
**Dropout shortcut**は入力の接続を確率的にon/offするものです。（DropConnectと言ったほうがいい？）
Dropoutの確率は0.5にしています。これは結局Scale $\lambda$の期待値を0.5にしたのと同じことになるので、学習は収束しませんでした。

# On the Usage of Activation Functions
ここでは、各Pathの構成を変えて比較実験を行っています。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/6b36a072-e79a-f58b-dab5-00dda36df4c9.png)

性能は下記の通りです。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/6d499c77-a5d4-f88a-f6a9-c46274b962c9.png)

## BN after addition
**残差**のPathの最後にあったBNを加算後に持ってきたものです。もともとのResNetより性能が劣化しています。

## ReLU before addition
加算後にあったReLUを残差のPathの最後に持ってきたものです。こちらも性能が悪くなっています。残差Pathの最後にReLUを入れると残差がプラスの値しか取らなくなるためのようです。

## Post-activation or pre-activation
こちらは、通常最後に入っているReLUの出力は、次の**Residual Units**の入力のPathと残差のPathに伝播します。これを片側だけ（asymmetric)にしたものです。
論文では、出力を次の**Residual Units**に伝えるときに片側にReLUを入れるのと(post-activation)、入力Pathと残差Pathにわかれた後に残差Pathの先頭にReLUを入れる(pre-activation)のは同じだから、その差は気にしないと書いてあります。
その説明が下の図です。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/9b85e2b7-35f0-d0de-87e9-653585ed8227.png)

## full pre-activation
**pre-activation**の最初にBNを入れて、残差Pathの最後のBNをやめたものです。
この構成が一番性能がよく、さらにもともとのResNetよりも良くなっています。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/e48ff674-4a27-ee7b-16b5-61c47dc1ac28.png)

# Analysis
**pre-activation**の解析です。

## Ease of optimization
**full pre-activation**ともともとのResNetの比較を行っています。
BNとReLUを入れることで、学習の収束が速くなっています。黄色が従来、青が**pre-activation**です。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/f0668a3e-8ec1-8e6b-2dae-ac3c71a0643a.png)

## Reducing overfitting
**training loss** が**test loss**に比べて高くなっています。下のグラフの右側。これはResNet-110, ResNet-164でも観測されています。
これは多分Batch Normalizationの影響と思われるということだそうです。
pre-activationの場合は最初に入っているので、Normalizationされたものが残差Pathの入力となります。
従来の場合は残差の最後にNormalizationが入っていて、そのあとに入力のPathと加算されるので、Normalizationされていないものが残差の入力となっています。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/3aa345b7-f33e-d82b-d7e9-928279fca525.png)

# CIFAR-10/100での比較結果
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/ed24551d-1364-ae7c-9338-d28491877012.png)

## ImageNetでの比較結果
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/5a63653d-fa0e-75bd-2b19-131a879337f2.png)

実験Parameterに関しては論文に書いてあるとおりです。
結論としてはResNet-200 + pre-activationが一番性能が良いです。

# 感想
ResNetの著者がidentity mappingに関して考察したものです。結局入力のPathはCleanに保ちつつ、残差Pathの先頭にBNを入れて入力Rangeを保つのがいいようです。性能を良くしようと複雑なことをすると、ネットワーク自体の表現能力はあがりますが、最適化がむずかしくなるというトレードオフがあるので、とくに入力Pathには余計なことはしないのがいいということでしょうか？