Transformer 吃的是一串 token,而且每個 token 都要和其他每個 token 算一次關係,成本是長度的平方。如果一個像素當一個 token,224×224 的圖就是 50,176 個 token,平方之後是二十五億對;講義拿來對照的是 NLP 常見的 512。ViT 的解法很直接:把圖切成 16×16 的小方塊(patch),一塊當一個字。224 ÷ 16 = 14,序列只剩 14×14 = 196 個 token。
卷積只看鄰居。卷積是「線性、局部」的運算:一個 3×3 kernel 只看周圍 9 個值。要看到整張圖,只能把網路疊得很深。講義用大象舉例:象鼻、尾巴、腿分散在圖的各處,要把它們連成「一隻大象」需要非局部的運算。
CNN 裡的非局部操作(講義):
ViT 的流程(講義):切 patch → 攤平 → 線性投影成較低維的 embedding → 加上位置編碼 → 送進標準的 Transformer encoder → 在超大的有標籤資料集上預訓練 → 在下游資料集上 fine-tune。它只用原始 Transformer 的 encoder,每個 block 是 Layer Norm → Multi-Head Attention → Layer Norm → MLP,都有殘差。MLP 先把 768 維放大 4 倍到 3072,再縮回來,activation 是 GELU。ViT-B/16 的序列是 196 個 patch 加 1 個 CLS,共 197 × 768。
把影像變序列的兩個挑戰:一是序列太長(上面的平方),二是缺少 CNN 的歸納偏置(局部性、平移等變性)。講義列的對策:patch 解決長度;大規模資料預訓練補偏置;或先用 CNN 抽特徵再交給 Transformer(hybrid),hybrid 在小模型上比較好,模型變大後優勢消失。
位置編碼是可訓練的向量,加在每個 patch embedding 上。作者試了一維、二維和相對位置編碼,差異不大;講義的解釋是 ViT 在 patch 層級運作,patch 之間的相對位置很容易學。CLS token 是隨機初始化、可學的向量,放在序列最前面,負責從其他 token 收集資訊;最後的 MLP head 只看最後一層的 CLS,不看其他任何東西。
卷積的第一層只看隔壁。attention 不一樣:每個 patch 都直接和其他所有 patch 比一次「像不像」,越像的權重越大,不管距離多遠。講義引用的分析指出,ViT 在最早的幾層就有 attention head 看向整張圖,而一個 24 層、全用 3×3 卷積的網路,感受野還不到 50 像素。
| 性質(講義) | CNN | Vision Transformer |
|---|---|---|
| Shift invariance | 大致有 | 沒有 |
| Permutation invariance | 沒有 | 大致有(patch 層級) |
| 局部處理 | 有,3×3、5×5 卷積 | 部分(只有切 patch 那一步) |
| 參數共享 | 有 | 有 |
| 越深解析度越低、特徵越寬 | 有,多數是金字塔 | 沒有,從頭到尾同樣大小 |
學到的非局部互動有多遠:講義的圖顯示,ViT 從第 1 層開始就有 head 的平均注意距離達到約 128 像素;另一些 head 一直保持很短的距離,扮演類似早期卷積層的角色。作者在 Transformer 前面接一個 ResNet(hybrid)之後,這種極局部的 head 變少了,正好說明它們原本在做卷積的工作。講義也算了一筆帳:沒有 dilation 或 pooling 的話,要看到約 100 像素大概要疊 50 層卷積。
Intriguing properties(講義):ViT 對遮擋、資料分佈偏移(例如去掉紋理)、對抗性 patch、打亂 patch 順序都比 CNN 穩健。講義也提醒,這些多半來自特定資料集上的實驗,能不能普遍成立還要驗證。
What do Vision Transformers Learn(講義引用的視覺化研究):
歸納偏置是雙面刃(講義備註):CNN 的局部性和平移不變性非常符合影像的特性,但也讓它處理全域特徵比較吃力。偏置越少,模型越有彈性,但越需要資料,也越容易過擬合。
CNN 天生「知道」近的像素比較相關、貓在左邊或右邊都是貓。ViT 不知道,要從資料裡自己學。所以資料少的時候,CNN 的先天假設是幫助;資料夠多的時候,這些假設反而變成限制。講義的結果:只在 ImageNet(約 130 萬張)上預訓練,ViT 會過擬合、輸給 ResNet;講義說 ViT 需要大量資料,ImageNet-21k 的 1400 萬張才算起跳;到 JFT(3 億張)才看到大 ViT 的全部優勢。
更多圖片的探索(講義):用 3 億張弱標籤圖預訓練,ImageNet 到 79.2%(Sun et al. 2017);之後有用 35 億個 hashtag 預訓練、用 Noisy Student 在 3 億張圖上做 pseudo-label,以及 Big Transfer(BiT)的遷移配方。BiT 的關鍵圖說明:大資料只有在網路容量夠大時才有用,小的 ResNet 從 100 萬加到 3 億張,進步很有限。BiT 本身是 ResNetv2,把 Batch Norm 換成 Group Norm,再加上 weight standardization。
意外的結果:ViT 的預訓練反而比較便宜。講義的控制實驗以 exaFLOPs 計,在每一個成本層級,ViT 預訓練都比 ResNet 便宜;hybrid 在小規模時有效。講義也提醒,ViT 相對 CNN 的提升有很大一部分其實來自訓練策略的優化。
attention 是唯一的關鍵嗎?講義把視覺架構簡化成兩種互動:特徵之間(channel,用 MLP,等於 1×1 卷積)和空間之間(token,用 attention 或卷積)。2021 年的 MLP-Mixer 支線:
資料少的時候怎麼訓練:資料增強、更好的正則化、蒸餾(CNN 當老師)、optimization。DeiT 拿掉 MLP head、只用一個線性分類器;更好的訓練策略就讓同樣結構的 ViT 大幅進步,再加上蒸餾就超過 EfficientNet。蒸餾的做法是在序列裡多放一個蒸餾 token,和 CLS 並列,它的目標是對上 CNN 老師的預測,讓 ViT 從老師那裡間接學到卷積的偏置。講義列的成本:8 塊 GPU 訓練 2 到 3 天(訓練 53 小時、fine-tune 20 小時),只用 ImageNet,完全沒有卷積。
Scaling laws for vision(Zhai et al. 2021):錯誤率和算力大致成冪次關係 E = a·C−b,最後碰到無法再降的誤差。小模型用不到超過 3000 萬張的資料;對大模型來說,3 億張都還不夠。
什麼都能 tokenize:約 2021 年起,大量研究把不同模態各用自己的方式切成「patch」(影像、聲音、文字),一起送進同一個 Transformer,而且似乎就是能 work(講義舉 LIMoE、MERLOT Reserve、VATT)。講義的總結:Transformer 視覺模型的進步來自高效學習的容量,也帶動了訓練 recipe 的創新;正則化和 hybrid 研究得比較多,optimization 與架構的交互還比較少人研究。
ViT 用在高解析度的偵測、分割時有兩個麻煩(講義):物體大小差很多,不像文字有固定尺寸;全域 attention 的成本是 token 數的平方。Swin Transformer 的讓步是把 attention 關進小視窗裡(成本變成線性),再像 CNN 一樣一層一層縮小解析度。另一邊,ConvNeXt 反過來問:如果把 Transformer 的設計一步一步搬進 ResNet、完全不用 attention,會怎樣?
| ConvNeXt 把 ResNet 現代化的每一步 | 做了什麼 | 講義的 ImageNet 準確率 |
|---|---|---|
| 起點 | ResNet-50,換上接近 DeiT / Swin 的訓練 recipe | 78.8% |
| Stage ratio | 四個 stage 的 block 數從 (3,4,6,3) 改成 (3,3,9,3),學 Swin-T 的 1:1:3:1 | 79.4%(FLOPs 4G → 4.5G) |
| Patchify stem | 開頭的 7×7 stride 2 卷積 + max pool,換成一個 4×4 stride 4 的卷積,等於切 patch | 79.5% |
| ResNeXt 化 | 改用 depthwise conv(每個 channel 自己做空間混合,很像 attention 的加權和),寬度從 64 加到 96 | 80.5%(5.3G) |
| Inverted bottleneck | 學 Transformer 的 MLP:中間層比輸入寬 4 倍 | 80.6%(4.6G) |
| Depthwise 往上移 | 把 depthwise conv 放到 block 最前面,讓昂貴的空間運算只處理較少 channel | 講義未列 |
| 大 kernel | 3×3 改成 7×7,接近 Swin 的視窗大小 | 講義未列 |
| Micro design | ReLU 換 GELU;每個 block 只留一個 activation、更少 normalization;Batch Norm 換 Layer Norm;下採樣改成獨立的一層 | 最終超過 Swin |
ViT–CNN 光譜(講義,來自 VisFormer 的拆解):同時拿兩邊的優點,能不能在準確率、訓練時間、穩定性、資料效率上更好?可以拆成幾個選擇:整體是 isotropic(從頭到尾同樣大小,ViT)還是 pyramidal(分 stage 縮小,CNN);stem(開頭)怎麼做;head 怎麼做;空間混合用 self-attention 還是 N×N 卷積;以及很多細節,例如 normalization、非線性函數、位置編碼、skip 的位置、寬度比例。VisFormer 示範了從 DeiT 一步一步走到 ResNet-50 的過程。
Swin 的結構(講義):
ConvNeXt 的動機(A ConvNet for the 2020s):vanilla ViT 最大的問題是全域 attention 對輸入大小是平方複雜度,ImageNet 分類還能接受,高解析度就做不下去。Swin 這類階層式 Transformer 解決了它,但滑動視窗 attention 的樸素實作很貴。講義的評語:諷刺的是,卷積本來就有這些大家想要的性質;兩者的表現差距,通常被歸因於 Transformer 比較好的 scaling。
訓練 recipe(接近 DeiT 與 Swin):90 個 epoch 加到 300 個;AdamW;Mixup、Cutmix、RandAugment、Random Erasing 等資料增強;Stochastic Depth 和 Label Smoothing 等正則化。講義引用的評論列出最合理的幾個技巧:大 kernel、Layer Norm、residual block 裡較胖的中間層、每個 block 只有一段非線性、獨立的下採樣層;ImageNet-1k top-1 87.1%。
Transformer vs convolution:「ConvNets Match Vision Transformers at Scale」用最多 11 萬 TPU 小時、在 40 億張 JFT 圖上預訓練做公平比較:當 CNN 拿到和 ViT 相近的算力預算,表現就追得上 ViT。講義備註的一句話:同樣的算力下,兩者表現差不多。
收尾:DETR(End-to-End Object Detection with Transformers)。講義引用的評論說,最喜歡的架構其實是 DETR 那樣:前幾層用 ConvNet(或 ConvNeXt),上面再接比較像記憶、對排列不敏感的 Transformer block,做以物件為單位的推理。兩邊不是誰取代誰,而是各做擅長的那段。
這個模組最常被講錯的幾句話。