外观
CNN 与计算机视觉
一句话定义:卷积神经网络(Convolutional Neural Network, CNN)是通过卷积、池化与残差连接三大构件,把"局部性、权值共享、平移等变性"这些图像先验直接编入网络结构的深度模型——它是深度学习在 2012 年引爆的第一代主力架构,也是今天几乎所有视觉系统的底层引擎(回顾整体脉络可先读深度学习演进简史)。
一、为什么图像需要 CNN
先看一个反例:把 224×224×3 的彩色图片直接拉平成约 15 万个数字,喂给神经网络基础中讲过的全连接层。第一层若接 1024 个神经元,参数就是 15 万×1024 ≈ 1.5 亿——权重矩阵本身比图像数据还大。这暴露出全连接处理图像的三个问题:
- 参数量爆炸:像素多、层一深,参数就天文数字,训练需要的数据和算力都不现实;
- 结构信息丢失:展平后像素的二维邻接关系被抹掉,"猫在左、背景在右"的空间结构不复存在;
- 没有平移不变性:同一只猫在画面里挪 10 个像素,全连接网络的输入就完全不同,必须靠数据硬扛。
CNN 的解法是给网络注入"图像先验":局部连接(神经元只看一个小邻域)、权值共享(同一卷积核扫遍全图)、层级特征(浅层学边缘纹理、深层学部件与语义)。这套归纳偏置极大压缩了假设空间,让模型用远少得多的参数学到了可泛化的视觉表征。
二、三大构件
卷积层
卷积核(filter)是一个小矩阵,例如 3×3,在输入特征图上滑动做逐元素乘加,生成输出特征图。输出尺寸由三个超参决定:步长(stride,核每次滑几格)、填充(padding,边缘补零)、核数量(决定输出通道数)。假设输入为 224×224×3,用 64 个 3×3 核、步长 1、padding 1,输出就是 224×224×64——输入输出分辨率不变,只是通道数变了。位置 (i,j) 的输出公式为:
$$ y_{i,j,k} = b_k + \sum_{c=0}^{C-1}\sum_{p=0}^{K-1}\sum_{q=0}^{K-1} w_{p,q,k,c}\cdot x_{i+p,,j+q,,c} $$
一次卷积的参数量 = K×K×输入通道×输出通道(再加偏置),例如 3×3×256×256 ≈ 59 万——同样 256 通道输入输出,全连接要算 256²×256²。1×1 卷积不聚合空间信息,只做通道混合,常用来降维或当"可学习的通道加权",在后续很多架构里(含 Transformer 架构的 MLP 里)都能看到它的思想。
池化层
池化对邻域做下采样:最大池化取局部最大值(保留最强响应、带平移不变性),平均池化取均值(更平滑)。2×2 池化把特征图长宽各减半,参数量为零,作用有三:降低计算量、扩大后续卷积的感受野、提供轻度不变性。现代架构里池化地位有所下降(ResNet 用步长卷积替代),但理解它仍是理解 CNN 特征金字塔的起点。
残差连接
残差连接是让 CNN 能"深下去"的关键。直观理解:如果若干层学不到有用变换,最稳妥的选择是"什么都不做"(恒等映射)。于是把层包装成残差块,学习目标是残差 F(x) = H(x) − x,输出 H(x) = F(x) + x。这个加法给梯度留了一条"高速公路":反向传播时梯度能近乎无损地流过跳跃连接(链式法则细节见反向传播与自动微分),从而缓解深层网络的梯度消失。ResNet 正是靠这个结构把网络做到了 152 层,还顺手解决了退化问题(层数增加反而变差的现象)。
直观类比
卷积负责"看局部",池化负责"看更广",残差负责"安全地变深"——三者合起来就是一张"越看越懂、越看越全、越看越稳"的视觉皮层的粗粒度模拟。
三、架构演进表
下表汇总 CNN 主线的里程碑,ImageNet Top-5 错误率均为当年单模型/集成模型在 ILSVRC 上的公开成绩(Top-1 分类任务代表性指标):
| 模型 | 年份 | 核心贡献 | ImageNet Top-5 错误率 |
|---|---|---|---|
| LeNet-5 | 1998 | 卷积+池化+全连接的经典组合,手写数字识别 | —(MNIST,非 ILSVRC) |
| AlexNet | 2012 | ReLU、Dropout、数据增强、双 GPU;深度学习引爆点 | 15.3%(冠军,远超第二的 26.2%) |
| VGG | 2014 | 用堆叠小 3×3 核替代大核,感受野不变、参数更少 | 7.3% |
| GoogLeNet (Inception) | 2014 | Inception 多分支并行 + 1×1 卷积降维 | 6.67%(冠军) |
| ResNet | 2015 | 残差连接,152 层训练可行 | 3.57%(冠军,首次超越人类水平 5.1%) |
| DenseNet | 2017 | 层间密集连接,特征复用、梯度路径更短 | 5.19%(同年较优) |
| EfficientNet | 2019 | 神经架构搜索 + 复合缩放(深/宽/分辨率同调) | 2.27%(当时 SOTA) |
| ViT | 2020 | 纯 Transformer 结构做图像,大预训练数据下反超 CNN | 88.55% Top-1 准确率(ImageNet-21k 预训练) |
从这张表能看到三条规律:架构在变深变宽(LeNet 5 层 → ResNet 152 层)、归纳偏置逐渐让位给数据与算力(ViT 没有卷积先验,靠海量预训练补回来)、自动化参与设计(EfficientNet 用 NAS 搜结构)。关于"结构先验 vs 数据规模"的深层权衡,见DL 设计原则。
四、图像任务家族
图像任务远不止分类,但分类往往是它们的地基(分类网络的特征层被几乎所有下游任务复用):
| 任务 | 目标 | 代表性方法 |
|---|---|---|
| 图像分类 | 整图一个类别 | AlexNet、ResNet、EfficientNet、ViT |
| 目标检测 | 定位+分类多个物体 | R-CNN 系(两阶段)、YOLO/SSD(单阶段)、DETR(Transformer) |
| 语义分割 | 每个像素一个类别 | FCN、U-Net、DeepLab |
| 实例分割 | 区分每个独立物体实例 | Mask R-CNN |
| 姿态估计 | 关键点定位 | OpenPose、HRNet |
| 图像检索 | 按内容找相似图 | 度量学习 + 向量检索(特征库) |
检测和分割都建立在"先提特征、再定位/分类"的流水线上;姿态估计本质是密集关键点回归。做这些任务常用 COCO、PASCAL VOC 等公开数据集,具体见数据集与工具档案。一个工程现实是:这些任务极少从零训练——几乎都从 ImageNet 预训练的骨干网络(backbone)出发,这也引出下面最实用的一节。
五、迁移学习黄金配方
全站最实用的配方之一。核心思路来自表征学习与预训练:先用海量通用数据学会"通用的视觉特征",再用少量任务数据适配。经典流程四步:
- 预训练:在 ImageNet(1400 万张图)等大语料上训练骨干,学到边缘→纹理→部件→语义的层级特征;
- 换头:把预训练网络最后的全连接分类层换成新的分类头(类别数改为目标任务);
- 冻结与分层微调:先冻结骨干(learning_rate 设为 0 或用低一两个数量级的学习率),只训新头;数据充足时再逐步解冻高层;
- 数据增强:随机裁剪、翻转、颜色抖动(ColorJitter)、CutMix 等,等效免费扩数据。
PyTorch 参考实现(基于 torchvision 的 ResNet50):
python
import torch
import torchvision.models as models
model = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)
# 换头:把 1000 类的 fc 换成目标 10 类
model.fc = torch.nn.Linear(model.fc.in_features, 10)
# 冻结骨干(头两层按需冻结)
for name, param in model.named_parameters():
if "fc" not in name:
param.requires_grad = False
# 分层微调:骨干用低学习率,新头用正常学习率
optimizer = torch.optim.AdamW([
{"params": model.fc.parameters(), "lr": 1e-3},
{"params": [p for n, p in model.named_parameters()
if "fc" not in n and p.requires_grad], "lr": 1e-4},
])这一配方在分类、检测、分割、检索上几乎通吃,微调的调参细节(何时解冻、用多大学习率)见训练配方与调参。
六、训练技巧
从 0 到 1 训练 CNN 或微调时的六个高频技巧:
- BatchNorm:对每个 batch 的通道做归一化,允许用更大学习率、加速收敛,还带轻微正则效果。训练与推理行为不同(推理用滑动统计量),细节见初始化与归一化;
- 学习率调度:线性 warmup 后接 cosine 退火是当下默认;一个 epoch 内还用 EMA(指数移动平均,权重指数加权平均),常能白拿 0.3~0.5% 精度;
- 标签平滑:把 one-hot 的 1 换成 0.9/0.1×均匀分布,抑制过度自信、改善泛化(Szegedy 等 2016)——它属于过拟合与正则化中"输出端正则"一类;
- 混合精度(AMP):FP16/FP32 混算 + 损失缩放,显存减半、速度翻倍级提升,已是训练标配;
- 数据增强:基础增强 + CutMix/MixUp 等强增强能显著提升鲁棒性;
- 随机深度/剪枝:训练时随机丢残差块,深层网络训练更稳。
常见坑
ResNet 在 ImageNet 上的默认超参(batch size 256、初始 lr 0.1、90 epoch)不能直接平移到小数据集或不同任务——复制别人配置前先想清楚数据量级,否则大概率过拟合或欠拟合,排查思路见调试与诊断。
七、视觉大模型现状
CNN 的下一步是"从专才到通才"。2021 年后视觉模型迅速走向多模态与基础模型(foundation model)范式:
- CLIP(OpenAI, 2021):用 4 亿图文对做对比学习,让图像特征与文本特征对齐到同一空间,实现零样本图像分类与图文检索;
- SAM(Segment Anything, Meta, 2023):提示分割基础模型,11M 图像 + 10 亿掩码训练,可对任意物体做分割;
- VLM 视觉语言模型:GPT-4V、LLaVA、Qwen-VL 等把视觉编码器接上大语言模型,让模型"看图说话"、做视觉问答与推理——这类架构详见多模态模型。
这些模型共享一个范式:用大规模弱监督数据做对比或生成式预训练,把视觉、文本(乃至音频)统一进一个表征空间。传统 CNN 在这些系统里往往退化为"视觉编码器"组件,主干反而交给Transformer 架构。
八、权衡与取舍
- 归纳偏置 vs 数据效率:CNN 靠先验在小数据上胜出,ViT 靠数据和算力在超大尺度反超。你的数据量在百万级以下,CNN/混合架构往往更稳;在十亿级语料尺度,纯注意力结构更有上限;
- 深度 vs 可解释性:层越深越准,但特征越难解释,"为什么判这张图是猫"常是黑盒,相关讨论见可解释性与公平性;
- 精度 vs 速度:EfficientNet 的 NAS 搜出的是"精度/算力帕累托前沿",实际部署还要叠加深度的工程优化(剪枝、量化、蒸馏),见MLOps 与模型部署;
- 视觉 vs 语言范式的合流:自注意力已渗透进视觉,卷积也被引入 Transformer(如 ConvNeXt 的"现代化 ResNet"),两者边界在模糊,不必站队。
延伸阅读
- Transformer 架构——ViT 背后的通用注意力引擎,CNN 的下一个进化方向
- 多模态模型——CLIP/VLM 如何把视觉与语言连起来
- 表征学习与预训练——迁移学习为何有效
- 初始化与归一化——BatchNorm 等归一化的原理与坑
- 训练配方与调参——CNN 超参的通用配方
- 数据集与工具档案——视觉任务常用数据集与标注工具
参考资料
- LeCun, Bottou, Bengio, Haffner. Gradient-Based Learning Applied to Document Recognition (1998)
- Krizhevsky, Sutskever, Hinton. ImageNet Classification with Deep Convolutional Neural Networks (NeurIPS 2012)
- He, Zhang, Ren, Sun. Deep Residual Learning for Image Recognition (CVPR 2016)
- Tan, Le. EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks (ICML 2019)
- Dosovitskiy et al. An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (ICLR 2021)
- Radford et al. Learning Transferable Visual Models From Natural Language Supervision (CLIP, ICML 2021)
- Kirillov et al. Segment Anything (ICCV 2023)
- He et al. Bag of Tricks for Image Classification with Convolutional Neural Networks (CVPR 2019)