# Week22: An Image is worth 16X16 words: Transformers for Image Recognition at scale
###### tags: `技術研討`
> 簡稱:Vision Transformer, VIT
## Contribution
將tranformer應用在影像分類上
## Pipeline of VIT

1. 準備Transformer Encoder的Input Sequence
- Patch Embedding
1. 將圖片切成長寬是$P \times P$的子圖片, 接者將其flatten成長度為$P^2\times C$的向量
例:假設Input RGB Image的size是$27 \times 27$, $P=9$, 則會把切成$9$個$9^2\times 3$的向量
2. 將每個向量經過Linear Layer轉換成D維的向量
:::info
等價於在Input Image上做一個kernel size是$P \times P$, stride是$P$的Convolution
:::
- Position Embedding
* 使用Standard learnable 1D position embeddings(每個Patch Embedding配上一個$1 \times D$維的Parameter)
- class token
* 跟BERT的策略一樣, 在第一個位置放一個class token($1 \times D$維的Parameter)
* 目的: 利用class token的output embedding進行影像分類
2. 數個Transformer Encoder Block
3. 最後提取class token的output embedding當作MLP(Linear Layer)的Input進行分類
## Q&A
Q: 為何需要class token?為什麼不用input sequence裡的其他element的output embedding就好了?
A: Paper上的主文是說學BERT的, 但在Appendix有討論這個問題, 發現Learning rate影響比較大(?)

Q: 為何class token是放在第一個位置?
A: 在這個Pipeline下, 因為是transformer是Bi-directional,所以放在哪裡都關係,但在BERT下因為要考慮還有其他TOKEN的問題(sep, mask)才有class token的順序問題
Q: 當Testing Input Size跟Training Input Size不一樣怎麼辦?
A: Patch Size保持一樣, Position Embedding採用bilinear的方式產生(像是image resize)
## Experiment
- Experiment Setting

- Training Dataset Setting
- JFT : 18k classes and 303M images
- I21k : 21k classes and 14M images
- ImageNet : 1k classes and 1.3M images
- 與SOTA的影像分類模型比較

- Pre-traing data requirement

- Transformer缺少CNN的一些特質(平移不變性), 需要大量資料學這些特質
- Performance versus pre-training compute for different architectures

- Hyprid: 產生Patch Embedding的方式改成用ResNet50