---
# System prepended metadata

title: ViT and EfficientFormer
tags: ["Deep Learning\_", 交接任務]

---

# EfficientFormer

ViT：https://arxiv.org/abs/2010.11929

V1：https://arxiv.org/abs/2206.01191

V2：https://arxiv.org/abs/2212.08059

目的：Transformer 因為 Attention 機制和大量的參數，在 ViT 方面還沒有辦法做到像 MobileNet 即時辨識，在 Efficient Former 之前有許多研究結合 MobileNet 的 block 和 transformer 的實驗，但運算速度還是沒有很快。這篇 paper 提出一個可以即時運算的純 Transformer。

## ViT

![image](https://hackmd.io/_uploads/rkNZeu5kC.png)

將輸入的圖片切割成數個 Patches
假設原輸入圖片大小為 $H * W$，Patch 大小為 P
就會切出 $(H*W) / (P*P)$ 個 Patch
 
將這些 Patch 展平成向量後經過 Linear 映射

![image](https://hackmd.io/_uploads/Hy76DFqJR.png)

再加上 Position Embedding 一起送入 Transformer Encoder

另外，還會在 Linear projection 過後的序列開頭加上一個 learnable class token
一開始用隨機數初始化，在訓練過程中被更新，用來學習每個 patch 和目標的關聯性。

Encoder 結構基本與原文字處理 Transformer 相同
經過 Encoder 和全連接層 MLP Head (two layers with a GELU) 後輸出

## EfficientFormer

![image](https://hackmd.io/_uploads/Sk3rYYqk0.png)
從實驗中觀察到以下幾件事：
* Patch embedding is often implemented with a non-overlapping convolution layer that has large kernel size and stride，這可能造成在移動裝置上的速度瓶頸
* Multi head self attention (MHSA) 不一定是速度瓶頸，頻繁的 Reshaping 才是造成效率低落的元兇。對於 token mixer（pooling 或 MHSA）來說，一致的 dimension 很重要（要避免一直 reshape，pooling 和 MHSA 就不會有太大速度差異）
* Conv-BN 會比 LN 或 GN 來的有效率，且造成的準確率下降是可接受的。所以在 $MB^{4D}$ 都採用 Conv-BN；而 3D features 的地方跟原 ViT 的 MHSA 設計一樣都用 LN，達到更好的效果。
* 非線性的延遲取決於硬體及編譯器（在 iPhone 12 上測試，GeLU 與 ReLU 速度接近）。 In this work, we employ GeLU activations

4 stages：
![image](https://hackmd.io/_uploads/Bk1s4Y91C.png)

## EfficientFormerV2

![image](https://hackmd.io/_uploads/rJQ03FQxR.png)

加入局部資訊可以提高 ViT 準確率，且在 Feed Forward Network (FFN) 加入局部資訊也可以帶來好處。原本 V1 是用 Pooling 當作 Local token mixer (residual-connected)，V2 刪掉這個 Pooling 層，改成depth-wise convolutions (DWCONV)，並將 DWCONV 移入 FFN。

![image](https://hackmd.io/_uploads/S1DHDnXgR.png)


另外，重新進行搜索，發現 wider and narrower network 可以有更高準確率、更少參數、更小的延遲。

在 MHSA 中加入 Talking Head 機制 -> 在 Attention Heads 之間加入 Fully Connected
也在 Matrix V 中加入局部資訊 -> DWCONV

在高解析度引入 MHSA 可以提高準確度，但非常吃效能，這裡的解決方法是 Stride Attention：把 Q、K、V 全部 Downsample 成 $\frac{1}{32}$ 來做運算，再把 output 插值回原本解析度並餵給下一層。

**Dual-Path Attention Downsampling：** 除了 strided conv 和 pooling 兩種 downsampling 方式，也有人提出 attention downsampling，更好的保留 global 上下文資訊。做法是將 query 的 token 數減半，以達成 attention 輸出的 downsample。作者結合 pooling 和 DWCONV 作為 local downsampling，同時 residual-connected stride conv 以達到 local-global downsampling。
