跳到主要内容

Transformer 进入视觉 — 窗口、十字与假面

这一章讲三件事: 图像怎么变成序列喂给 Transformer,以及这个莽法的算力账; Swin 怎样用「只算窗口内」把账算平,又怎样用「移位窗口」补回跨窗口的通信; 最后拆穿 MLP-Mixer——它去掉卷积的名字,去不掉卷积的实质。

1. 这一章讲什么

前面四章全是卷积的地盘。转折点在 NLP:Transformer(第 10 章才完整讲它的内部; 这一章先把它当黑箱,理解为「一层的每个位置都能直接看所有位置的零件」)在语言上大杀四方, 于是有人问:图像凭什么不行?

先认两个名字:GPT——OpenAI 拿 Transformer 堆出来的语言模型,能一路生成文字, 第 11 章细讲。

另一个要认的是 BERT——靠「完形填空」学语言模型的另一家,第 12 章细讲。

书里把这场迁移的起点归给 iGPT(GPT 的图像版):它「突破了使用 CNN 解决图像问题的 思维困境」,后来的 CLIP、DALL·E 都顺着这条路走1。这一章按时间线讲四个名字: iGPT(敢想)、Swin(算得起)、CSWin(看得更远)、MLP-Mixer(挂羊头卖狗肉)。

2. 顶层全景:图像变序列的代价

一张 224×224 的图
│ 展开成一行

长度 150 528 的序列(224×224×3 个数排成串)


Transformer:每个位置都要和所有位置配对算相似度


计算量 ∝ 150 528² —— 这就是「力不从心」四个字的来历

图说:序列化的代价不在精度,在平方。后面每个方案都是在给这张平方账打折。

3. 核心原理

3.1 iGPT:把像素当字,把算力烧穿

iGPT 的做法莽得很直接:把图像降采样到 32×32 一类的小尺寸,按光栅扫描顺序 (一行接一行,像读文字)拉成序列,每个位置变成一个 d 维嵌入(把一个离散小块翻译成 一串数的表示)2

然后套用 GPT 的第二代 GPT-2 的结构,做两种预训练(先在海量不用人工打标签的数据上 自己出题自己练,第 11 章的主角们全靠这招)任务:自回归(用前面所有像素逐个预测 下一个像素)和 BERT 那一路的掩码语言模型(遮住一些像素,猜它们是什么)3

3.2 iGPT 的账单与「线性探测」

账为什么算不平?书里给了对照:CIFAR 的 32×32×3 图展开后序列长 3 072,「尚且有能力处理」; ImageNet 的 224×224×3 展开后长 150 528,「对 Transformer 来说就有些力不从心」4。 iGPT 的让步是把图先缩到 32²/48²/64²,再用 k 均值聚类(把相近的颜色归并成一类)把颜色压到 512 种 (长度再省四分之三)5。即便如此,iGPT-L 在一块 Tesla V100 上要训约 2 500 天, 同性能的 CNN 方法(MoCo)只要 70 天,参数还是人家的 2~3 倍6

它换来什么?两个重要发现。第一,特征的「好」可以单独考:线性探测就是「冻结整个模型,只在抽出的特征上训一个 最简单的分类器(拿特征输出答案的那一小层)」——结果表明中间几层的特征比最后一层更适合做分类, 因为 iGPT 每层都在忙着「猜像素」,反而中间层攒下了最多图像信息7

第二,容量与泛化(在没见过的数据上的表现)成正比:模型越大,同损失下泛化越强, 且「准确率还有继续提升的空间」8。任务配比上,自回归训练优于 BERT 式训练, 两者集成最优9

边界同样清楚:图像被压到 32×32 细节尽失(「损失很多信息」),而 CNN 用滑窗 轻松吃大图;补全效果逃不开训练数据的分布——数据里有什么,它就补什么。书里的判词是:方向对了,用的网络不对—— 「也许 Transformer-XL 才是更适合 iGPT 使用的网络结构」10 (第 10 章讲它)。

3.3 Swin:把「全部配对」改成「窗口内配对」

Swin Transformer 要解决的就是那张平方账,外加另一个隐患:分类能用的 Transformer, 做分割这种密集预测「并不擅长解决」11——分割需要多层次的特征图,而 iGPT 那种 一条序列压到底的结构给不出。

主走查:一张 224×224 的图走进 Swin-T 的第 1 阶段(书中源码的默认超参数——开工前先定好、训练中不去学的那些设置)12:

224×224×3
│ ① 块合并:4×4 像素并成一个小块(滑窗,不跳格),每块 4×4×3=48 个数

56×56 个小块,每个 48 维 → 线性映射成 96 维(块合并,作用类似池化但不丢响应)
│ ② 切窗:56÷7=8,共 8×8=64 个 7×7 的窗口

W-MSA:注意力只在每个窗口内部算
│ ③ 窗口移位:整体循环上移、左移半个窗口(3~4 格),换个切法再算一次(SW-MSA)

每块输出仍是 96 维;重复「不动一次+移位一次」,层层向上

第一步的细节:块合并用滑窗把每 4×4 像素摊成一条 48 维的向量(一串按顺序排好的数),再线性映射到 96 维。 书里特意对比了池化:最大池化「会丢弃窗口内的低响应值,而采用块合并的策略并不会丢弃 其他响应」,代价是运算量增加13

真正的核心是第二步。自注意力的计算瓶颈在「所有位置两两配对」:全图配对,计算量随 像素数的平方涨;W-MSA 只在 7×7 窗口内配对,计算量降到「窗口数 × 窗口内配对」, 即随图像尺寸线性增长14。用书里的话说:整图的逐像素比较是平方, 窗口内的逐像素比较把平方按窗口拆碎了算15

第三步补的是拆窗的副作用。「单独使用 W-MSA 得到的网络的建模能力是非常差的」—— 窗口之间老死不相往来16。Swin 的解法轻巧:把特征图整体循环滚动半个窗口, 原本隔着窗的两块邻居落进同一个新窗口,再算一次注意力;滚动产生的「缝合边」 (原图不相邻的两条边被拼在一起)用掩码盖掉,不让它们互相看到1718。 一动一静成对出现,这就是为什么 Swin 的层数必须是偶数。

Swin 的成绩与保留意见:它在分类、检测、分割上都达到先进水平,书里赞它 「充分考虑 CNN 的位移不变性、尺寸不变性、感受野与层次的关系」;但同一节也泼了两盆冷水—— 它没有给出上采样方案,而且每个窗口各自一套 Q、K、V,「并不具有 CNN 一个特别重要的 特性:权值共享」,速度仍落后同级 CNN,「在嵌入式平台上 CNN 还有着不可撼动的地位」19

3.4 CSWin:十字窗,两层看全图

Swin 的窗口要靠层层移位慢慢扩大视野。CSWin 的解法定居在「十字」上:把注意力头 一半给横向长条、一半给纵向长条,各自做条内注意力再拼接20。条宽 sw 逐阶段加宽 (取值 [1,2,7,7],速度与精度的折中)21。妙处是一条横条+一条竖条两层叠加, 任意像素就「看见」了整行加整列的并集——两层就拿到全局感受野22。 它还把位置信息直接乘在值向量上(局部加强位置编码——给每个位置发一张「身份牌」——用一个深度卷积捕获当前像素与 邻居之间的位置关系)23,等于「注意力分支+卷积分支」双管齐下。书里的小结很冷静: CSWin「披着 Transformer 的外衣」,但的确是 Transformer 和卷积的混合物, 连十字窗的思路都能在 2019 年的 CCNet 里找到前身24

3.5 MLP-Mixer:去掉卷积的名字,去不掉卷积的实质

MLP-Mixer 出场时自带热搜体质:「争议非常大的号称全部由 MLP 组成的图像分类模型」, 公众号一度宣布「CNN 的时代」过去了25。书里用一章的功课把它拆开,零件全是老熟人:

  • 切块+共享全连接 = 一个步长与核相同的普通卷积;
  • 标记(token——把图切出来的小块)混合 = 深度卷积——按通道独立卷;
  • 通道混合 = 1×1 卷积(第 02 章);
  • 每个「MLP」= 两个全连接夹一个 GELU 激活26

书里的结论一针见血:「MLP-Mixer 从本质上来说就是一个特殊形式的 CNN」,它「最终还是 没有脱离 CNN 的范畴」,LeCun 说它是「挂羊头,卖狗肉」一点也不奇怪27。 效果上它还依赖 JFT-300M 这种海量私有预训练数据才打得过对手28。作者的收尾送给 所有读者:「各位 CV 领域的同行们完全不必惊慌,也没必要被一些微信公众号影响,继续放心地 研究 CNN 吧!」29

判断(我们的,不是书里的): 这一章其实是同一笔账的三种付法——iGPT 全额付 (平方,烧 2500 天),Swin 分期付(按窗口拆碎,付线性),Mixer 假装不付 (换名字,账还在)。以后遇到「全新架构」,先问一句:那笔平方账它打算怎么付? 如果错,会错在: 如果某类任务的空间冗余极高(比如视频帧间几乎不动), 全局配对的平方账可能换来别的收益;但至少在 2022 年书成稿时,没有反例。

4. 作者的判断与证据

书里给了实验证据的: iGPT 的线性探测曲线与三条容量结论、AR 对 BERT 任务、 2 500 天对 70 天的算力账(转述论文);Swin 的复杂度(计算量随输入变大的增长速度)推导(式 1.46,M² 对 hw 的对照); 块合并对比池化的分析;MLP-Mixer 的「拆开=深度可分离卷积」是结构等价论证,不是跑分。

作者的个人判断: 「Transformer-XL 或许更适合 iGPT」是作者的建议;对 Swin 「称为骨干网络还为时尚早」的两条保留、对 MLP-Mixer 的拆穿,都是书里明确署名的态度。

5. 边界与局限

  • 本章四个模型全部早于或止于 2022 年;ViT(书里只在 Swin 一节顺带对比)后来成为 更主流的基线(大家做对比时默认选的那一个),但 Swin 的窗口思想被大量沿用——书的选择是讲透机制而非追全名录;
  • iGPT 的「中间层特征最好」结论来自它的逐像素预训练目标;换成别的训练目标 (比如换一种不用标签的训法)分层规律会变,不能直接推成「Transformer 都是中间层最好」;
  • 书里没有讲 ViT 的 class token 与其位置编码细节——这些在第 10、11 章的 Transformer 机制里补齐。

6. 可带走的

  1. 图像可以排成序列来喂,但自注意力的平方账要用图像尺寸来付——先算这笔账再谈架构;
  2. 线性探测是考「特征本身好不好」的最便宜手段:冻住模型,只训一个简单分类头;
  3. Swin 的两个关键词:窗口内配对(平方变线性)、一动一静成对移位(补跨窗口通信);
  4. 滚动拼接产生的「假邻居」要用掩码盖住——拼接位置必须配套「不许跨缝合边互看」的隔离;
  5. CSWin 的十字条设计说明:全局视野不一定靠堆深度,几何结构也能给;
  6. 看到「全 X 架构」的宣称,先把它的每个模块翻译回已知零件再下结论(MLP-Mixer 教训);
  7. 卷积的四大美德——局部性、权值共享、层次感受野、平移不变——至今仍是衡量 新骨干的标尺。

7. 原文地图

主题原书节原文位置
iGPT 定位与后续1.8 像素向量:iGPTtext/04-p61-80.txt:4(搜「思维困境」) · text/04-p61-80.txt:6(搜「DALL-e」)
两种预训练任务、线性探测1.8.1 iGPT 详解text/04-p61-80.txt:11(搜「预测下一个像素」) · text/04-p61-80.txt:15(搜「线性探测」)
序列长度的平方账1.8.1 iGPT 详解text/04-p61-80.txt:29(搜「3 072」) · text/04-p61-80.txt:30(搜「力不从心」)
光栅展开与颜色聚类1.8.1 iGPT 详解text/04-p61-80.txt:53(搜「光栅扫描顺序」) · text/04-p61-80.txt:49(搜「均值聚类」)
无位置编码、iGPT 四型号1.8.1 iGPT 详解text/04-p61-80.txt:131(搜「并没有加入位置编码」) · text/04-p61-80.txt:147(搜「68.01 亿」)
中间层最好、容量结论1.8.1 / 1.8.2text/04-p61-80.txt:164(搜「中间的层反而会有更多」) · text/04-p61-80.txt:174(搜「容量越大」) · text/04-p61-80.txt:187(搜「效果是最优的」)
算力代价1.8.3 小结text/04-p61-80.txt:199(搜「2 500 天」) · text/04-p61-80.txt:200(搜「2 ~ 3 倍」)
低分辨率与数据偏差1.8.3 小结text/04-p61-80.txt:202(搜「损失很多信息」) · text/04-p61-80.txt:204(搜「Transformer-XL 才是更适合」)
Swin 要解决的两个问题1.9 Swin Transformertext/04-p61-80.txt:218(搜「几百个像素点」) · text/04-p61-80.txt:221(搜「密集预测的场景」)
块合并对比池化1.9.1 网络结构详解text/04-p61-80.txt:345(搜「类似于 CNN 中」) · text/04-p61-80.txt:358(搜「低响应值」)
复杂度从平方到线性1.9.1 网络结构详解text/04-p61-80.txt:534(搜「线性比例」) · text/04-p61-80.txt:550(搜「窗口内进行逐像素比较」)
移位窗口与掩码1.9.1 网络结构详解text/04-p61-80.txt:571(搜「建模能力是非常差」) · text/04-p61-80.txt:577(搜「循环上移和循环左移」) · text/04-p61-80.txt:611(搜「相似度无意义」)
权值共享批评1.9.3 小结text/04-p61-80.txt:681(搜「权值共享」) · text/04-p61-80.txt:683(搜「不可撼动」)
CSWin 十字窗、两层全局1.10 CSWin Transformertext/04-p61-80.txt:695(搜「十字形」) · text/04-p61-80.txt:727(搜「速度和精度上取得了比较好」) · text/04-p61-80.txt:746(搜「只需要两层就可以得到全局感受野」)
LePE 位置编码1.10.3 局部加强位置编码text/04-p61-80.txt:763(搜「局部加强位置编码」) · text/04-p61-80.txt:769(搜「邻居之间的位置关系」)
MLP-Mixer 拆解1.11 MLP? :MLP-Mixertext/05-p81-100.txt:24(搜「争议非常大」) · text/05-p81-100.txt:100(搜「深度可分离卷积」) · text/05-p81-100.txt:125(搜「挂羊头」)
效果依赖与收尾1.11.2 讨论text/05-p81-100.txt:131(搜「JFT-300M」) · text/05-p81-100.txt:133(搜「不必惊慌」)

Footnotes

  1. 出处:「1.8 像素向量:iGPT」(text/04-p61-80.txt:4,搜「思维困境」)。原文:「这篇论文的最大贡献在于突破了使用 CNN 解决图像问题的思维困境……使得 CV 和 NLP 领域之间的差距缩到了几乎为 0」。

  2. 出处:「1.8.1 iGPT 详解」(text/04-p61-80.txt:72,搜「d 维的嵌入向量」)。

  3. 出处:「1.8.1 iGPT 详解」(text/04-p61-80.txt:11,搜「预测下一个像素」)与(text/04-p61-80.txt:64,搜「0.15 的概率」)。MLM 掩码比例 0.15,与 BERT 相同。

  4. 出处:「1.8.1 iGPT 详解」(text/04-p61-80.txt:29,搜「3 072」)与(text/04-p61-80.txt:30,搜「力不从心」)。

  5. 出处:「1.8.1 iGPT 详解」(text/04-p61-80.txt:49,搜「均值聚类」)。原文:对 RGB 数据做 k=512 的 k 均值聚类,长度比 RGB 短 3/4。

  6. 出处:「1.8.3 小结」(text/04-p61-80.txt:199,搜「2 500 天」)与(text/04-p61-80.txt:200,搜「2 ~ 3 倍」)。

  7. 出处:「1.8.1 iGPT 详解」(text/04-p61-80.txt:15,搜「线性探测」)与(text/04-p61-80.txt:164,搜「中间的层反而会有更多」)。

  8. 出处:「1.8.2 实验结果分析」(text/04-p61-80.txt:179,搜「继续提升的空间」)。

  9. 出处:「1.8.2 实验结果分析」(text/04-p61-80.txt:185,搜「要优于基于 BERT」)与(text/04-p61-80.txt:187,搜「效果是最优的」)。

  10. 出处:「1.8.3 小结」(text/04-p61-80.txt:204,搜「Transformer-XL 才是更适合」)。

  11. 出处:「1.9 Visual Transformer 之 Swin Transformer」(text/04-p61-80.txt:221,搜「密集预测的场景」)。

  12. 出处:「1.9.1 网络结构详解」(text/04-p61-80.txt:314,搜「hidden_dim=96」)。超参数:hidden_dim=96、layers=(2,2,6,2)、heads=(3,6,12,24)、window_size=7、downscaling_factors=(4,2,2,2)。

  13. 出处:「1.9.1 网络结构详解」(text/04-p61-80.txt:345,搜「类似于 CNN 中」)与(text/04-p61-80.txt:358,搜「低响应值」)。

  14. 出处:「1.9.1 网络结构详解」(text/04-p61-80.txt:534,搜「线性比例」)。

  15. 出处:「1.9.1 网络结构详解」(text/04-p61-80.txt:549,搜「逐像素比较」)。原文:「如果比较的范围是一幅图像,那么计算的瓶颈就在于整幅图像的逐像素比较,因此复杂度是 (hw)²。而 W-MSA 是在窗口内进行逐像素比较的,因此复杂度是 M²hw」。

  16. 出处:「1.9.1 网络结构详解」(text/04-p61-80.txt:571,搜「建模能力是非常差」)。

  17. 出处:「1.9.1 网络结构详解」(text/04-p61-80.txt:577,搜「循环上移和循环左移」)。

  18. 出处:「1.9.1 网络结构详解」(text/04-p61-80.txt:611,搜「相似度无意义」)。滚移后图像右、下边由原图两条不相邻的边拼成,用 upper_lower_mask 与 left_right_mask(−inf 掩码)盖住。

  19. 出处:「1.9.3 小结」(text/04-p61-80.txt:681,搜「权值共享」)与(text/04-p61-80.txt:683,搜「不可撼动」)。

  20. 出处:「1.10.2 十字形窗口自注意力机制」(text/04-p61-80.txt:716,搜「横向」)。原文:由并行的横向自注意力和纵向自注意力组成,头对半分。

  21. 出处:「1.10.2 十字形窗口自注意力机制」(text/04-p61-80.txt:727,搜「速度和精度上取得了比较好」)。

  22. 出处:「1.10.2 十字形窗口自注意力机制」(text/04-p61-80.txt:746,搜「只需要两层就可以得到全局感受野」)。原文:横条内任意点的感受野是同行同列,再一层即覆盖全图。

  23. 出处:「1.10.3 局部加强位置编码」(text/04-p61-80.txt:763,搜「局部加强位置编码」)与(text/04-p61-80.txt:769,搜「邻居之间的位置关系」)。

  24. 出处:「1.10.6 小结」(text/05-p81-100.txt:13,搜「外衣」)与(text/05-p81-100.txt:17,搜「CCNet」)。

  25. 出处:「1.11 MLP? :MLP-Mixer」(text/05-p81-100.txt:24,搜「争议非常大」)。

  26. 出处:「1.11.1 网络结构」(text/05-p81-100.txt:92,搜「深度卷积」)与(text/05-p81-100.txt:100,搜「深度可分离卷积」)。MLP1 对应深度卷积、MLP2 对应 1×1 卷积、GELU 夹层。

  27. 出处:「1.11.2 讨论」(text/05-p81-100.txt:122,搜「特殊形式的 CNN」)与(text/05-p81-100.txt:125,搜「挂羊头」)。

  28. 出处:「1.11.2 讨论」(text/05-p81-100.txt:131,搜「JFT-300M」)。

  29. 出处:「1.11.2 讨论」(text/05-p81-100.txt:133,搜「不必惊慌」)。