云镜收藏

稍后阅读

清单保存在当前浏览器,方便下次回来继续阅读。

清单还是空的

在笔记卡片或正文页点击“加入稍后阅读”即可收藏。

卷1 · 深度学习与 CV 基础

1.1 从 CNN 到 ResNet:卷积时代的遗产

约 7 分钟阅读
全书目录

展开本章目录与同卷章节1. 卷积的四种视角(核心中的核心)2. 一个现代卷积块的标准结构3. ResNet:深度的闸门被打开4. CNN 时代留给大模型时代的遗产5. 检测与分割:知道即可6. 卷积让位给了什么?——归纳偏置与数据规模的交易7. 自测题8. 动手作业9. 延伸资源同卷章节1.1 从 CNN 到 ResNet:卷积时代的遗产1.2 注意力机制:从加权检索到万物的基础操作1.3 Transformer 逐层拆解:从 Block 到小 GPT1.4 ViT 与视觉 Transformer 谱系:图像成为 token1.5 自监督三巨头:MAE、CLIP、DINO1.6 CLIP 精读与 zero-shot 评测实操(第一个完整项目)1.7 SAM 与分割基础模型:提示式视觉1.8 检测与分割极简史:知道即可的一章1.9 图像形成与相机模型:给 3D/具身留的几何底座

本章目标:用最小的篇幅吃透卷积神经网络——不是为了拥抱传统,而是因为:① 视觉 Transformer 至今仍在用卷积做 patch 化和下采样;② 小数据、小模型、边缘部署场景 CNN 仍是首选;③ CNN 时代沉淀的训练技术(数据增强、初始化、残差、蒸馏)全部延续到了大模型时代。学完标准:能手写 ResNet-18 在 CIFAR-10 上跑到 93%+,并能讲清”为什么残差连接有效”。

1. 卷积的四种视角(核心中的核心)

一维卷积你已熟悉(0.3 章)。二维图像卷积 O[i,j]=∑m,nK[m,n] I[i+m,j+n]O[i,j] = \sum_{m,n} K[m,n]\, I[i+m, j+n] 有四种等价的理解,调试和阅读论文时来回切换:

  1. 模板匹配:卷积核是一组可学习的权重模板,滑动扫描图像找模式。第一层学到的常是边缘/色块检测器(Gabor 形状),这是数据自己学出来的,不是设计出来的。
  2. 感受野:输出某一点”看得见”输入的多大范围。堆叠规律:每叠一层 3×3 卷积,感受野 +2——两层 3×3 = 5×5 的感受野,但参数只有 2×9=18 而不是 25,还多了一次非线性。小核堆叠优于大核,这条设计法则统治了 2014–2020。
  3. 参数共享:同一组核扫过全图 = “猫在左上角和右下角是同一种猫”的先验。这叫平移等变性。全连接层没有这个先验,所以需要更多数据——这个观点是理解”卷积 → Transformer”变迁的钥匙(见第 6 节)。
  4. 稀疏的矩阵乘法:卷积 = 权重共享的全连接层(用 im2col 展开后就是一次矩阵乘)。所以 GPU 对卷积优化得极好,卷积从不”慢”在数学上,而是”慢”在内存访问模式上。

实用公式(必背):输出尺寸 =⌊(N+2P−K)/S⌋+1= \lfloor (N + 2P - K)/S \rfloor + 1(输入 N、核 K、填充 P、步长 S)。参数量 =K×K×Cin×Cout= K \times K \times C_{in} \times C_{out}(无 bias 时)。

2. 一个现代卷积块的标准结构

Conv(no bias)→BatchNorm→ReLU\text{Conv}(\text{no bias}) \rightarrow \text{BatchNorm} \rightarrow \text{ReLU}

  • Conv 不带 bias:因为 BN 里本来就有可学习的平移项,加 bias 纯属浪费参数;
  • BN 在 0.3 章讲过:稳定各层输入分布;
  • 1×1 卷积:跨通道的加权混合,用于降维/升维(bottleneck 结构里先降再升,省算力);
  • 池化/步长卷积负责下采样:MaxPool 取局部最大(保显著特征),步长卷积让下采样本身可学习(现代默认)。

3. ResNet:深度的闸门被打开

2015 年之前,网络加深到 20+ 层反而变差——不是过拟合(训练误差也差),而是退化:深层网络难以优化。

残差连接把每个块改成学习”增量”:y=x+F(x)y = x + F(x),其中 FF 是普通卷积堆。

为什么有效(两层解释都要会):

  1. 梯度直通:反向传播时 ∂y∂x=1+∂F∂x\frac{\partial y}{\partial x} = 1 + \frac{\partial F}{\partial x},那个”1”给梯度修了一条高速公路,100 层的梯度也不会层层衰减。消融实验:110 层网络去掉残差后训练误差降不下去,加上后正常——证明是优化问题而非容量问题。
  2. 学习目标的重塑:网络学的是”在恒等映射基础上改多少”。对多数层来说最优解接近恒等,把恒等设为默认值,让”什么都不做”变得容易——这是所有现代架构(Transformer 残差流、LoRA 的 ΔW\Delta W)共享的哲学:学习增量,而不是从头学。

代码(BasicBlock,背下来,作业要用):

import torch, torch.nn as nn

class BasicBlock(nn.Module):
    def __init__(self, cin, cout, stride=1):
        super().__init__()
        self.conv1 = nn.Conv2d(cin, cout, 3, stride, 1, bias=False)
        self.bn1   = nn.BatchNorm2d(cout)
        self.conv2 = nn.Conv2d(cout, cout, 3, 1, 1, bias=False)
        self.bn2   = nn.BatchNorm2d(cout)
        self.shortcut = nn.Sequential()                      # 默认恒等
        if stride != 1 or cin != cout:                       # 形状不一致时用 1×1 投影
            self.shortcut = nn.Sequential(
                nn.Conv2d(cin, cout, 1, stride, bias=False),
                nn.BatchNorm2d(cout))
    def forward(self, x):
        out = torch.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        return torch.relu(out + self.shortcut(x))            # y = x + F(x)

ResNet-18 = 一个 7×7 stem + 4 个 stage(每 stage 2 个 BasicBlock,通道 64→128→256→512)+ 全局平均池化 + 线性头。CIFAR-10 上把 stem 换成 3×3(图像小,7×7 太浪费)。

4. CNN 时代留给大模型时代的遗产

这些技术你会在所有后续章节反复遇到,现在建立索引:

技术一句话在大模型时代的下落
数据增强(翻转/裁剪/颜色抖动)免费扩数据防过拟合VLM 数据管线仍在用(随机裁剪、颜色扰动)
标签平滑one-hot 里的 0.9/0.1,防过度自信LLM SFT 常用
Mixup/CutMix图像线性混合、标签同步混合视觉预训练数据增强标配
知识蒸馏大模型教小模型(KL + 温度)推理侧核心技术,卷5.8
权重衰减/早停/EMA0.4 章已讲全部沿用
Pre-training → Fine-tuning 范式ImageNet 预训练 + 下游微调被”自监督预训练 + 指令微调”继承,范式本身没变

5. 检测与分割:知道即可

  • 检测:YOLO 系(快,工业部署多)、DETR 系(transformer 化);分割:FCN → U-Net(医学影像至今主流)→ Mask R-CNN → SAM。你不需要复现它们,只需要:知道任务定义、知道 U-Net 的编码器-解码器 + 跳跃连接结构(扩散模型的 U-Net 就是它)、知道 SAM 是”可提示分割基础模型”(1.7 章)。

6. 卷积让位给了什么?——归纳偏置与数据规模的交易

卷积内置了两个先验:局部性(近邻像素相关)+ 平移等变。先验强 = 小数据学好,大数据下变成天花板(没法学全局关系,感受野增长太慢)。ViT 的赌注是:把图像切成 16×16 patch 当作 token 序列,用几乎无视觉先验的 Transformer,让数据补足先验——数据规模到亿级后反超 CNN,且天然兼容文本 token(这条兼容性直接通向多模态,卷3 的主角)。

记住这条主线:CV 的十年 = 先验逐渐变少、数据规模逐渐变大、架构逐渐统一到 Transformer。这不是”CNN 错了”,而是不同数据规模下的最优权衡。小数据(医学影像标注贵)场景 CNN/混合架构至今能打。

7. 自测题

  1. 输入 224×224,3×3 卷积、stride=2、padding=1,输出多大?(112×112,套公式)
  2. 为什么现代卷积块里 Conv 不带 bias?(BN 的平移参数替代了它)
  3. 两层 3×3 卷积的感受野等于一层多大卷积?参数量对比?(5×5;18 vs 25,还多一次非线性)
  4. 残差连接的梯度公式里”1”意味着什么?(梯度至少有一部分不衰减地直通,缓解深层退化)
  5. “学习增量而非从头学”这个哲学还出现在哪两处?(Transformer 残差流;LoRA 的低秩增量)
  6. ViT 为什么在大数据下反超 CNN?(弱先验架构容量上限高,数据规模补足先验)
  7. U-Net 的跳跃连接解决什么问题?(下采样丢失的空间细节通过 skip 直接传给解码器;扩散模型沿用此结构)

8. 动手作业

  1. 用第 3 节的 BasicBlock 搭 CIFAR 版 ResNet-18(stem 用 3×3,无 maxpool),在 0.2 章训练脚本里替换 Net,目标 ≥93%(配合 TrivialAugment 增强)。
  2. 训练完后可视化第一层卷积核(model.features[0].weight 归一化后 plt.imshow)——亲眼看看”学出来的边缘检测器”。
  3. 挑战:故意删掉所有 shortcut 再训 20 epoch,对比训练曲线,亲手复现”退化”现象。
  4. 把你的训练记录写成 README 传 GitHub——作品集第一块砖。

9. 延伸资源

  • CS231n 课程笔记(卷积网络部分)——卷积直觉的第一名
  • 李沐《论文精读》ResNet 一期 + 原论文 Deep Residual Learning(2015)
  • CS231n 2024 新版公开课——后半程直接过渡到 Transformer