Skip to content

MIT 6.5940 第 16–17 講:高效視覺——ViT、GAN、影片與點雲各自在浪費什麼

2026年9月30日1 分鐘
TL;DR第 16 講談 ViT:高解析度下 attention 成本隨解析度平方成長,window attention(Swin)把計算限制在局部視窗,EfficientViT 用 ReLU linear attention 把複雜度降到線性再補回局部與多尺度能力,SparseViT 剪掉不重要的視窗;自監督(對比學習、CLIP、MAE)解決 ViT 需要大量標註的問題;最後 HART 用離散 token 加殘差 diffusion,比 diffusion 模型高出數倍吞吐量。第 17 講針對三種冗餘:GAN 的 2D 空間冗餘(GAN Compression、AnyCost GAN、DiffAugment)、影片的時間冗餘(TSM 零 FLOPs 的時間建模)、點雲的 3D 稀疏(PVCNN、SPVCNN、BEVFusion)。Fall 2026 排程已拿掉第 17 講。

🌏 English version

本文依據 MIT 6.5940 Fall 2024。 這是 MIT 6.5940 導讀系列第 20 篇,合併第 16 與第 17 講。

系列位置:上一篇 L15 長上下文 LLM|下一篇 L18 Diffusion 加速|系列總覽

官方材料:

以下「L16 第 N 頁」「L17 第 N 頁」分別指這兩份 PDF 的頁碼。存取等級 A3:投影片與錄影公開,這兩講沒有對應的 lab。2026-09-30 核對。

Fall 2026 對照:Fall 2026 課頁保留「Vision Transformer」(11 月 5 日,第 16 講),但 GAN、Video、Point Cloud 這一講被拿掉,第 17、18 講改成 Diffusion Model Part I/II。截至 2026-09-30 這幾講都還沒上線。想學第 17 講的內容,目前只能用 Fall 2024 的材料。

為什麼這兩講放在一起

前面十五講的主角是 CNN 分類器和 LLM。這兩講換成「視覺任務的特殊結構」:高解析度影像、生成模型、影片、3D 點雲。L17 第 2 頁把思路講得很清楚:每種資料都有自己的冗餘,GAN 有 2D 空間冗餘,影片有時間冗餘,點雲有 3D 空間冗餘(而且極度稀疏)。找到冗餘,就知道從哪裡省。

講次段落代表技術
L16ViT 基礎patch embedding、資料量與 CNN 的比較
L16高效 ViTwindow attention(Swin)、linear attention(EfficientViT)、sparse attention(SparseViT)
L16ViT 的自監督對比學習、CLIP、MAE
L16ViT 與自迴歸生成VQ、VAR、HART
L17高效 GANGAN Compression、AnyCost GAN、DiffAugment
L17高效影片理解2D/3D CNN 的取捨、TSM
L17高效點雲PVCNN、SPVCNN、BEVFusion

第 16 講:Vision Transformer

ViT 基礎:一張圖切成幾個 token

ViT 把圖切成 patch,每個 patch 當一個 token(L16 第 4–8 頁)。投影片的小例子:96×96 的圖、32×32 的 patch,得到 3×3=9 個 token,每個 token 攤平是 3×32×32=3072 維,線性投影到 ViT 的 hidden size 768,這一層有 3072×768≈2.36M 參數。實作上就是一個 32×32、stride 32 的卷積。

第 10–11 頁是 ViT 論文的經典結論:資料量有限時 ViT 輸給 CNN,用大資料集預訓練後才超越 CNN。這個結論會在自監督那段再用到。

為什麼高解析度是問題

分割、超解析度、自駕這類 dense prediction 任務需要高解析度,低解析度會丟掉細節與小物體(L16 第 14–21 頁)。問題是 ViT 的計算量隨輸入解析度平方成長(第 16 頁)。第 17 頁給了一個對照:在 Jetson AGX Orin(TensorRT、fp16、batch 1)上做 Cityscapes 分割,SegFormer 1.6 FPS、82.4 mIoU,EfficientViT 21.8 FPS、82.7 mIoU。

接下來三種 attention 就是三種省法。

Window attention:只在局部視窗算

Swin Transformer(L16 第 23–26 頁)把 attention 限制在固定大小(例如 7×7)的局部視窗內。每個視窗 token 數固定,所以總計算量對影像大小是線性的;特徵圖再逐層降採樣。問題是視窗之間不交換資訊,解法是下一個 block 把視窗位移(shifted window)。第 27 頁延伸到點雲:FlatFormer 處理 99.9% 稀疏的 3D 點雲,用等大小分組的稀疏視窗。

Linear attention:換個乘法順序

直覺(L16 第 29–30 頁)。Softmax attention 要先算 $QK^\top$,得到 n×n 的矩陣,所以是 $O(n^2)$。如果把 softmax 換成 ReLU,就可以利用矩陣乘法的結合律 $(ab)c = a(bc)$,先算 $K^\top V$(只有 d×d),再乘 Q,成本變成 $O(n)$。

代價(第 31–32 頁)。天下沒有白吃的午餐:ReLU linear attention 產生不了尖銳的注意力分布,擅長抓全域資訊,但抓不好局部細節,也缺少多尺度學習能力。

EfficientViT 的補法(第 33 頁)。EfficientViT 做兩件事:用小卷積把鄰近 token 聚合成多尺度的 Q/K/V,再做 linear attention;在 FFN 裡加 depthwise convolution 補局部資訊。第 34–39 頁的結果涵蓋 Cityscapes 分割、超解析度(最多快 6.4 倍)、Segment Anything 與 ImageNet 分類。

Sparse attention:不是每個視窗都值得算

SparseViT(L16 第 41–46 頁)的問題是:高解析度加稀疏,會不會比低解析度加稠密更好?做法分三步:以視窗為單位剪掉 activation(每層稀疏度可以不同)、做稀疏感知的訓練調整、在資源限制下搜尋每層的稀疏度。第 46 頁把不同延遲預算(24 ms、19 ms)下保留的視窗畫出來。這和 L3–L4 的剪枝是同一套想法,只是剪的是 activation 而不是權重。

自監督:ViT 需要大資料,但標註很貴

L16 第 48–49 頁把前面的結論接回來:ViT 要大資料才好,標註大資料又很貴,那就用沒有標註的資料。

  • 對比學習(第 51–53 頁):同一張圖的兩個隨機視角是正樣本,其他圖是負樣本。引用 Chen et al.(MoCo v3) 的結果:在小資料上直接監督訓練大 ViT,模型越大準確率反而多半下降;自監督的 ViT 則是模型越大越好。
  • CLIP(第 54–56 頁):CLIP 用大量圖文配對做對比學習,推論時可以 zero-shot、開放詞彙分類,不必微調、類別數不限。
  • MAE(第 57–61 頁):MAE 隨機遮住 patch 再預測回來,類似 BERT 的 masked language model。兩個設計:非對稱的 encoder-decoder(重的 encoder 只處理沒遮的 token,輕的 decoder 處理全部);遮蔽比例 75%,遠高於 BERT 的 15%,因為影像的資訊密度比語言低。第 61 頁顯示 MAE 在部分與完整微調設定下都比 MoCo v3 好。

MAE 只處理沒遮的 25% token,本身就是一個效率設計。

自迴歸影像生成與 HART

L16 最後一段問:ViT 會「看」視覺 token,那能不能「生成」視覺 token?

  • VQ 把影像變離散 token(第 67–68 頁):vector quantization 用一個 codebook 把每個 patch 對應到最近的碼字。第 68 頁特別指出,VQ 是 Deep Compression 裡 codebook 量化的推廣,也就是 L5 講過的 k-means 量化。
  • VAR(第 69–70 頁):VAR 把「預測下一個 token」改成「預測下一個尺度」,一次生成一整個解析度層級,比逐 token 生成快。
  • 離散 tokenizer 的問題(第 71–72 頁):重建品質差,高解析度下細節糊掉。

HART 的做法(第 73–81 頁)。HART 的 tokenizer 能同時解碼離散與連續 token,並把連續 token 拆成「離散 token + 殘差 token」。生成時分兩部分:

  1. 離散 token 由可擴展解析度的自迴歸 Transformer 生成(沿用 VAR 的做法)。
  2. 殘差 token 由一個小 MLP 做的 residual diffusion 補上。

為什麼快(第 65 頁):diffusion 模型通常要在最高解析度上跑完整 Transformer 約 20 步;HART 用 10–14 步取樣,而且只有最後一步在最高解析度。第 82 頁的結論是在相近畫質下吞吐量是 diffusion 模型的 4.5–7.7 倍(1024px),第 65 頁在 512px 下最多 9.6 倍。第 84 頁展示它在搭載 4090 mobile GPU 的筆電上以互動速度執行。

第 17 講:GAN、影片與點雲

高效 GAN

背景(L17 第 5–11 頁)。GAN 由生成器 G 和判別器 D 對抗訓練;D 只在訓練時用,推論時真正要加速的是 G。第 11 頁的比較重點是:生成模型比辨識模型貴得多。

GAN Compression(第 13–17 頁)。GAN Compression 壓縮 conditional GAN,流程是:用預訓練的 teacher 生成器蒸餾一個 super student 生成器(配合 L2 特徵匹配),再用 NAS 自動決定每層 channel 數,從候選池裡評估、挑選後微調。第 15–16 頁的壓縮倍數:pix2pix 11.8 倍、CycleGAN 21.2 倍、GauGAN 8.8 倍。這一招把 L7–L8 的 NAS 和 L9 的蒸餾接在一起。

AnyCost GAN(第 19–33 頁)。場景:用 GAN 修圖時,每次調整都要等完整生成,很難互動。直覺:光線追蹤會用較少光線先出快速預覽,GAN 能不能也這樣?機制:AnyCost GAN 訓練一個能在不同解析度、不同 channel 數下產生一致結果的生成器,編輯時用小子網路即時預覽,最後用完整模型輸出。訓練時隨機取樣 channel 數會遇到兩個問題:子網路輸出不一致(加蒸餾 loss 解決);單一判別器無法同時給不同子生成器有效回饋(改用依生成器架構條件化的判別器)。

DiffAugment(第 35–45 頁)。問題換成資料量:FFHQ 有 7 萬張精選人臉,收集與標註要花很久。第 37 頁的數字是 StyleGAN2 在 100%、20%、10% 訓練資料下的 FID 分別是 11.1、23.1、36.0(越低越好),資料一少就明顯變差,原因是判別器過擬合。資料增強是對付過擬合的老辦法,但 GAN 要怎麼增強?

做法問題
只增強真實圖生成圖也學到增強造成的假影(第 40 頁)
真假圖都增強,但只在更新 D 時最佳化失衡,訓練崩壞(第 41 頁)
DiffAugment:真假圖都增強,D 與 G 更新時都用,且增強可微分資料少時明顯改善,100 張圖也能生成(第 42–45 頁)

高效影片理解:TSM

2D 與 3D CNN 的取捨(L17 第 51–59 頁):

  • 2D CNN:取樣影格各自過 2D CNN 再彙總分數,或加光流做 two-stream,或後接 LSTM。好處是計算省、能重用影像模型;壞處是無法建模時間資訊,光流比網路本身還慢,後期融合抓不到低階時間關係。
  • 3D CNN(C3D、I3D):在時間維度也做卷積,能同時建模時空資訊;代價是多一個維度,模型大小與計算量都大。I3D 用「膨脹」把 2D 權重沿時間複製來初始化。

第 59 頁的問題:能不能用 2D CNN 的成本拿到 3D CNN 的表現?

TSM 的做法(第 61–64 頁)。TSM 把一部分 channel 沿時間軸位移:雙向版一部分往前、一部分往後,讓相鄰影格交換資訊,用於離線影片;單向版只從過去往未來位移,用於即時串流。插進現成的 2D CNN,零 FLOPs、零參數。第 64 頁的實作只有幾行:

# shape of x: [N, T, C, H, W]
out = torch.zeros_like(x)
fold = c // fold_div
out[:, :-1, :fold] = x[:, 1:, :fold]  # shift left
out[:, 1:, fold: 2 * fold] = x[:, :-1, fold: 2 * fold]  # shift right
out[:, :, 2 * fold:] = x[:, :, 2 * fold:]  # not shift
return out

結果(第 65–76 頁):

  • Something-Something 資料集上,計算量是 ECO 家族的 1/3、Non-local I3D 家族的 1/6,表現更好。
  • Tesla P100、batch 1:I3D 每支影片 164.3 ms、準確率 41.6%;TSM 17.4 ms、43.4%。
  • 放大到 SUMMIT 超級電腦:8 幀 ResNet-50 TSM 在 Kinetics 上訓練,1 個節點(6 GPU)要 49 小時 50 分,256 個節點(1536 GPU)只要 14 分鐘,準確率維持在 74% 左右。

高效點雲:PVCNN、SPVCNN、BEVFusion

挑戰(L17 第 82–86 頁)。點雲是一組無序的 3D 點(x, y, z 加特徵),極度稀疏(有時密度不到 0.1%),在記憶體中不規則存放,一般 CNN 處理不了。模型又常要部署在自駕車、AR 頭盔這類資源有限的裝置上。

PVCNN(第 88–93 頁)。兩種既有做法各有瓶頸:voxel 方法在 8GB GPU 記憶體下會損失 40% 以上資訊;point 方法有大量不規則記憶體存取,而第 89 頁提醒,晶片外 DRAM 存取比算術運算貴得多,隨機存取還可能撞到 bank conflict。PVCNN 兩者並用:voxel 分支規則、沒有不規則存取,適合聚合鄰域資訊;point 分支保留高解析度,減少 voxel 化的資訊損失。第 93 頁的室內分割示範:PointNet 用 1.9 GB 記憶體、1.9 秒,PVCNN 用 1.2 GB、1.0 秒。

SPVCNN(第 94–98 頁)。SPVConv 把 voxel 分支換成稀疏卷積,處理大場景時不必付出稠密網格的代價;再配合 3D NAS(super network、演化搜尋、延遲預測器)在延遲目標下找架構。

BEVFusion(第 100–105 頁)。自駕車同時有多顆相機(透視視角)和 LiDAR(3D 視角),融合前需要一個共同空間:所有感測器資料都能低損失轉換過去,而且適合不同 3D 任務。BEVFusion 選鳥瞰圖(BEV):相機走稠密分支、LiDAR 走稀疏分支,各自轉到 BEV 後融合,再接偵測、地圖分割等任務頭。第 105 頁寫著截至 2022 年 11 月 9 日在 Waymo 排行榜排名第一。

兩講共用的想法

整理完會發現兩條線:

  • 找到結構性的冗餘再省:ViT 的局部性(window attention)、影片相鄰幀的相似(TSM)、點雲的稀疏(SPVConv)、影像 token 的低資訊密度(MAE 遮 75%)。
  • 前面各講的技術被重新組合:SparseViT 是剪枝,GAN Compression 是 NAS 加蒸餾,VQ 是 k-means 量化,PVCNN 的論證回到記憶體存取成本。F24 課頁把這兩講排在「Chapter II: Domain-Specific Optimization」底下,指的就是這種依資料特性重組既有工具的做法。

自學怎麼做

  1. L16 第 30 頁的結合律圖是整講最值得停下來的一頁:自己寫出 $QK^\top V$ 兩種乘法順序的矩陣形狀,確認哪一種是 $O(n)$。
  2. 把 L17 第 64 頁的 TSM 程式碼抄進 notebook,用一個隨機 [N, T, C, H, W] tensor 跑一次,印出位移前後某個 channel 在時間軸上的值。
  3. 今晚就能做的一件事:用 L16 第 5 頁的算法,算 patch size 16 的 ViT 在 224×224 與 1024×1024 輸入下各有幾個 token((224/16)² 與 (1024/16)²),再平方一次估計 attention 矩陣大小差幾倍,對照第 16 頁的 GMACs 曲線。

延伸閱讀

參考資料