CNN+ViTモデルの傾向【サーベイ】






# 画像認識モデルの2強　CNN vs ViT
画像認識分野において，スタンダードとなる2つのベースモデルがある．それは，CNNとViT．
今回は，CNNとViTの違いと組み合わせモデルについて紹介する．


- **CNN**
    - カーネル範囲で特徴抽出
        - 局所的な認識に有効→エッジなどの低レベル特徴を認識
    - ImageNetで高精度化
        - 様々なタスクにおいて高性能

- **ViT**
    - 画像をパッチに分割し全体の関係性を捉える
        - 浅い層から受容野が広い→高レベル特徴を認識
    - 超大規模モデルで高精度
        - Transformerベースの可能性は無限大




# 形状
【CNNとViTはテクスチャ重視？形状重視?】https://qiita.com/wakayama_90b/items/e2c9f5e65aec08ffc122

CNNとViTのモデル構造は全く異なるため，それぞれの持つ認識特性も異なる．異なる認識特性を可視化するために，下図の画像を「猫」か「象」と答えるかで分析する．「象」と答えたモデルは認識対象のテクスチャを捉え，「猫」と答えたモデルは認識対象の形状を捉えることになる．分析結果として，CNNは「象」，ViTは「猫」，人は「猫」の結果になった．この結果から，局所的な認識のCNNはテクスチャに依存し，大局的な認識のViTは形状に依存することが分かる．

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/bd54bfa5-c1b6-4c70-4cc4-5f943173fdd6.png">


# ノイズ
【CNNとViTノイズへの頑健性について】https://qiita.com/wakayama_90b/items/a9b931c8cfff990c542a

CNNとViTは認識特性が異なるため，認識する画像によって得意不得意な画像がある．
分析の結果，CNNは高周波を認識，ViTは低周波を認識する特性がある．そのため，画像全体に高周波ノイズを付与した場合，高周波認識を行うCNNに影響があり，精度を低下させる．反対に，低周波ノイズを付与した場合は，ViTの精度が低下する．下図は縦軸に分類精度，横軸で右にいくほど高周波のノイズを付与していることを示す．CNNとViTは認識特性の違いから，ノイズの強さ特性も異なる．


<img width="400" alt="a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/b456ccaa-e228-edbb-5584-ace5167ac30a.png">


また，画像に自然ノイズ，敵対攻撃などを加えノイズへの頑健性を調査した．結果として，有効なモデルがあるわけでななく，引き分けの結果である．




# ViTの問題点

ViTの大きな問題点として以下の3点がある．これらを解決するように派生モデルが誕生する．
ネタバレ→**解決策の1つとしてViTの構造にCNNアーキテクチャを導入する．**
- 計算量が膨大
    - 入力特徴量を畳み込みによりダウンサンプリング
    - キー，バリューをダウンサンプリング
    - SAの計算範囲を制限
- 細かい認識が苦手
    - CNNの持つ局所的な認識能力を獲得
- ViTはImageNetで精度向上しない
    - CNNの持つ「近い画素は関係が深い」バイアスを獲得





## ViTはImageNetで精度向上しない
ViTの問題点の1つとして，JFT-300Mで学習した場合に精度向上するが，ImageNetで精度向上しない問題点がある．実社会にViTを導入する場合，3億枚の画像を保有するJFT-300Mを用意することは，現実的ではない．データセットが小さくても有効なモデルが理想である．
そこで，JFT-300Mで学習したViTと，ImageNetで学習したViTの違いを調査した．下図に各ViTのAttention weightと平均距離を示す．FT-300MのViTは浅い層に局所的な認識，深い層に大局的な認識をする．一方，ImageNetのViTは大局的な認識のみである．ImageNetで精度向上していない原因は浅い層で局所的な認識ができていないことと考える．これを解決するために，ViTのモデル構造を改良し，局所的な認識ができるViTを実現しようとする．具体的な方法として，CNNを導入するかSAの計算範囲を制限する．

<img width="800" alt="a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/9c7e1dd3-24fe-f23c-8246-808e3fc9ad32.png">


また，学習によってロスが最も小さくなるような重みパラメータを探索する（局所的最小値に坂を使ってボールが転がり落ちるような表現）．下図は，そのロス関数を3Dに可視化したもので，ResNetは凸損失，ViTは非凸損失である．非凸損失はデータの頑健性が高いメリットがあり，ボールを落とす速度のように損失を小さくするためのスピードが遅く，大規模な学習と平滑化手法で問題を解決する．
Loss landscape visualizationsはViTのような非凸損失になることを目指しているが，ViTには負のへシアン固有値がある問題点がある．


# CNN + ViTモデル
CNN + ViTモデルの先駆けとして，Hybrid ViTがある．Hybrid ViTはViTの原論文で紹介され，ResNetのステージ３までの認識を行い．その出力された特徴量をViTの入力とした．その結果，バニラのViTと比べて，少量のデータセットで精度向上した．
また，分析の結果から，VITの浅い層ではCNNの同じような特徴表現をしていることが分かった．この浅い層の局所的な認識をCNNにやってもらおうとする試みから，CNNの出力をViTの入力とする構造を採用するモデルは多い傾向にある．



<img width="400" alt="a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/d70f08de-4dda-1a13-34b8-d299c063feeb.png">






- **CNNの出力をViT<font color="yellow">**●**</font>**
    - 浅い層で局所的な認識→細かい認識
    - 特徴量のダウンサンプリング→計算量削減



- **キー，バリューをダウンサンプリング<font color="glearn">**●**</font>**
    - 計算量の削減
    - SAの出力はクエリのサイズに依存
    - ダウンサンプリングは畳み込み層でやらなくてもいい．poolingでも．なんでも

- **Transformer内にCNNの導入<font color="blue">**●**</font>**
    - 畳み込みとSAの認識特性を交互に獲得


- **SAの計算範囲を削減**<font color="red">**●**</font>
    - 計算量の削減
    - 局所的な認識をするSA


- **階層型**
    - ViTは浅い層から深い層までのパッチと受容野の変化がない
    - 階層型モデルはステージが上がるにつれてself-attentionの受容野とパッチの受容野が変化（広がる）
    






# モデル一覧
各モデルの解説リンクあります．

![ppaas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/4009b06c-da86-6859-0b48-9cdefed95c6d.png)

- Vision Transformerのしくみ
https://qiita.com/wakayama_90b/items/55bba80338615c7cce73

- パッチ特徴はConvで抽出するViT【Early Convolutions Help Transformers See Better】
https://qiita.com/wakayama_90b/items/616eeba23a9c615616d9

- ViTから近傍バイアスを追加【ConViT】
https://qiita.com/wakayama_90b/items/f5c760980e9ee153af25

- SA内に畳み込みやノルムや活性化関数を導入【LeViT】
https://qiita.com/wakayama_90b/items/74cde5eef9b5afc889ac

- Self-Attentionの受容野を制限【Swin】
https://qiita.com/wakayama_90b/items/8fcedaaae7c8f4d94abd




- CNNとViTのハイブリッドモデル【CoATNet】
https://qiita.com/wakayama_90b/items/0764d18a0ac9c0128fe2




- ViTのキーとバリューを小さくして計算量削減【PvT】
https://qiita.com/wakayama_90b/items/77c4c6857210b73e24b8

- ViTのキーとバリューを小さくするPVTの進化【PVTv2】
https://qiita.com/wakayama_90b/items/f3a48a2fb54db33614eb

- ViTのKとVをPyramid Poolingで計算量削減【P2T】
https://qiita.com/wakayama_90b/items/6b406229821ff742fe52

- ViTに局所的バイアスを持つCNNを追加【CeiT】
https://qiita.com/wakayama_90b/items/ce17e3007d559d24acb6

- 変形可能な受容野を使用したSelf Attention【DAT】
https://qiita.com/wakayama_90b/items/7a3b761e3c6b36851b45



- ローカルとグローバルの両方でSelf-AttentionするViT【MaxViT】
https://qiita.com/wakayama_90b/items/55ed634b4724fde3b43e


- ViTの線形射影を畳み込みに変更したら苦手克服！　【CvT】
https://qiita.com/wakayama_90b/items/a6b3b5ad92f6cc1d4367


- ViTにCNNをたくさん組み込んだモデル【CMT】
https://qiita.com/wakayama_90b/items/08af855b6435977d495e