NEWSIO+ 教育系列01 自己訓練一個 AI02 從照片還原 3D03 深度學習
主線 D · 模組 D3動手做 // 四個實驗台

ViT 與回擊的卷積

把圖切成 16×16 的 patch 當句子,為什麼可行?資料要多大才贏過 CNN?Swin 和 ConvNeXt 各讓了什麼步?

D2 的 attention 是為文字設計的:一句話是一串字,每個字可以直接看其他所有字。圖不是一串字,是一大片像素。這個模組看 Vision Transformer 怎麼把圖切成小方塊、排成一串當「句子」,看它從第一層就能看到整張圖的代價是什麼,最後看兩邊怎麼互相讓步:Swin 把 Transformer 改得像 CNN,ConvNeXt 把 CNN 改得像 Transformer。

SEC.01 / PATCHES AS WORDS

把圖切成小方塊,排成一串,就是一句話

Transformer 吃的是一串 token,而且每個 token 都要和其他每個 token 算一次關係,成本是長度的平方。如果一個像素當一個 token,224×224 的圖就是 50,176 個 token,平方之後是二十五億對;講義拿來對照的是 NLP 常見的 512。ViT 的解法很直接:把圖切成 16×16 的小方塊(patch),一塊當一個字。224 ÷ 16 = 14,序列只剩 14×14 = 196 個 token。

PROBE A / 切 patch動手做 // 拉 patch 大小,點任一塊
選到的 patch 攤平成一個向量
切成幾個 token (64 ÷ p)²—
序列長度(加上一個 CLS token)—
每個 token 的維度 p × p × 3—
attention 要算的 pair 數 (序列長度)²—
對照:一個像素當一個 token—
同樣的 p 用在 224×224—
看到什麼:patch 越大,token 越少,attention 的成本掉得越快(平方),但每個 token 要裝的東西越多(p²·3 個數字)。p = 16 在 224×224 上剛好是 196 個 token、每個 768 維,這就是講義裡 ViT-B/16 的數字。打開「序列順序」:Transformer 拿到的只是一串編號 0、1、2…,它不知道 7 號在 8 號的左邊、在 15 號的上面,所以要另外加位置編碼。這張 64×64 的圖是程式畫的示意圖,向量是真的從像素攤平出來的。
一塊 = 一個字切塊、攤平、乘一個矩陣變成 D 維向量(patch embedding),之後就和處理文字一模一樣。
切塊是為了序列長度成本是長度的平方。16×16 的塊讓 50,176 變成 196,平方之後差了六萬多倍。
順序要另外告訴它attention 對排列不在意(permutation invariant),所以每個位置加一個可學的位置向量,再在最前面放一個 CLS token 收集全圖資訊。
細看 · ViT 之前的非局部嘗試、ViT 的完整流程、位置編碼與 CLS

卷積只看鄰居。卷積是「線性、局部」的運算:一個 3×3 kernel 只看周圍 9 個值。要看到整張圖,只能把網路疊得很深。講義用大象舉例:象鼻、尾巴、腿分散在圖的各處,要把它們連成「一隻大象」需要非局部的運算。

CNN 裡的非局部操作(講義):

  • Squeeze-and-Excitation (SE):把整張 feature map 壓成每個 channel 一個數字,經過一個小網路,再用結果去縮放每個 channel。等於全圖互相溝通,但形式非常受限。
  • Gather-Excite:類似 SE,但不是壓成一個數字,而是先用卷積或 pooling 把 feature map 縮小(gather),再用 nearest neighbor 放大回原尺寸、經過 sigmoid、和原輸入相乘(excite)。講義指出這種全域操作看起來還能省計算量和參數。
  • BAM(Bottleneck Attention Module):把 SE 的設計再放寬,加上空間方向的分支(1×1 降 channel,接兩個 3×3 dilated conv,再 1×1),幾乎「免費」降低錯誤率。講義問:那為什麼不乾脆用更一般的全域運算?
  • MLP for vision:完全不用卷積的全連接網路,在打亂像素順序的 CIFAR-10 上約 70%,加上資料變形到 78%,只比像樣的卷積網路低 10%。講義的解讀:很強的架構配上強的正則化和資料增強,也能有競爭力;資料量是限制。

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,不看其他任何東西。

SEC.02 / GLOBAL FROM LAYER ONE

一個 patch 在看誰:第一層就能看到圖的另一頭

卷積的第一層只看隔壁。attention 不一樣:每個 patch 都直接和其他所有 patch 比一次「像不像」,越像的權重越大,不管距離多遠。講義引用的分析指出,ViT 在最早的幾層就有 attention head 看向整張圖,而一個 24 層、全用 3×3 卷積的網路,感受野還不到 50 像素。

PROBE B / 玩具 attention動手做 // 點一個 patch,看權重落在哪
選到的 patch—
權重最大的另一塊—
平均注意距離 Σ 權重 × 距離—
權重落在 3×3 鄰居以外的比例—
對照:一層 3×3 卷積最遠看到—
這是玩具版,但每一格都是真的算出來的:每個 patch 的像素攤平成向量、減掉所有 patch 的平均,和被選的 patch 算餘弦相似度,除以溫度 τ 再做 softmax,越亮的地方權重越大。點左上的橘色圓:右下另一個橘色圓馬上亮起來,即使它在圖的另一頭。真正的 ViT 不是直接比像素,而是先乘上學到的 WQ、WK;這裡省掉那一步,只為了讓你看到「內容相似就連得上,和距離無關」。把 λ 拉大等於硬塞一個「近的比較重要」的偏好,權重就縮回鄰近,像卷積。這正是 CNN 的歸納偏置:寫死在架構裡,ViT 則要自己從資料學。
性質(講義)CNNVision Transformer
Shift invariance大致有沒有
Permutation invariance沒有大致有(patch 層級)
局部處理有,3×3、5×5 卷積部分(只有切 patch 那一步)
參數共享有有
越深解析度越低、特徵越寬有,多數是金字塔沒有,從頭到尾同樣大小
看「像不像」,不看「近不近」attention 的權重來自內容。兩個相似的東西離多遠都連得上。
越深看得越遠,但第一層就有看很遠的頭講義:注意距離隨深度增加,類似卷積的感受野;不同的是低層就同時有看近和看遠的 head。
學出來的東西其實很像 CNN早層是抽象花紋,晚層是具體物體;差別在 ViT 更會用背景、比較不依賴高頻紋理。
細看 · 學到的互動距離、ViT 的奇特性質、ViT 到底學到什麼

學到的非局部互動有多遠:講義的圖顯示,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 的部分:特徵從早層的抽象圖樣,進展到晚層的具體物體。
  • 每個 patch 的激活圖像 saliency map,標出這個特徵在看圖的哪一塊。
  • ViT 更會利用背景資訊,比較不依賴高頻、紋理類的特徵。
  • patch token 在除了最後一層以外的所有層都保留空間資訊;最後一層比較像一個學出來的 global pooling。
  • 用語言監督(例如 CLIP)訓練的 ViT,神經元對應的是語意概念,而不只是視覺花紋。

歸納偏置是雙面刃(講義備註):CNN 的局部性和平移不變性非常符合影像的特性,但也讓它處理全域特徵比較吃力。偏置越少,模型越有彈性,但越需要資料,也越容易過擬合。

SEC.03 / DATA VS INDUCTIVE BIAS

資料要多大才贏過 CNN

CNN 天生「知道」近的像素比較相關、貓在左邊或右邊都是貓。ViT 不知道,要從資料裡自己學。所以資料少的時候,CNN 的先天假設是幫助;資料夠多的時候,這些假設反而變成限制。講義的結果:只在 ImageNet(約 130 萬張)上預訓練,ViT 會過擬合、輸給 ResNet;講義說 ViT 需要大量資料,ImageNet-21k 的 1400 萬張才算起跳;到 JFT(3 億張)才看到大 ViT 的全部優勢。

PROBE C / 資料量 vs 準確率(示意)動手做 // 拉預訓練資料量
ResNet(CNN)ViTViT 用原本的 recipe(虛線)
預訓練資料量—
ResNet(示意)—
ViT(示意)—
這個資料量誰贏—
兩條線在哪裡交叉—
這張圖是示意:曲線的形狀照講義的結論畫,百分比是為了說明而設的,不是論文的數字。交叉點和輸贏是用這兩條示意曲線真的算出來的。三件事值得試:(1)從 130 萬拉到 3 億,看 ViT 從輸到贏。(2)切到「小模型」:兩條線都很快飽和,講義說小模型用不到超過 3000 萬張的資料,大資料只對高容量的網路有用。(3)勾 DeiT:同樣的 ViT 架構,只換更好的訓練方法和蒸餾,在只有 ImageNet 的資料量就追上 CNN,這是第一條常見誤解。
偏置 = 先付的學費CNN 把「局部、平移」寫死在架構裡,資料少時直接受益;ViT 要用資料把這些自己學出來。
大資料要配大模型小模型裝不下更多知識,資料再多也沒用;大模型才吃得下 3 億張圖。
資料不夠,就用 recipe 補資料增強、正則化、蒸餾、optimization。DeiT 只用 ImageNet 就讓 ViT 超過 EfficientNet。
細看 · 大資料的歷史、預訓練成本、MLP-Mixer 與 PoolFormer、DeiT、scaling laws、多模態

更多圖片的探索(講義):用 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 支線:

  • MLP-Mixer:用 token-mixing MLP 加 channel-mixing MLP 取代 self-attention,在控制實驗裡效能對成本和 ViT 相當,大規模時 ImageNet 87.9%。
  • ResMLP:只用 ImageNet 從頭訓練,81.0%,只比同級 Transformer 稍低。
  • PoolFormer(MetaFormer):把 attention 換成最簡單的 pooling,效果幾乎不變。結論:重要的可能是整體的巨集架構(token-mixing + channel-mixing + residual),而不是 self-attention 本身。

資料少的時候怎麼訓練:資料增強、更好的正則化、蒸餾(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 與架構的交互還比較少人研究。

SEC.04 / WINDOWS AND CONVNEXT

兩邊各讓一步:Swin 的視窗,ConvNeXt 的現代化

ViT 用在高解析度的偵測、分割時有兩個麻煩(講義):物體大小差很多,不像文字有固定尺寸;全域 attention 的成本是 token 數的平方。Swin Transformer 的讓步是把 attention 關進小視窗裡(成本變成線性),再像 CNN 一樣一層一層縮小解析度。另一邊,ConvNeXt 反過來問:如果把 Transformer 的設計一步一步搬進 ResNet、完全不用 attention,會怎樣?

PROBE D / Swin 的視窗動手做 // 改邊長與視窗,點一個 token
選到的 token這一層看得到兩層之後看得到
token 數 n = 邊長²—
global attention n²—
window attention n · M²—
省下的倍數—
視窗數—
選到的 token 兩層之後能看到幾個—
看到什麼:成本都是真的數出來的(每個視窗內 token 數的平方加總)。邊長 56、M = 7 是 Swin-T 第一層的設定:3136 個 token,global 要九百多萬對,視窗只要十五萬對,省 64 倍,而且邊長加倍時視窗成本只變 4 倍,global 變 16 倍。關掉 shifted window 看藍色範圍:兩層都用同樣的切法,資訊永遠出不了自己的視窗。打開之後下一層的視窗往右下錯開半格,原本分屬不同視窗的 token 被放進同一個視窗,兩層疊起來就跨過邊界了。注意錯開後天真的切法視窗數會變多(8×8、M = 4 時從 4 個變 9 個),Swin 用 cyclic shift 把它變回 4 個。
ConvNeXt 把 ResNet 現代化的每一步做了什麼講義的 ImageNet 準確率
起點ResNet-50,換上接近 DeiT / Swin 的訓練 recipe78.8%
Stage ratio四個 stage 的 block 數從 (3,4,6,3) 改成 (3,3,9,3),學 Swin-T 的 1:1:3:179.4%(FLOPs 4G → 4.5G)
Patchify stem開頭的 7×7 stride 2 卷積 + max pool,換成一個 4×4 stride 4 的卷積,等於切 patch79.5%
ResNeXt 化改用 depthwise conv(每個 channel 自己做空間混合,很像 attention 的加權和),寬度從 64 加到 9680.5%(5.3G)
Inverted bottleneck學 Transformer 的 MLP:中間層比輸入寬 4 倍80.6%(4.6G)
Depthwise 往上移把 depthwise conv 放到 block 最前面,讓昂貴的空間運算只處理較少 channel講義未列
大 kernel3×3 改成 7×7,接近 Swin 的視窗大小講義未列
Micro designReLU 換 GELU;每個 block 只留一個 activation、更少 normalization;Batch Norm 換 Layer Norm;下採樣改成獨立的一層最終超過 Swin
Swin:Transformer 撿回局部性視窗就是局部性,patch merging 就是 pooling。講義備註的說法:合適的歸納偏置能省下很多計算。
ConvNeXt:卷積撿回 Transformer 的細節沒有任何 attention,只是把 stem、寬度、kernel、norm、activation 一個一個改掉,就超過 Swin。
差別沒有想像中大講義的結論:ViT 和 CNN 的差異是很多小地方的組合,混合兩者在中小規模往往最好。
細看 · ViT–CNN 光譜、Swin 的細節、ConvNeXt 的訓練 recipe、DETR

ViT–CNN 光譜(講義,來自 VisFormer 的拆解):同時拿兩邊的優點,能不能在準確率、訓練時間、穩定性、資料效率上更好?可以拆成幾個選擇:整體是 isotropic(從頭到尾同樣大小,ViT)還是 pyramidal(分 stage 縮小,CNN);stem(開頭)怎麼做;head 怎麼做;空間混合用 self-attention 還是 N×N 卷積;以及很多細節,例如 normalization、非線性函數、位置編碼、skip 的位置、寬度比例。VisFormer 示範了從 DeiT 一步一步走到 ResNet-50 的過程。

Swin 的結構(講義):

  • Patch partition:用 4×4 的 patch,224 的圖切成 56×56 個 token,每個 token 4×4×3 = 48 維;linear embedding 再轉成 C 維,Swin-T 的 C = 96。
  • Patch merging:每 2×2 個相鄰 token 拼在一起,解析度變 H/2、W/2,像 CNN 的 pooling,於是有了多尺度的特徵。
  • W-MSA:把圖均勻切成不重疊的 M×M 視窗,attention 只在視窗內算,視窗之間互不相關。
  • SW-MSA:下一層把視窗往右下移,讓每個 token 能和原本其他視窗的 token 連結。一個完整的 Swin block 會先 W-MSA、再 SW-MSA。
  • Batch 計算技巧:錯開後視窗從 4 個變 9 個、大小不一。cyclic shift 把邊上的三塊循環移到另一側,又拼回 4 個完整視窗;但拼在一起的區塊原本不相鄰,不該互相 attend,所以再加一個 mask(masked MSA)。
  • 線性複雜度:視窗大小 M 固定,成本是 n·M²,和 token 數成正比,不是平方。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,做以物件為單位的推理。兩邊不是誰取代誰,而是各做擅長的那段。

SEC.05 / MISCONCEPTIONS

常見誤解

這個模組最常被講錯的幾句話。

ViT 沒有歸納偏置,所以一定要上億張圖才能用。DeiT 只用 ImageNet、8 塊 GPU 兩三天,靠更好的訓練 recipe 和蒸餾就超過 EfficientNet。少掉的偏置可以用資料補,也可以用 recipe 補。
attention 一定比卷積強。MLP-Mixer、PoolFormer 把 attention 換掉效果差不多;算力相同時 CNN 也追得上 ViT。重要的是整體架構和訓練方法。
Swin 只是為了省算力。它還帶回了 CNN 的階層結構(patch merging 做出多尺度特徵),讓偵測、分割這種需要不同大小物體的任務能用;shifted window 讓資訊跨視窗流動。
Transformer 出來之後,CNN 就輸了。ConvNeXt 不用任何 attention 就超過 Swin;講義收尾的 DETR 是前面卷積、後面 Transformer。兩者是互相借用,不是誰淘汰誰。