ESPNetv2:A Light-weight, Power Efficient, and General purpose Convolutional Neural Networkを読んだまとめ

CVPR2019で発表されたESPNetv2の論文を読んだので、その内容について自分用にまとめておく
#本論文に関して
プログラムを書くことが容易になったことやGPUの計算能力の向上など伴い、深層畳み込みニューラルネット(CNNs)分野の発展が著しい。CNNsを利用した様々なアプリケーションの開発が進んでいるが、現実世界で有用なアプリケーション（例えば自動運転やロボットへの応用）はリソースが制限されたエッジデバイスにおける低遅延処理を要求する。しかしながら、現存するCNNの技術に基づいたシステムはメモリや電力などを含んだ膨大なコンピュータリソースを要求する。
こうした問題の解決に向けて、本論文では軽量で電力効率が優れた汎用的なタスクに応用可能な畳み込みニューラルネットの紹介を行っている。

#ESSPモジュールに関して
ESPNetv2を構成する主なモジュールとしてESSPがある。このESSPモジュールはESPNetにおけるESPモジュールを改善したものである。
ちなみに、ESPNetもESPNetv2と同様にCNNsの効率性を上昇させることを目的としたネットワークである。

順を追って説明する。
下図の(a)は元となるESPモジュールである。このESPモジュールに改良を加えていく。

まず、ESPモジュールを計算効率を向上させることを目的としてESPモジュールのpoint-wise convolutions(図(a)内　Conv-1の部分）をgroup point-wise convolutionに置き換える。そして、ESPモジュール内の計算負荷が大きい$3 \times 3$ dilated convolution(図(a)内 DConv-3の部分）を計算負荷が小さいdepth-wise dilated separable convolutionに置き換える。depth-wise畳み込みを適用することで、標準の畳み込みと比較して必要なパラメータ数を入力のチャンネル数の逆数倍まで減少させることができる。depth-wise畳み込みでは、パラメータ数を減らすことができる一方でチャンネル間の関係については考慮できていないので、point-wise畳み込みが施されている(図(b)内　Add下のConv-1の部分)。これらの改良を加えた結果が図(b)のESSP-Aモジュールである。

さらにESSP-Aモジュールに改良を加える。ESSP-Aモジュールでは、depth-wise dilated separable convolutionを行ったそれぞれの結果に対して独立したpoint-wise convolutionを行っている。(図(b)内 Conv-1の部分）この部分を一回のgroup convolutionに置き換える（図(c)内　Add上のGConv-1の部分）ことで必要なカーネル数を１つにまとめ、パラメータ数を減少させることができる。

以上の改良を施した結果が図(c)のESSPモジュールである。
このように、ESSPモジュールはESPモジュールの計算効率向上を目的としてパラメータ数を極力減らすことに主眼をおいて改良を重ねた結果である。



<img width="937" alt="スクリーンショット 2020-07-27 14.17.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656379/8154120a-f237-d60f-2f37-a8d82e2d0d25.png">
<div style = "text-align:center;">
図１ESPNetおよびESPNetv2の主要モジュール[1]
</div>
Conv-n: $n \times n$ standard convolution
GConv: $n \times n$ group convolution
DConv-n: $n \times n$ dilated convolution
DDConv-n: $n \times n$ depth-wise dilated convolution
noted by (# input channels, # output channels, and dilation rate)
#Strided ESSPモジュールに関して
学習の効率性を上昇させることを目的として、ESSPモジュールに改良を加えたStrided ESSPモジュールもESPNetv2のアーキテクチャに組み込まれている。
Strided ESSPでは、ESSPに以下の３つの改良を加えている。
######1. ESSPのdepth-wise dilated convolutionがストライド２のdepth-wise dilated convolutionに置き換えられている。
######2. ESSPにおける単純な入力の加算に対して平均プーリングが行われている。
######3. 要素方向の加算が結合に置き換えられている。

また、ダウンサンプリングと畳み込み操作の間に入力の空間情報が失われてしまう影響を軽減することを目的として入力画像とダウンサンプリングユニットの間にlong-range shortcut connection（下図の赤線部分）が加えられている。このshortcut connectionでは下図に示す通り、まず入力画像がダウンサンプリングされた特徴マップと同じサイズになるまで繰り返し平均プーリングされる。その後、２度の畳み込み操作を介している。
<div align = "center">
<img alt="スクリーンショット 2020-07-27 14.18.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656379/c195a7c5-ffe4-0246-3ea0-7aec565355fb.png">
</div>
<div style = "text-align:center;">
図２ Strided ESSPモジュール[1]
</div>
#学習率に関して
学習率についても工夫がなされている。
学習率の設定は学習効率に大きく関わる。理想的な学習率αが存在するとした場合、αよりも大きな学習率を使用すると粗い学習が行われる為、パラメータが厳密な最適解に到達することは難しい。一方でαよりも小さな学習率を設定した場合には最適解にたどり着くまで多くの時間を要するので非効率である。このように、機械学習における学習率の設定は重要な問題の１つである。

効率的な学習率の設定に関する多くの研究が行われており、今回紹介する論文はSGDRという学習率の設定方法を参考にしている。
SGDRはエポック毎に、コサイン波の減少部分を利用することで学習率を減少させている。また、Warm Restartといって一定のエポック毎に学習率を最初の学習率まで戻すということを行っている。これにより、学習率が小さい場合と大きい場合の欠点を補いながら学習を行うことができる。

今回の論文ではコサイン波は利用せずに、一定のエポック毎(５エポック）に下図のような周期性を持たせている。
<div align = "center">
<img alt="スクリーンショット 2020-07-27 14.20.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656379/0d6bb07c-9e29-381d-b4be-56ba50cddc3b.png">
</div>
<div style = "text-align:cener;">
図３　学習率の周期性[1]
</div>

具体的にはエポック$t$における学習率は以下の式で制御される。
$$\eta_t = \eta_{max} - (t mod T) ・ \eta_{min}$$
ここで、$\eta_{max}$と$\eta_{min}$は学習率の上限と下限であり、$T$は周期である。

また、本論文では300epochsで学習を行っており、epoch数を重ねるにしたがってより細かな学習を可能にするため、{50, 100, 130, 160, 190, 220, 250, 280}のepochインターバル毎に学習率の範囲を半分にしている。

#ESPNetv2のアーキテクチャに関して
ここまで紹介したESSPモジュールやStrided ESSPモジュールを中心にESPNetv2は構成されている。
論文内にlayerの要素や出力チャンネル数を変化させた際の積和計算量について記されていたので、表を掲載しておく。
<div style = "text-aling:center;">
表１　ESPNetv2のアーキテクチャ[1]
</div>
<img width="776" alt="スクリーンショット 2020-07-27 14.18.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656379/33138e4a-5fbf-a78e-b04d-b12f8ca2e137.png">

#クラス分類の結果に関して
本論文では、ESPNetv2の有効性を示すために、(1)object classification(2)semantic segmentation(3)object detection(4)language modelingの４つのタスクを行っている。今回はその中で１つ目のクラス分類の結果を紹介する。

データセット:ImageNet(1000-way classification that contains 1.28M images)
実験環境：Pytorch deep learning framework with CUDA 9.0

結果ではtop-1 accuracyとFLOPsの観点で最先端のネットワーク（ShuffleNet, MobileNet)と比較している。top-1 accuracyとはネットワークによって画像のクラス分類を行った際の出力結果の１番大きな出力が正解ラベルと適合している場合にのみ正解とした場合の分類精度である。FLOPsはネットワークで入力から出力を出すまでの積和演算操作の回数を呼ぶ。

下図を見ると、ESPNetv2が従来の先端ネットワークよりも小さなFLOPsで高いtop-1 accuracyを示している様子が分かる。
<img width="951" alt="スクリーンショット 2020-07-27 14.19.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656379/55e8988e-f1a2-4af1-6258-34c57920ec91.png">
<div style = "text-align:center";>
図４　ESPNetv2のクラス分類結果[1]
</div>
#まとめ
ESPNetv2の主要モジュールや学習方法等についてここまで書きました。
今後、CNNsを応用したアプリケーションで必要となるであろう軽量化に焦点を当てて、様々な学習パラメータ数や積和演算回数を極力減少させつつも精度を維持するという課題に取り組んだ論文でした。
実際にクラス分類結果だけを見ても、最先端のアーキテクチャよりも高い精度を軽量なネットワークで実現できていたのでCVPRで採択されたのかなと思います。
ESPNetv2内の各モジュールについての説明は論文内でされていましたが、全体のアーキテクチャの組み立ての根拠について言及されていなかったので、どういう理論に基づいて全体のアーキテクチャが構成されているのか知りたかったです。この部分については引き続き勉強をして理解できれば良いかなといった感じです。

機械学習を学びたての身なのでこんなにも畳み込み操作だけで種類があるのかと戸惑う一方で多くの手法の利点を知ることができて良かったです。
#Refference
[1][ESPNetv2:A Light-weight, Power Efficient, and General purpose Convolutional Neural Network](https://arxiv.org/abs/1811.11431)
[2][ESPNet:Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation](https://arxiv.org/abs/1803.06815)
[3][SGDR:STOCHASTIC GRADIENT DESCENT WITH WARM RESTARTS](https://arxiv.org/abs/1608.03983)