速度特化の軽量CNNであるFasterNet (CVPR'23) の解説

実行時間レベルでとても速いCNNである[FasterNet (CVPR'23)](https://arxiv.org/abs/2303.03667)について解説する。

# 目次
1. [概要](#概要)
2. [背景](#背景)
3. [（提案手法）FasterNet](#提案手法fasternet)
4. [Experiments](#experiments)
5. [まとめ](#まとめ)




# 概要
SOTA級の高速・軽量なCNNらよりも、優れた実行時間・精度カーブを実現するFasterNetが提案された。（Latency=実行時間）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261709/7d1049bd-6d63-b62c-d946-0f53ecb3e82c.png)


# 背景
### 従来の高速CNNで使われるDWConvの問題
高速・軽量を謳うCNNの多くではdepthwise convolution (DWConv) が採用されている。しかし、DWConvは通常Convに比べて計算量を大幅に低減できるのだが、メモリアクセス性能が低いことで計算速度が十分に上がらない傾向にある。そこでこの論文では、計算量が少なくかつメモリアクセス性能も高いpartial convolution (PConv)を提案し、さらなる速度向上を実現している。
ちなみに、DWConvのメモリアクセス性能の低さの原因としては、同じチャネルを使い回さないことによるメモリアクセス効率の低下や、性能低下をカバーするために使われるpointwise convolution (PWConv)と組み合わせた際のチャネル数の増加（Inverted bottleneck構造）が理由として挙げられる。

### ［前提知識］実行時間（Latency）・計算量（FLOPs）・計算速度（FLOPS）の関係
CNNにおける実行時間(Latency)・計算量（FLOPs）・計算速度（FLOPS）は、時間・距離・速さと同じ関係性を持つので、以下の式で表現される。
$Latency = \frac{FLOPs}{FLOPS}$
これらの内でLatencyとFLOPSは、モデルに実際に入力データを与えることで算出可能であり、残るFLOPSは上式にそれらの値を代入することで計算できる。（Latency算出には推論の開始時刻と終了時刻の差を取り、FLOPS算出には実際の計算回数をカウントする）



# （提案手法）FasterNet
FasterNetは、以下の図に示すように高速に設計されたPartial convolution (PConv)から成るFasterNet Blockで構成されている。
以降では、それらについて順に説明していく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261709/70d2a162-7889-6b40-581f-3a92ee49bc45.png)


### Partial Convolution (PConv)
FasterNetでは、メモリアクセスに負担のかからない形でconvolutionの軽量化を実現するPConv (Partial Convolution) を提案している。
PConvの構造は極めて簡単である。以下の図に示すように、大部分のチャネルはそのまま何もせず（idnedity処理）、一部のチャネルに絞って通常のconvolutionを行う、それだけである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261709/d1657f82-fff3-1661-b1cb-7ce91e804c93.png)
実験では、PConvでconvolution対象のチャネル数$c_p$は元のチャネル数$c$の1/4としている。計算量はチャネル数の2乗に比例するため1/16となり、DWConvの計算量削減率である1/$c$（大抵は$c$ >> 16）には及ばないものの、かなりの削減ができている。加えて、PConvは通常Convを使用しているため上述したメモリアクセス性能の低下がほぼ発生しない。このように、DWConvと比べて計算量が少々多くなる一方で、メモリアクセス性能は高い水準を維持できているため、結果としてPConvはDWConvよりも高速なconvolutionを実現する。


### FasterNet Block
PConv単体では大部分のチャネルにアクセスしないため、後段で全チャネルをconvolutionしてそこをカバーする必要がある。そのためFasterNetブロックは、PConv後に2段のPWConv（Inverted bottleneck風）を連結したresidual構造を採用している。（このinverted風な構造にした理由は論文で説明されていない‥）
また、軽量化のために正規化層は1段目のPWConv直後にBN層を1個置くだけに留めている。（最適化でconv層と結合できるのでBNを採用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261709/9c6cd173-5c53-12af-c9d5-3d43c40a03eb.png)
受容野を広げているとこがPConvの一部のチャネルだけだと性能が心配になる人がいるかもしれないので、2点補足する。
①下図は学習済みResNet18の各ステージで、3x3カーネル上のどの位置（1が左上、5が中央、9が右下）が最重要だったかを分布で示している。最重要位置が中央(=5)に集中しており、中央のみを処理するPWConvと周囲を少々処理するPConvで十分対応できそうである。
②大部分をidentity処理しても十分な性能が出せることはGhostNet (CVPR'20)が実証済みである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261709/3ee6094d-2b43-e502-b409-a8cddf29fd3d.png)

### FasterNetの全体構造
最終的なFasterNetの構造は下図（再掲）になる。
最初に`Embedding`（Patch化）層があり、以降で`FasterNet Block`と`Merging`（Downsampling処理）を交互に通していき、最後は`GAP` + `FC層`で締めるという標準的な構成を取っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261709/70d2a162-7889-6b40-581f-3a92ee49bc45.png)

# Experiments
### Classificationタスク (ImageNet-1k)
下図はNVIDIA GPU, Intel CPU, ARM CPUの3つの環境において、各SOTA級モデルとそれらの各サイズで、それぞれ`Latency`（実行時間）・`Accuracy`（精度）のカーブを比較したグラフである。（NVIDIA GPUだけは`Latency`でなく32 batch入力での`Throughput`となっている。逆数取ればほぼ同じ）
どの環境においてもFasterNetが他手法に比べて優秀な`Latency`・`Accuracy`カーブを実現できており、速度面においてFasterNetはSOTAを達成した。（ちなみに、モデルサイズは高速・軽量なCNNの中では標準的）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261709/de92bee6-d5be-5a6b-fd76-1fb852ad1121.png)


### Object detection / Instance segmentationタスク (COCO)
Mask R-CNN + FasterNetで代表的なモデル（モデルサイズ別）と対決した結果が下表である。どのサイズにおいても、ほぼ同等の精度の基で最小の`Latency`を出せている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261709/7c9ff623-e462-a94a-0f9e-f909846ad651.png)


# まとめ
DWConvを上回る高速化手法であるPConvを提案し、PConvベースのFasterNetでSOTA級モデルらを上回る実行時間・精度カーブを達成した。