ResNet論文を読んだメモ(arXiv:1512.03385)

今更ながらResNet論文を読んだメモ

概要

  • 深いネットワーク
    • 勾配消失や勾配爆発によって収束しない問題は、初期値の正規化や中間層の正規化によって解決しつつある
    • 一方、収束はするが訓練するのがある程度、層を深くするとerrorやaccuracyが悪化する問題がある
  • そこで効果的に学習が進むフレームワークを提案
    • residual functionsを学習する

f:id:yusuke_ujitoko:20170615193941p:plain:w300

  • 層を深くしてerrorが小さくなるのを確認した。

なぜうまく行くのか

なぜResidual Learningだと、うまく行くのかが良くわからなかった。
以下は推測(Sec3.1の記述がポイントっぽい)。

現実には層を深くしていくとerrorが悪化することが観測されている。

少ない層数である程度うまく行ったネットワークの後ろの層に、 層を追加してさらに精度を良くしていくことを考えると、 追加した層は細かい調整をする程度の役割を負えばよいので、 ほぼidentity mappingになっているのが望ましい。
そこで、identity mappingのパスと、そうでないconvを掛けるパスを用意することで、 identity mappingをとりやすくしたと推測.

Fig.7 の図を見る。

f:id:yusuke_ujitoko:20170615194024p:plain:w500

層ごとのレスポンスを検証したところ、 ResNetではplain netに比べて、レスポンスが後ろの層にいくごとに徐々に小さくなっていくことが示されている。

つまりResNetでは、各層が入力に関与する割合が、plainの場合と比べて小さくなっており、 微調整が効いているといえる?

層を増やしていくと、この傾向は更に強まり、一個一個の層のレスポンスは相対的に小さくなり、安定していくとみられる。

https://arxiv.org/abs/1603.05027も読んでみたが,結局うまくいく理由はよくわからなかった.
(追記) ResNetの分析で面白い論文を見つけた.

どの図もiterが3e4あたりでガクッとerrorが小さくなっている理由

f:id:yusuke_ujitoko:20170615194246p:plain

などの図を見ると,だいたい同じようなiterationで学習が一気に進んでいる.
3.4 Implementaionを見ると,

The learning rate starts from 0.1 and is divided by 10 when the error plateaus,

とあって,平坦になったら学習率を1/10にすることが書かれている. でもアーキテクチャが違ったときに,平坦になる速度が異なるアーキテクチャ間で同じになることなんてあり得ないと思う. 実験するときには決められたタイミングで学習率を小さくしているのだろう.

でもそうなると,その時点で最適化が進んでいるかいないかで, errorは大きく変わりそう. 例えば最適化があまり進んでいないのに,学習率が下げられてしまうと,学習が進まなくなってしまう. どうしてるんだろうか.

ResNetによるCIFAR-10分類を試してみた

4.2に記述されているアーキテクチャでCIFAR-10を分類してみた. learning rateは0.01からスタートして,3.2kと4.8k回目のミニバッチでそれぞれ0.1倍した.

f:id:yusuke_ujitoko:20170625151826p:plain

図にはResnet20と56しか載せていないがこれ以外も試したところ,層に深さに比例して学習の進みや精度は良かった.