深層学習メモ:代表的なCNNアーキテクチャの流れ

ここでは、代表的なCNNのアーキテクチャの進化の流れについて記す。

AlexNet

2012年のILSVRCにおいて、他のアーキテクチャに圧倒的な差をつけて優勝し、深層学習モデルのブームの端緒になったモデル。
f:id:tibet:20220115215211p:plain
引用元:"ImageNet Classification with Deep Convolutional Neural Networks"
全体としては、畳み込み層を5層積み、間にmax poolingをはさみ、最後に全結合層を3層積んで出力を得る。

最適化は、weight decayとモーメンタム付きの確率的勾配降下法で行われている。エラーレートが改善しなくなった時点で、学習率は1/10にしている。

アーキテクチャの特徴としては以下である。

ReLu

勾配消失問題を回避するため、活性化関数としてReLuを使用している。

Local Response Normalization

空間的に同じ位置にある隣接したカーネルマップの出力の値から自身の出力を正規化する手法。近年ではあまり使われていない

Overlapping Pooling

AlexNetでは、Max poolingを用いているが、集約するピクセル領域をわずかにオーバーラップしたものを使用している。

DropOut

DropOutは、学習時に一定の割合でランダムに中間層を外す手法である。過学習を押さえて、より汎化したモデルを作成することが出来る。

ZFnet

2013年の"Visualizing and Understanding Convolutional Networks"で提案されたネットワーク。
CNNの可視化を行ったうえで、AlexNetの次の課題を解決するアプローチをとった。
・第一層のフィルタは極端に高い周波数と低い周波数の情報で成り立っており、その中間の周波数情報がほとんどない。
・第二層の可視化からは、第一層の畳み込みで使用されている4という大きなストライドによって、エイリアシングが発生している。

そこで、この問題を解決するために、下記のアプローチをとった。
1.第一層のフィルタサイズを11×11から7×7に変更
2.ストライドを4から2に変えた。
その結果、AlexNetを超えるパフォーマンスを示した。
アーキテクチャは下記に示すとおりである。
f:id:tibet:20220117090425p:plain

GoogLeNet

2015年のCVPRの"Going Deeper with Convolutions"で提案されたアーキテクチャで、2014年のILSVRCの優勝モデルである。
このモデルの特徴は以下である。

Inception module

Inceptionアーキテクチャの主な考え方は、畳み込みビジョンネットワークの最適な局所スパース構造を、容易に利用できる密なコンポーネントでどのように近似し、カバーできるかを見つけることに基づいている。
具体的には複数の畳み込み層やpooling層から構成されるinception moduleと呼ばれるマイクロネットワークを定義し、これを積み重ねることで一つの大きなCNNを作り上げている。
f:id:tibet:20220117091647p:plain
インセプションモジュールでは、ネットワークを分岐させてサイズの異なる畳み込みを行った後、それらの出力をつなぎ合わせるという処理を行っている。異なるサイズの畳み込みを独立して行っているため、非0のパラメータ数が大きく減ることになる。
(a)のナイーブバージョンのinception moduleはmax poolingを除くと、5×5の畳み込み一つで表現することもできるが、inception moduleを利用することで、はるかに少ないパラメータで同等の表現能力を持つCNNを構築することが出来る。
また、(b)では1×1の畳み込み層を挿入することで、次元削減を行い、さらにパラメータを削減している。

Global Average Pooling(GAP)

従来のモデルでは、畳み込み層の後に全結合層を積むことによって、出力を得る構造になっていたが、この全結合層はパラメータが多く、過学習を起こすことが問題となっていた。

GAPでは、チャネルにわたってaverage poolingをする(すなわち出力は1×1×チャネル数のテンソルとなる)。
GoogLeNetではCNNの畳み込み層の後、全結合層を利用することなくGAPを採用することで最終的な出力を得ることを提案している。
そのため、パラメータ数を大きく削減し、過学習を防ぐことが出来る。

Auxilirary Loss

GoogLeNetの全体像を下記に示す。
出典:
https://arxiv.org/pdf/1409.4842.pdf
f:id:tibet:20220117093527p:plain
途中で分岐しているが、このサブネットワークでもクラス分類をしており、Auxiliary Lossを追加することが行われている。
これにより、ネットワークの中間層に直接誤差を伝搬させることで、勾配消失を防ぐとともにネットワークの正則化を実現している。
Auxiliary Lossを導入することで計算量を抑えることは期待できないが、アンサンブル学習と同様な効果を得られるため、汎化性能の向上は期待できる。

VGGNet

2014年のILSVRCで2位の認識精度を達成したモデルである。
2015年にVery Deep Convolutional Networks for Large-Scale Image RecognitionとしてCVPRにて発表された。

この論文では、CNNの深さがどのように性能に影響するかを研究するため、下記のようなアーキテクチャの設計方針をとった。
・3×3の畳み込みのみを利用する
・同一出力チャネル数の畳み込み層をいくつか重ねた後にmax poolingによる特徴マップを半分に縮小
・max poolingの後の畳み込み層の出力チャネル数を2倍に増加。

この方針でCNNの深さを増加させていくと、コンスタントに精度が改善した。

AlexnetやZFNetで使用されていたLRNは、VGGnetのような深いネットワークではあまり効果がないため、利用されていない。

ResNet

Resiual Networks(ResNet)は、2015年のILSVRCの優勝モデルである。その後、2015年のCVPRでDeep Residual Learning for Image Recognitionとして発表された。
ResNetでは、処理ブロックをショートカットして入力を次段に渡すResidualモジュールを採用したことが特徴である。これによって、誤差逆伝搬時にも勾配が直接下層に伝わっていくことになり、非常に深いネットワークにおいても効率的に学習できるようになった。

Residual module

下記がResidual Moduleのビルディングブロックである。
出典:
https://arxiv.org/pdf/1512.03385.pdf
f:id:tibet:20220117133914p:plain
入力を処理ブロックF(x)への入力経路とスキップして次段に直接入力する経路に分けるため、次段への入力は下記のようになる。
 H(x)=F(x)+x
このような構造をIdentity Mappingとも呼ぶ。
f:id:tibet:20220117134928p:plain
上記の左側は、実際に使われているresidual moduleの構造で、出力チャネル64の3×3の畳み込み層が2つ配置されている。
正確にはBatch nomalizationとReLuが配置されている。
右側はbottleneckと呼ばれるもので、1×1の畳み込みで次元削減を行った後に3×3の畳み込みを行い、その後さらに1×1の畳み込みで次元を復元するという形をとることで左側と同等の計算量を保ちながら、より深いモデルを構築することが出来る。

Batch Nomalization

深いネットワークでは、ある層のパラメータ更新によって、その次の層の入力の分布が
バッチごとに大きく変化してい住まう内部共変量シフトが発生し、学習が進まない問題があった。Batch nomalizationでは、この内部共変量シフトを正規化して各レイヤが独立して学習が行えるようにすることで、学習を安定化・高速化する。

Heの初期化

重みの初期化について、ReLuを活性化関数として利用する場合の適切なスケーリングを理論的に導出した。

SENet

Squeeze-and-Excitation Networks(SENet)は2017年のILSVRCの優勝モデルである。
2018年のCVPRにてSqueeze-and-Excitation Networksとして発表された。
特徴は、特徴マップをチャネルごとに適応的に重みづけをするAttentionの機構を導入したことである。これは、SE(Squeeze-Exitation) Blockで実現されている。

SE Block

出典:
https://arxiv.org/pdf/1709.01507.pdf
f:id:tibet:20220117142400p:plain
上記がSE Blockの概念図である。
SE BlockはSqueezeステップとExcitationステップの2段階が行われる。
Squeezeステップではチャネル依存性に取り組むために、グローバルな空間情報をチャネル記述子に”絞り込む"(squeeze)。
具体的には、H×W×Cの特徴マップに対してGlobal Average pooling1を適用する。
次にexitationステップでは、チャネルごとの依存関係を抽出するために、1×1の畳み込みを適用し、ReLuと再度出力チャネル数Cの1×1の畳み込みを経て最後にシグモイド関数を適用し、チャネルごとの重みを出力する。










\*yu4u氏の畳み込みニューラルネットワークの最新研究動向 (〜2017)を参考に自身の勉強のために書いています。