Ch.07
视觉模型演进:CNN 看局部,ViT 看全局
用两种方式读同一张照片。CNN 滑动小卷积核(局部窗),从邻近像素堆特征;ViT 把图切成 patch token,用全局自注意力在单个块 也能混合远距离上下文;并用窗口注意力分摊成本。
CNN
学习流程
CNN 像推着放大镜读街坊;ViT 像村民大会一起发言。
ViT 把图像切成小片(patch),再像单词一样送进 Transformer。从第一个 块 起,所有 patch 彼此对视,用全局自注意力决定“谁和谁说话”,因此屏幕左端与右端的关系也能一次对齐。
长期主导视觉的 CNN(卷积网络) 则用小窗口(卷积核)在图像上滑动,只直接看到邻近像素并逐层堆特征。层越深,“可见范围(感受野)”越宽,但单层通常不会一次性看完整张图。同一滤波器在位置上复用(权重共享),参数更少;局部性这一强假设也让小数据时更常稳定。
分层窗口注意力 介于二者之间:用窗口内局部注意 + 窗口平移 + token 合并,在不把全局一口吞下的前提下分层混合全局上下文。当 token 数 变大时,可缓解易爆炸的 压力。
本章把 CNN 与 ViT 并排,从数据、任务、GPU 显存出发整理哪种假设更占优。一句话:“CNN从邻居慢慢铺,ViT像开全场会(但要付算力与数据成本)”。
关键公式怎么读(CNN vs ViT)
1)CNN 局部混合: 在位置 ,一个神经元用核 混合输入的小邻域:
(边界与 padding 依实现而定)。所有位置共享同一个 的权重共享是 CNN 的核心。
2)ViT 单块的“全局一次”: 由 patch token 矩阵 构造 ,再
其中 天然接近 token×token; 大时 往往先成为天花板(自注意力常见成本图景)。
3)“看得更远”的两种方式:
① CNN: 堆层/池化/步幅卷积下采样,让输出神经元间接扩大感受野。
② ViT(密集): 一个注意块内直接比较所有位置对,实现“一步全局”(代价更高)。
4)用分层窗口拆分 压力:
① 成本: 一大,ViT 的 往往最先痛。
② 折中: 窗口内约 量级重复局部注意,用 窗口平移 跨边界混合,用 token 合并 减 。
③ 一句话: 不是“一口吞全局”,而是“把小范围全局分层合成”。
CNN 与 ViT:阅读同一幅图像的两种语法
1. CNN:推着放大镜“只看邻居”(局部性)
概念: CNN 用很小的滤波器(例如 的放大镜)在图像上滑动扫描。在某个位置当下只看到 周围 ,把结果交给下一层,上下文就一点点变宽。
直觉: 层越深,感受野(receptive field)越逐步扩大。浅层抓线、角等简单模式,深层识别眼、耳、鼻等语义部位。同一卷积核在多个位置复用(权重共享),参数更少;猫在照片左或右,都能用相近滤波器响应,这带来近似的平移等变性(translation equivariance)。
公式直觉: 每个输出点是输入局部块与核的互相关(卷积)。深度 增加时,感受野逐层变大,远处像素也会间接被混合。
2. ViT:把 patch 当单词,“全场同时讨论”(全局性)
概念: 图像切成 的 patch(如 ),每个 patch 变成向量(token)。密集自注意力的一个块里(标准设定下)所有 patch 对都会计算彼此关联。
直觉: CNN 像街坊放大镜,ViT 更像一次俯瞰的无人机:第一个块也能对齐屏幕两端关系;但 patch 数 变大时,记录“谁和谁多相关”的分数矩阵大约按 膨胀,显存与算力迅速变重。
记住量级: 注意力打分阶段常被感知为 量级(常数因头数与实现而异)。
3. 不把“全局”一口吞下的分层折中
联系: 先在窗口(小区)内做注意,用 窗口平移 跨边界混合,再用 token 合并 减少 。也就是用多次“小范围的全局”叠出大图景的分层策略。
一句比喻: CNN 像地方台,ViT 像全国直播辩论,窗口式设计像地方台联网拼全国新闻。窗口·平移·合并 站在“CNN 与 ViT 之间”的原因,可与本章 CNN/ViT 对照轴一起理解。
4. 为什么要同时搞懂「CNN vs ViT」?(工程选型)
选模型不是挑排行榜一行,而是挑一张对数据的“假设表”。
* 数据少或领域难:近邻像素相关这一假设强的 CNN/混合 往往收敛更快更稳。
* 数据很多且有强预训练:更少受局部束缚的 ViT 系 常在上限性能(SOTA)更占优。
* 自动驾驶检测/分割等需要像素级、多尺度:分层窗口骨干、ConvNeXt、FPN 等下采样金字塔这类 CNN 式套路仍然很强。
* 成本: 一大 ViT 先 OOM 很常见,高效注意力与窗口分层是同一焦虑下的工程旋钮。
为何重要
模型选择是“假设表”,不是“成绩表”
CNN 把“图像里近邻像素更相关”这种强归纳偏置(局部·共享·层次)写进结构。ViT 更接近“少预设,让 patch 关系主要从数据学”,换得灵活全局混合,但常要付出更多数据与算力/显存。
不懂这层差异,就容易把热门骨干代码直接搬来,却在自家数据上看不懂为何掉点——只剩日志难解释。要练的是选匹配问题的假设,而不是背榜单第一的名字。
混合结构与骨干设计的共同语言
趋势是 CNN 与 Transformer 边界变糊:patch 嵌入 + CNN stem 先抓低频;窗口注意力 + 卷积下采样降分辨率;或 ConvNeXt 这种“仍是 CNN,但块设计像 Transformer”。
调试时比名字更重要的是:一层一眼能看多远、代价多高。把感受野、token 数 、、窗口尺寸说清楚,团队沟通与排障会快很多。
本章要带走的东西
本章把 CNN(局部、感受野、权重共享) 与 ViT(patch、全局自注意力、 与 ) 放在 同一条轴 上对照。学完后,你能用清晰的语言讨论:为何只有 ViT OOM 时应先动 token / patch / 分辨率,以及在标签很少时如何在 归纳偏置与数据 之间做首选基线。
本章目标不是背流行骨干的名字,而是带走一个 决策框架:结合 你的任务、GPU 预算与标注规模,愿意为 局部 vs 全局 付出多少。
如何应用
1. CNN 的主战场:端侧(On-Device)、边缘(Edge)、实时
轻、快意味着:不必依赖远端大模型、必须在设备本地立刻响应的场景,CNN 仍然占绝对多数。
* 手机相机滤镜与人脸解锁(Face ID 等): 既要省电,又要在约 0.1 秒内抓到脸部轮廓等局部特征,因此常见 MobileNet 这类轻量 CNN。
* 工厂传送带缺陷检测: 一秒流过几十件时,要把表面细微划痕/压痕做实时检出,YOLO 系列等 CNN 检测器非常合适。
* 行车记录仪与低时延辅助驾驶: 行人突然闯入时,约 0.01 秒级就要触发制动;相比可能带来额外时延的 transformer,更快的 CNN 链路往往是生命线。
2. ViT 的主战场:超大 AI、生成式、多模态
在能投入大量服务器/GPU、需要超越人类的深度理解之处更常见。与 LLM 同属 transformer 范式,因此与语言模型结合特别顺。
* ChatGPT 看图(GPT-4V 一类): 上传小票照片即可读字与摘要——文本与视觉可在同一 transformer 空间对齐;图像侧常用 ViT(或其变体)充当“眼睛”。
* Midjourney、DALL·E 等生成式: 当你输入「穿宇航服抽万宝路的猫」这类提示词,模型内部(DiT:Diffusion with Transformer)也会用到 ViT 式骨架,用全局关系把整体画面组织得不别扭。
* 医疗/卫星影像精读: 如转移模式、广域地形变化,往往比单像素更需要整图宏观语境,全局混合更有优势。
3. 实战混合(CNN + ViT):工程上的黄金平衡
真实团队很少二选一,而是混搭最多。
* 套路: 高分辨率输入先走 CNN 前几层,快速降采样并抽取边缘/纹理;再在更深层接 ViT/Transformer,在更小的 token 网格上处理长距离关系。
* 案例: Google CoAtNet、Apple MobileViT 等,为了在移动端也能跑 transformer,广泛采用这种结构。
小结
CNN 用 局部卷积 与 权重共享 从邻域逐层堆特征,并随深度扩大 感受野,以 间接 方式覆盖更远上下文。ViT 把图像切成 patch token,用 稠密自注意力 在单块内做 全局混合;但 变大时 会让 显存与算力 迅速吃紧。
窗口注意力 + 平移 + 合并 这类 分层窗口 是拆分 成本的常见折中。选型时应同时考虑 数据与预训练规模、分辨率/ patch / 、是否需要 密集预测(检测/分割)、以及 时延与 GPU 显存。
解题说明
先这样读题
- 分清题目在考哪条轴:CNN 局部与感受野 / ViT patch 与全局注意力 / 数据与归纳偏置
- 计算题先固定单位:token 数 ,输入 ,patch → 格子约
- 看到 '' 就联想到 密集自注意力的 token×token 分数矩阵
示例(概念)
"CNN 在每个空间位置复用同一核,最典型的性质是?"
① 全局注意力
② 权重共享
③ patch 合并
④ CLS 标记
答案 2
为什么? 权重共享是 CNN 的默认设定,与 ViT 的 patch token 不是同一条轴。
示例(判断)
"典型 CNN 第一层卷积会一次性直接看到整幅图像"
答案 0(错)
为什么? 浅层看局部 patch,更广视野随深度间接形成。
示例(计算)
" 时 是多少?" → 100
按题型示例 + 理由
示例(情景)
"高分辨率训练 ViT 出现 OOM,最先做什么?"
① 只加 批大小
② 调整 token(分辨率/patch 尺寸/批大小)
③ 只堆全局块
答案 2
为什么? 优先直接降低显存压力。
示例(选择计算)
"、patch 时 patch token 数(仅网格)?"
① 14
② 196
③ 224
④ 3136
答案 2(数值 196)
为什么? 。
示例(概念选择)
"标签很少,想要又快又稳的基线?"
① 巨型 ViT 从头训
② 小型 CNN + 数据增强
③ 没数据硬训
答案 2
为什么? 局部归纳偏置更容易稳住训练。
示例(综合)
"分辨率与增强相同,只有 ViT OOM,下一步查?"
① 优化器
② patch 尺寸/序列长度/梯度检查点
③ 日志编码
答案 2