AI 看图只懂"16×16 的方块"够不够?—— 2021 年的这篇论文说"不够",在 patch 里再开一层 Transformer
- 关联论文:2103.00112
你有没有这种感觉?
你让 AI 看一张猫的照片。AI 告诉你"这是一只猫"。 但你想问:"AI 是怎么看到猫的胡须、爪垫、耳朵绒毛的?" 大部分 ViT 模型答不上来——它们把图片压成了 16×16 的方块阵列,每个方块就是一个 token,细节被压扁了。
这就是 Han 等人(华为诺亚方舟实验室 + 北大 + 中山大学)2021 年 NeurIPS 这篇 TNT 想解决的问题:
在 ViT 的每个 patch 里再开一层 Transformer——把 16×16 的 patch 当成"视觉句子",再切成 4×4 的"视觉词",让 word 级别也跑一遍注意力。
结果:ImageNet top-1 比同代 DeiT-S 高 1.7 个百分点(81.5% vs 79.8%),参数量几乎不变(24M vs 22M),显存只多 0.6 GB——这是 2021 年视觉 Transformer 架构创新中最具代表性的工作之一,paper card 报告 S2 引用 2,273 次。
关键洞察:patch 粒度太粗,patch 内部结构被压扁了
2020 年 ViT 把图像切成固定大小(典型 16×16)的 patch,每个 patch 拉平成 token 再走 Transformer。这套抽象有两个隐忧:
- patch 粒度太粗:一块 16×16 的区域可能同时包含背景、纹理和物体局部,单一 token 表达力不够。
- patch 之间只能靠全局 Self-Attention 沟通,patch 内部结构被压平成一个向量,丢失了局部几何与纹理细节。
作者把这些 16×16 patch 视作「visual sentence」,把每个 patch 再切成更小的「visual word」,让 word 级别也跑一遍注意力,从而保留局部结构信息。
核心思路对比:
| 模型 | patch 粒度 | 注意力范围 | 局部结构保留 |
|---|---|---|---|
| ViT | 16×16 | 全局 | ❌(patch 内被压平) |
| DeiT | 16×16 | 全局 | ❌(同 ViT,靠数据+蒸馏) |
| Swin | 7×7 窗口 | 局部 + 层次化 | ✅(窗口 attention) |
| TNT | 16×16 → 4×4 嵌套 | patch 内 + 全局 | ✅(双层 attention) |
一句话讲明白:什么是 Transformer in Transformer(TNT)?
# 单个 TNT Block 的伪代码
for each stage_block:
# 1) patch 内 word 注意力
words_in = rearrange(words, (B, n_s, n_w, D) → (B*n_s, n_w, D))
words_out = InnerTransformer(words_in) # n_w 个 word 互相注意
words = WordPosEmb(words_out) # 加 word 位置编码
# 2) word 聚合到 sentence
sentences = sentences + PixelAggregate(words) # 把 word 特征加回 sentence
# 3) sentence 级别全局注意力
sentences = SentenceTransformer(sentences) # patch 之间互注意
sentences = SentencePosEmb(sentences) # 加 sentence 位置编码
两个 Transformer 同时跑:
- 外层(Sentence Transformer):以 patch(visual sentence)为 token,做标准的全局 Self-Attention——负责"图的整体布局"。
- 内层(Inner Transformer):以 patch 内的 sub-patch(visual word)为 token,做 patch 内局部 Self-Attention——负责"patch 的细节纹理"。
两个位置编码独立:Sentence Pos-Emb 标 patch 序列;Word Pos-Emb 标 patch 内 sub-patch 序列。
复杂度可控:内层只处理每个 patch 内部的 word(4×4 = 16 个),不会爆炸。
为什么这件事对(不搞 AI 的)你也重要
你今天用的「手机拍照 AI 修图」「相册自动分类」「AI 医生看 CT 片」「自动驾驶视觉感知」「AI 内容审核」——背后视觉骨干网络大部分都受到了"在 patch 内再开一层注意力"这个思路的影响。
更重要的是,2021 年的 TNT 引发了一整代"双层 / 嵌套 Transformer"架构创新:
- 细粒度图像分类:需要区分"秋田犬 vs 柴犬"这种靠纹理细节区分的任务,patch 内 attention 天然友好
- 医学影像:CT / MRI 病灶通常很小,patch 内结构信息(边缘、纹理)至关重要
- 遥感图像:建筑物边缘、农田纹理是小目标识别核心,TNT 思想启发了大量后续工作
- AI 内容审核:需要识别图片局部细节(暴力 / 色情 / 侵权),双层 attention 比单层 ViT 更鲁棒
如果你是 AI 产品经理:视觉模型的"局部细节建模能力"是 2021 年之后的核心竞争点——Swin / ConvNeXt / TNT 都从不同角度回应这个问题。
真实类比:为什么"两层 Transformer"比"一层"好?
想象你要让 AI 看一张有 100 个人的会议照片,任务是"找出穿红衣服的人":
- 方案 A(单层 ViT):AI 把照片切成 100 个 16×16 的方块,每个方块是一个 token——但如果"红衣服的人"只占 1 个方块的一半,token 平均后红色信号被稀释。
- 方案 B(TNT 双层):AI 先把每个 16×16 方块切成 16 个 4×4 的小方块(visual word),让"红色信号"在小方块级别先被识别出来;再让方块之间互相注意——两层 attention 让"红色"这个细节信号从不被平均掉。
LLM 处理"长文本"也是同样的逻辑——不是简单地把段落压成一个 token,而是让 token 内(短语)和 token 间(段落)都保留结构信息。
⚠️ 工程硬约束:5 个必须看清的边界
- 2021 年水平的 81.5% 在 2026 年已无竞争力:ImageNet SOTA 已到 90%+。TNT 是"思路奠基"工作,不是"出活工具"——2026 年用 TNT 当 backbone 不划算,Swin / ConvNeXt / EVA 系列已超越。
- FLOPs 比 ViT 多 13%:5.2G vs 4.6G——单卡推理会比同代 ViT 慢一点,边缘部署要算账。
- 代码在 CV-Backbones 合集仓库(非专用 TNT repo):clone 后要在
pytorchcv/backbone/tnt.py找核心实现——别按"transformer-in-transformer"搜 GitHub,会找不到。 - DeiT 对比基准需注明:原文与 DeiT-S(无蒸馏版)对比——DeiT-S/384(蒸馏版)效果更好,引用时务必区分。
- 没引入层次化结构:Swin 的杀手锏是"局部窗口 + 层次化下采样",TNT 仍是纯 attention 路线 + 均匀 16×16 patch——在高分辨率(>224)下显存增长快,因为 patch 数翻 4 倍 sub-patch 数翻 16 倍。
适合谁读 / 不适合谁读
✅ 适合: - 想理解"为什么 ViT 之后还需要架构创新"的视觉工程师 - 做细粒度分类 / 医学影像 / 遥感图像的小样本团队 - 想给 AI 产品经理讲清楚"双层 attention 为什么 work"的科普作者 - 想看 Transformer 嵌套结构如何扩展到 NLP / 多模态的研究者
❌ 不适合: - 只想用 SOTA backbone 出活的人(直接用 ConvNeXt / EVA / Swin V2) - 边缘部署 / 移动端推理(TNT-S 5.2G FLOPs 在 <5W TDP 设备吃力) - 高分辨率(512+)输入(patch 数爆炸) - 想要训练资源友好的人(TNT 比 DeiT 慢,比 Swin 还慢)
一句话给老板
"ViT 把图片切成 16×16 的方块,每个方块压成一个向量,局部纹理被压扁了。TNT 的解法是在 patch 里再开一层 Transformer——把 patch 当'视觉句子'、sub-patch 当'视觉词',让两层 attention 同时跑。ImageNet 比 DeiT-S 高 1.7%,参数量几乎不变,这套'双层嵌套 attention'思想是 2021 年后视觉架构创新的母版之一。被引 2,273 次,今天 Swin / ConvNeXt / EVA 的局部细节建模能力都受其启发。"
三个标题变体
- 《AI 看图只懂"16×16 的方块"够不够?—— 2021 年的这篇论文说"不够",在 patch 里再开一层 Transformer》
- 《为什么 ViT 看不到猫的胡须?—— TNT 用"Transformer in Transformer"把 patch 内结构留住了》
- 《被引 2,273 次的视觉架构论文:把图像切成"视觉句子"再切成"视觉词",ImageNet 高 1.7%》
📱 小红书风格卡片文案
📌 AI 看图为什么总漏掉细节?
你有没有这种感觉——
让 AI 看一张猫的照片。AI 告诉你"这是猫"。 你问"AI 是怎么看到胡须、爪垫、耳朵绒毛的?" ViT 答不上来——它把图片压成了 16×16 的方块阵列,细节被压扁了。
2021 年 Han 等人(华为诺亚 + 北大)做了一件事:
在 ViT 的每个 patch 里再开一层 Transformer——把 16×16 patch 当"视觉句子",切成 4×4 的"视觉词",让 word 级也跑注意力。
🔸 核心洞察: patch 粒度太粗 + patch 内结构被压平—— - 一块 16×16 区域可能同时含背景、纹理、物体局部 - 单一 token 表达力不够,纹理细节丢失
🔸 TNT 解法(双层 Transformer):
每个 TNT Block:
├── Inner Transformer(patch 内)
│ ├── 输入:16 个 4×4 sub-patch(visual word)
│ ├── 跑 word 级别 Self-Attention
│ └── 加 Word Pos-Emb
├── Pixel Aggregate
│ └── 把 word 特征聚合回 sentence
└── Sentence Transformer(patch 间)
├── 跑 patch 级别全局 Self-Attention
└── 加 Sentence Pos-Emb
🔸 关键数据: | 模型 | 参数量 | FLOPs | Top-1 | |---|---|---|---| | ViT-S/16 | 22M | 4.6G | 79.9% | | DeiT-S | 22M | 4.6G | 79.8% | | TNT-S | 24M | 5.2G | 81.5% ⭐ | | Swin-S | 50M | 8.7G | 83.0% |
比 DeiT-S 高 1.7%,参数量几乎不变,显存只多 0.6 GB。
🔸 为何重要: TNT 引发了一整代"双层 / 嵌套 Transformer"架构创新——
应用场景: - 手机拍照 AI 修图 - 相册自动分类 - AI 医生看 CT / MRI - 自动驾驶视觉感知 - AI 内容审核 - 细粒度图像分类(秋田犬 vs 柴犬) - 医学影像(病灶小,纹理关键) - 遥感图像(建筑物边缘)
🔸 架构对比: - ViT:单层全局 attention,patch 内被压平 ❌ - DeiT:单层全局 attention + 数据增强 + 蒸馏 - Swin:层次化局部窗口 attention ✅ - TNT:双层嵌套 attention(patch 内 + 全局)✅
⚠️ 2026 年警示:
- ⚠️ 2021 年 81.5% 在 2026 已无竞争力(SOTA 90%+)
- ⚠️ FLOPs 比 ViT 多 13%(5.2G vs 4.6G),边缘部署算账
- ⚠️ 代码在 CV-Backbones 合集仓库,clone 后找 pytorchcv/backbone/tnt.py
- ⚠️ DeiT-S 对比是无蒸馏版,DeiT-S/384(蒸馏版)效果更好
- ⚠️ 高分辨率(512+)输入下 patch 数翻 4 倍、sub-patch 翻 16 倍
💡 何时该读 / 不该读: ✅ 想理解 ViT 之后为什么还需要架构创新 ✅ 做细粒度 / 医学 / 遥感的小样本团队 ✅ 想给 AI 产品经理讲"双层 attention 为什么 work" ❌ 想直接用 SOTA backbone 出活(用 ConvNeXt / EVA / Swin V2) ❌ 边缘部署 / 移动端推理 ❌ 高分辨率(512+)输入
📎 arXiv 2103.00112 · 被引 2,273 次(Semantic Scholar 2026) 📅 2021 年 NeurIPS,华为诺亚方舟实验室 + 北大 + 中山大学
💬 评论区聊聊:你用过哪些"AI 看图漏掉细节"的产品?最想要哪种"局部纹理也能看清"的视觉 AI 能力?