第 3 讲导览 · 深度计算机视觉
这一讲要解决的真实问题
把一张图喂给第 1 讲的 MLP,会发生什么? 的图像展平后有 个数,接一层 维隐层就是约 1.5 亿个参数;更糟的是,展平把二维的像素网格拉成一维向量,「谁挨着谁」这个信息只以「下标差」的形式隐式保留,网络必须为每个位置单独学一遍同样的图案。这就是参数爆炸与无视空间结构这两宗罪。
卷积的答案是把「图像该长什么样」这个先验写进结构:局部连接(每个输出只与一个小邻域相连)、权值共享(同一个核在全图滑动)、以及由此推得的平移等变。这三条合称卷积的归纳偏置,它们把参数量压到与图像尺寸无关(下降三到四个数量级),也让「学会一个图案」不必再重复几百遍。代价是:当这个先验不成立时(比如位置本身携带语义),卷积会吃亏——归纳偏置是条件性的工具,不是免费的午餐。
本讲的叙述线是一条障碍升级链:
- 卷积怎么算(3.2–3.3):把「核在图上滑动」写成精确公式,把尺寸、参数量、感受野、池化、归一化逐项算清。这一部分的目标是让你获得不依赖代码的形状推演能力——它决定了你排错的速度。
- 怎么堆(3.4):AlexNet 证明了深度 CNN 可训(靠的是一整套配方),VGG 用「小核堆叠 + 结构规整」把深度变成可研究的变量,ResNet 遇到并解决了退化问题(更深反而训练误差更高——不是过拟合),手段是残差连接:它让恒等映射变便宜、让梯度有一条直通的路。
- 能不能不用卷积(3.5):ViT 把图像切成 patch 当 token 序列,用注意力替代卷积。它成功了,但带着两个条件——需要大量数据(弱先验换大假设空间),以及计算量随分辨率快速上升。Swin 用窗口注意力与层次化找回效率与多尺度输出;ConvNeXt 用一次控制变量实验说明「卷积 vs 注意力」的胜负很大程度取决于训练配方与微观设计。
- 怎么不用标签也训好(3.6):迁移学习是工程默认起点(先冻结、再逐步解冻);自监督预训练把监督信号换成数据自身的结构——对比学习(InfoNCE / SimCLR / MoCo)、自蒸馏(BYOL / DINO)、掩码建模(MAE / BEiT)三条路线各有取舍。
- 怎么做到「一个模型解决一类问题」(3.7–3.8):检测与分割把输出从「一个标签」变成「一个集合 / 一张稠密标签图」,于是 IoU、NMS、AP 成为必须掌握的语言;DETR 用集合预测去掉锚框与 NMS;SAM 把分割变成提示式的通用后端。3.8 节把视觉接到语言上:CLIP 的对齐、BLIP-2 / LLaVA 的连接器与指令微调、扩散模型的定制(ControlNet / LoRA)。
- 代价是什么(3.9–3.10):数据集偏见会被放大,对抗样本说明「人看不出异常」不等于「模型不会判错」,深伪让「真实」本身变得可疑。3.10 节把这些落到 Lab 2:滑动窗口人脸检测、IoU 匹配、NMS、对抗实验与隐私讨论。
在九讲主线中的位置:第 1 讲给了通用范式(结构 + 损失 + 梯度下降 + 泛化),第 2 讲把「结构」这一环换成序列与注意力。本讲把这两条线合到图像上:3.2–3.4 是「结构」在空间维度上的展开,3.5 是第 2 讲的注意力反过来改造视觉,3.6–3.8 是「预训练 + 迁移」这套方法论在视觉里的完整形态,3.9 对应第 7 讲的治理视角。与母本 MIT 6.S191 的关系:本讲以母本 Lecture 3(Deep Computer Vision)的主题与配套 Lab(人脸检测)为骨架,把课堂上只给结论的部分(输出尺寸与感受野的推导、残差连接的梯度结构、ViT 的复杂度、检测评估口径)补齐;3.5 / 3.6 / 3.7 / 3.8 中标注为「教材外拓展」的新增部分,属于母本录播年代之后成为主流的内容,已按规范给出论文标题与编号。
十节一览
| 节 | 核心问题 | 关键结论 | 典型陷阱 |
|---|---|---|---|
| 3.1 为什么是卷积 | 图像为什么不能用 MLP 硬啃? | 全连接的两宗罪;卷积 = 局部连接 + 权值共享 + 平移等变;归纳偏置是用先验换样本,也有代价 | 以为「卷积天生平移不变」(其实只给等变);以为卷积能表达就等于好用(关键在参数化与优化) |
| 3.2 卷积运算 | 「核在图上滑动」到底怎么算? | 框架算的是互相关;输出尺寸、参数量、MACs 三条公式;感受野递推 ;下采样让感受野几何增长 | 核形状写反(是 );以为参数量与图像大小有关;把理论感受野当实际上下文 |
| 3.3 池化与归一化 | 池化到底提供了什么?BN 为什么训练/推理不一致? | 池化的不变性很弱,主要价值是降分辨率扩视野;BN 训练用批统计、推理用运行统计,与 batch size 强耦合;卷积 Dropout 必须按通道丢弃 | 推理忘了 model.eval()(单样本时统计退化);小 batch 硬用 BN;逐元素 Dropout 用在特征图上 |
| 3.4 经典骨干演进 | 三代网络的贡献是什么?为什么会「更深更差」? | AlexNet 是一套可训配方(且 95% 参数在全连接层);VGG 用 堆叠换感受野与非线性;退化不是过拟合,残差 给出恒等直通项 | 把退化当过拟合(加正则无效);以为残差只是「防梯度消失」;忽略「中间激活更多」带来的显存代价 |
| 3.5 现代视觉架构 | 不用卷积行不行?代价是什么? | ViT 用 patchify + 注意力;常规分辨率下 MLP 占计算量约 64%,注意力矩阵只占 4%;弱先验需要更多数据;Swin 用窗口 + 层次化换线性复杂度;MAE 让预训练脱离标签 | 以为 ViT 算力与 ResNet 相近(ViT-B/16 约 17.6 GMACs,是 ResNet-50 的 4.3 倍);以为 ViT 没有归纳偏置;把 ConvNeXt 的结论读成「卷积更好」 |
| 3.6 迁移与自监督 | 为什么不能从零训练?没标签怎么办? | 迁移是默认起点:先冻结、再逐步解冻,骨干学习率小一个量级;InfoNCE 等价于在表示空间做 类分类;MoCo 用队列解耦 batch;BYOL / DINO 去负样本但机制解释有争议 | 预处理与骨干不匹配;一上来就全网络微调;把「不用负样本也不崩塌」当成已确立的定理 |
| 3.7 检测、分割与视觉基础模型 | 输出为什么不能只看准确率? | 类不平衡下准确率无信息量;IoU 是匹配与评估的共同基础;NMS 是弥补「训练未去重」的手段;AP 必须说清口径(VOC 11 点 vs COCO 101 点 + 10 个 IoU 阈值);DETR 用集合预测消掉锚框与 NMS,代价是收敛慢 | 用准确率评估检测;混淆 AP 与 mAP;以为 NMS 是必需步骤;把 SAM 当分类器(它不给语义标签) |
| 3.8 多模态视觉 | 图像怎么接到语言上? | CLIP 用 4 亿图文对的对称 InfoNCE 做对齐,从而支持零样本分类;VLM 三段式(对齐 / 指令微调 / 偏好优化);视觉 token 数量直接决定上下文预算;ControlNet 管「怎么摆」、LoRA 管「长什么样」 | 以为 CLIP 会生成文本;以为视觉幻觉是「没看清」(实为语言先验压过视觉证据);跨论文直接比较 VQA 数字 |
| 3.9 伦理与安全 | 强能力的代价是什么? | 数据集偏见会被放大(反馈回路);必须做分群评估;对抗样本说明人不可察觉的输入也能翻车;鲁棒性是相对攻击预算的陈述;有些场景不该用视觉模型 | 用总体准确率掩盖子群失败;把对抗样本归因于过拟合;把检测器当作深伪的唯一防线 |
| 3.10 Lab 2 导读 | 怎么把零件装成能跑的检测系统? | 滑动窗口 = 在位置与尺度上搜索(并用它体会「重复计算」的动机);正负样本匹配与忽略区;「先过拟合 10 个样本」是最有效的调试手段 | 框坐标顺序错(不报错但框乱飞);增强只改图不改框;NMS 条件方向写反;多尺度推理忘记还原坐标 |
本讲地图
[3.1 为什么是卷积]
两宗罪 / 归纳偏置 / 等变
│ 把「滑窗」写成公式
▼
┌──→ [3.2 卷积运算] ──────────────┐
│ 互相关 / 尺寸 / 参数 / 感受野 │ 零件齐了
│ │ │
│ ▼ │
│ [3.3 池化、下采样、归一化] │
│ 分辨率 ↔ 视野 ↔ 训练稳定性 │
│ │ │
│ ▼ │
│ [3.4 经典骨干演进] ←──────────┘
│ AlexNet → VGG → ResNet(退化 + 残差)
│ │
│ ┌────────┴─────────┐
│ ▼ ▼
│ [3.5 ViT 与混合设计] [3.6 迁移与自监督预训练]
│ 弱先验 ⇄ 数据量 冻结/微调 · InfoNCE · MAE
│ │ │
│ └────────┬─────────┘
│ ▼
│ [3.7 检测、分割与视觉基础模型]
│ IoU / NMS / AP / FCN / DETR / SAM
│ │
│ ▼
│ [3.8 多模态视觉:对齐、生成、编辑]
│ CLIP / BLIP-2 / LLaVA / ControlNet / LoRA
│ │
│ ▼
│ [3.9 伦理与安全] ── 偏见 / 对抗 / 深伪 / 隐私
│ │
└───────────────┴──→ [3.10 Lab 2 人脸检测系统]
理论落到代码与报告
依赖关系:3.2 的形状推演是 3.3–3.4 的前置(读不懂形状就读不懂骨干)
3.4 的骨干是 3.5–3.8 的共同底座(两者都在改「怎么造骨干」)
3.6 的预训练是 3.7 检测/分割能用小数据的前提
3.9 的分群评估与 3.10 的 Lab 形成闭环(实验 C)
本讲新增的概念
| 组 | 概念 | 首次出现 |
|---|---|---|
| 运算 | 互相关与数学卷积的差别、核合并定理、填充 / 步幅 / 空洞、im2col | 3.2 |
| 运算 | 感受野与跳距的递推、分组卷积、深度可分离卷积、转置卷积 | 3.2 |
| 设计 | 池化与单调激活的交换律、全局平均池化、BN 的训练/推理差异、GroupNorm、SpatialDropout | 3.3 |
| 骨干 | 退化问题、残差的梯度结构(直通项 )、瓶颈块、pre-activation | 3.4 |
| 架构 | patchify、cls token、位置嵌入、 与线性项的交叉点、窗口 / 移位窗口、掩码图像建模 | 3.5 |
| 训练 | 分层学习率、领域偏移与 BN 重估、InfoNCE 的梯度、动量编码器、停止梯度与崩塌 | 3.6 |
| 任务 | 锚框、两阶段 / 单阶段、IoU / NMS / AP 口径、FCN / U-Net / DeepLab、集合预测与匈牙利匹配、提示式分割 | 3.7 |
| 多模态 | 双塔对比、零样本分类与提示模板、连接器与视觉 token 预算、ControlNet / LoRA、视觉幻觉评测 | 3.8 |
| 治理 | 放大效应、分群评估、FGSM / PGD、鲁棒性与攻击预算、出口判据 | 3.9 |
| 工程 | 坐标表示与 round-trip 断言、忽略区、focal loss、先过拟合小样本、故障排查表 | 3.10 |
学完自测(20 分钟快速版)
关掉书,用纸回答下面 8 个问题。答不上来的那一题,直接指向需要重读的小节。
| # | 问题 | 答不上来 → 回到 |
|---|---|---|
| 1 | 卷积的三种归纳偏置分别是什么?哪一项带来平移等变? | 3.1 |
| 2 | 输入 、、、、:输出形状、参数量、MACs 各是多少? | 3.2、3.2 |
| 3 | 3 层 与 1 层 的感受野相同吗?参数量差多少? | 3.4 |
| 4 | 写出残差块的前向与 ,说明 的作用。 | 3.4 |
| 5 | ViT-B/16 的参数量约多少?其中 MLP 占多少比例?为什么它比 ResNet-50 更贵? | 3.5 |
| 6 | InfoNCE 在形式上等价于什么任务?负样本与温度各自控制什么? | 3.6 |
| 7 | 一个 IoU、一次 NMS、一个 AP 的计算口径——分别说清它们解决什么问题。 | 3.7 |
| 8 | 面对一个「准确率 97.9%」的人脸系统,你会追问哪三个问题? | 3.9 |
参考答案要点(先自己写完再看)
- 局部连接、权值共享、平移等变;平移等变由权值共享 + 局部连接共同推出(命题 3.1.1)。等变 ≠ 不变。
- ,故 ;参数量 ;MACs 。
- 感受野相同();参数 对 ,省约 45%;3 层版本非线性更强。
- ,; 是不依赖任何权重的恒等直通项,因此保证梯度里总有一部分原样回传,且不会被训练改掉。
- 约 86.5M;MLP 占每层参数约 66.6%;计算量约 GMACs,是 ResNet-50(约 GMACs)的约 倍。
- 等价于在表示空间里做 类分类(找出锚点的正样本);负样本规模决定任务难度与表示质量,温度 控制 softmax 的锐度(进而控制梯度强度与判别性)。
- IoU:同时约束位置与尺度的匹配度量;NMS:训练未做去重时的推理端补救(阈值过小漏检、过大重复);AP:类不平衡下可用的排序质量指标,必须说明口径(VOC 11 点 / COCO 101 点 + 10 个 IoU 阈值)。
- ① 这个总体准确率在各子群上分别是多少(要分组混淆矩阵);② 错误在两个方向上的代价是什么(误识 vs 拒识)与阈值怎么定;③ 误判发生后有没有人在回路与申诉通道。
常见提问(本讲最常被问到的五件事)
Q:卷积到底要不要「翻转核」? 不要。框架实现的是互相关(命题 3.2.1)。但手推反向传播、做核合并、对接信号处理公式时必须显式处理翻转——这是两套约定,别混用。
Q:为什么现代架构越来越少用池化? 因为池化提供的不变性比通常认为的弱得多、且不连续(例 3.3.1),它的真实价值是降分辨率与扩感受野;而这两件事用步幅卷积做更灵活(可学),代价是算力。真正带来不变性的是大感受野、全局聚合与数据增强。
Q:ViT 是不是已经取代 CNN 了? 不是。ViT 的弱先验在数据充足时是优势,在中小数据上是劣势;ConvNeXt 的控制变量实验说明「卷积 vs 注意力」的差距很大程度来自训练配方与微观设计。选型要按数据量、延迟、部署工具链、是否需要多尺度输出判断(3.5.5)。
Q:为什么检测任务不能看准确率? 因为背景位置的占比可能是 以上,「全判背景」就能拿到极高准确率却零召回(例 3.7.1)。要看 precision / recall / AP / mIoU,并且分别报告漏检与误检。
Q:既然有预训练权重,为什么还要学这些推导? 因为推理与排错需要形状、算力与精度的量级感:显存为什么爆、为什么换了分辨率就报错、为什么这个改动理论上更快实测更慢、为什么换了个骨干精度掉了——这些问题都不是「加载权重 + 微调」能回答的。预训练解决的是「从哪开始」,本讲的公式解决的是「为什么」与「哪里出问题」。
与实验和项目的关系
- Lab 2 · 人脸检测系统:本讲的落点。它把 3.1–3.9 的内容装成一台机器——滑动窗口检测器(3.7)、IoU 与 NMS(3.7.2)、训练与正则(3.3、3.4)、对抗样本(3.9.3)、分群评估与隐私(3.9)。3.10 节是它的理论导读,逐条把原理对应到实现。
- 与 Lab 1 / Lab 3 的连接:本讲的骨干(3.4、3.5)是 Lab 3 里视觉—语言模型的前端;本讲的自监督(3.6)与第 4 讲的生成建模共享「用无标签数据训练表示」的思路。
- 期末项目:如果项目涉及图像(分类、检测、分割、生成、多模态),决策顺序应当是——先读 3.6 的实操清单选预训练骨干与迁移策略,再读 3.7 确定任务的输出结构与评估口径,最后读 3.9 写出使用边界(哪些情况下不应部署)。一个合格的视觉项目报告必须包含分群评估与失败模式分析。
第一遍(约 4 小时):按 3.1 → 3.2 → 3.3 → 3.4 顺序精读,把 3.2 的三条公式与 3.4 的残差推导手算一遍;3.5–3.8 可以先只读每节的动机段与小结(它们是「视野扩展」层)。
必读、不许跳的框:
- 每个
def后面的intuition(建立手感,比定义本身重要); - 3.2 的形状推演表与例 3.2.1 / 3.2.2(排错的第一技能);
- 3.4 的退化问题与残差梯度推导(本讲最重要的机制);
- 3.5 的 ViT 逐项参数量与计算量(纠正「ViT 与 ResNet 同量级」的印象);
- 3.7 的 AP 手算(例 3.7.1);
- 每节的
errata陷阱框(考试与实战里出错最多的就是那几条)。
二刷(约 6 小时):逐行读 proof——3.1 的等变充分必要性、3.2 的核合并与感受野递推、3.4 的残差梯度展开、3.6 的 InfoNCE 梯度(它是「吸引 + 排斥」的定量表达)、3.9 的 FGSM 手算。读完后合上书,把 3.2 的三条公式从定义推一遍。
动手:先跑 Lab 2 的滑动窗口基线(体会「重复计算」),再按 3.10.3 的清单做「先过拟合 10 个样本」的健壮性测试;然后做 3.10.4 的对抗实验与 3.10.6 的三个小实验(分群评估 / 阈值与代价 / 隐私检查)。
自检路径:每节的「即时自测」→ 本讲 习题集(A/B/C/D 四组)→ 回忆卡(当天 / 隔天 / 第 3 天 / 第 7 天)→ 综合自测卷(闭卷计时,100 分制)。复习时优先看 公式速查卡里的卷积公式与 易混对照卡里的「卷积 vs 注意力」「BN vs LN」「AP vs mAP」。
时间预算参考:只求建立范式直觉,读导览 + 3.1、3.2、3.4 的动机段与结论(约 1.5 小时);要能独立写出并调试一个检测系统,走完上面三遍并做完 Lab 2(约 12–15 小时)。
本讲的每个模型都在回答「这是什么」或「在哪里」。第 4 讲要换一个完全不同的问题:能不能生成新的图像?届时你会发现,本讲的骨干(卷积的或注意力的去噪网络)在第 4 讲里变成了扩散模型的「去噪器」,而本讲 3.9 节讨论的深伪问题,其技术根源正是第 4 讲要讲的生成能力。