Pynote

Python、機械学習、画像処理について

Deep Learning - ResNet の仕組みについて

概要

画像認識のコンテスト ILSVRC 2015 にて、top5 error rate で3.57%を記録し、優勝した CNN ネットワークモデルである。
下記、2論文に基づいて紹介する。

ResNet が考案された背景

CNN が画像認識分野でブレイクスルーを起こしてから、層を深くすることで精度向上が図られてきた。
一方、層を深くした影響で、勾配消失問題、劣化問題が発生し、学習が難しくなる問題が生じた。
勾配消失問題は様々なアプローチで取り組まれていたので、もうひとつの degradation 問題に着目し、深い層でも学習が行えるネットワークアーキテクチャとして ResNet が考案された。

劣化問題

劣化問題 (degradation problem) とは、層が深いモデルの学習において、訓練誤差の改善が層が浅いモデルより早い段階で頭打ちになる現象である。

層が浅いモデルとそのモデルに何層か追加した層が深いモデルの2つがあるとする。
層が深いモデルは浅いモデルより訓練誤差が同等か改善するはずである。
なぜなら、層が深いモデルは関数 F は層が浅いモデルと同じに、追加した関数 GG(x) = x と恒等写像となるように学習すれば、浅いモデルと同じ関数を学習できるからである。

上図は18層のモデル及び34層のモデルの学習時の訓練誤差、テスト誤差の推移である。(細線が訓練誤差、太線がテスト誤差)
18層より34層のモデルのほうが、訓練誤差の改善が期待できるが、結果は層を深くした34層のモデルのほうが訓練誤差が劣化している。
訓練誤差の問題のため、過学習が原因ではない。

residual network

図は左が従来のネットワーク (plain network)、右がこれから紹介する residual network の一部を表したものである。

F(\boldsymbol{x}) = \boldsymbol{x} と恒等写像を学習するのが最適であった場合を考える。
左では、非線形関数 F のパラメータ \boldsymbol{w} を調整し、恒等写像を学習する必要があるが、これが難しいため劣化問題が起こるのではないかと論文では推察している。
そのため、右のように shortcut connection という迂回路を追加し、F(\boldsymbol{x}) + \boldsymbol{x} を出力とした。
こうした場合、恒等写像を学習するには F(\boldsymbol{x}) = \boldsymbol{0}、つまりパラメータを \boldsymbol{w} = \boldsymbol{0} になるよう学習すればよいので前者に比べ、学習がより簡単になる。
図の右の何層かの畳み込み層と shortcut connection から成るブロックを residual block という。この residual block を複数重ねたネットワークが residual network である。

上図は18層のモデル及び34層の residual network の学習時の訓練誤差、テスト誤差の推移である。(細線が訓練誤差、太線がテスト誤差)
18層より34層のモデルのほうが、訓練誤差、テスト誤差が改善していることが確認できる。

ResNet

ネットワーク構成

ResNet-18, ResNet-34, ResNet-50, ResNet-101, ResNet-152 の5種類が提案されている。

いずれも上記の構成になっており、conv2_x, conv3_x, conv4_x, conv5_x の部分は residual block を以下で示すパラメータに従い、重ねたものとなっている。


shortcut connection

residual block の最後で F(x) と shortcut connection を通ってきた値 x を足し合わせるため、形状を一致させる必要がある。
F(x)x の形状が異なる場合は、ゼロパディングまたは線形変換 W_s \boldsymbol{x} で形状を一致させる。

論文では、以下の3パターンを実験した。

  • A: F(x)x の形状が異なる場合のみ、ゼロパディングを行う。
  • B: F(x)x の形状が異なる場合のみ、線形変換 W_s x、同じ場合は x とする。
  • C: 常に線形変換 W_s x を行う。

結果は A < B < C の順に性能がよいことがわかった。
B と C は僅差であり、計算量は C のほうが多くなってしまうので、論文では B を採用した。

residual block

residual block の F(x) は通常2, 3層の畳み込み層で構成されるが、それ以上でもよい。
1層の場合、plain network と変わらなくなってしまうため、shortcut connection の利点がなくなる。

論文では、以下の2パターンを採用した。

  • building block: 3x3 の2つの畳み込み層で構成。ResNet-18、ResNet-34 の residual block として使用。
  • bottleneck building block: 1x1、3x3、1x1 の3つの畳み込み層で構成。ResNet-50、ResNet-101、ResNet-152 の residual block として使用。


実装

Keras での実装例をこちらで紹介した。

pynote.hatenablog.com