2. 经典CNN架构精讲

说到CNN架构,面试里问得最多的就是这三个:ResNet、Inception、MobileNet。我当年面试时,面试官直接让我在白板上画ResNet的残差块,然后问“为什么加个跳跃连接就能训练更深?”——这个问题,今天咱们彻底讲透。

一、ResNet:残差思想,让网络“深”得下去

在ResNet出现之前,大家发现一个反直觉的现象:网络越深,效果反而越差。不是过拟合,是训练集上的误差都降不下去。这被称为“退化问题”。

核心洞察:深层网络难以拟合恒等映射。与其让网络直接学习H(x),不如让它学习残差F(x) = H(x) - x,然后输出F(x) + x。

1.1 残差块结构

一个标准的残差块长这样:输入x经过两层卷积,得到F(x),然后和原始x相加,再经过ReLU激活。就这么简单的一个跳跃连接,解决了大问题。

# 一个基本的残差块(PyTorch风格)
def forward(self, x):
    identity = x
    out = self.conv1(x)
    out = self.bn1(out)
    out = self.relu(out)
    out = self.conv2(out)
    out = self.bn2(out)
    # 关键步骤:跳跃连接
    out += identity
    out = self.relu(out)
    return out

1.2 为什么残差有效?

我个人习惯从梯度流的角度理解。反向传播时,梯度通过跳跃连接可以直接传到前面的层,避免了梯度消失。你想想看,如果没有这个连接,梯度要经过多层卷积的连乘,很容易就衰减到0了。

避坑指南:我曾经在项目中遇到维度不匹配的问题——当卷积层改变了特征图的通道数或尺寸时,identity和F(x)没法直接相加。解决办法是用1x1卷积对identity做投影,调整维度。

1.3 ResNet系列变体

变体 层数 特点 适用场景
ResNet-18/34 18/34 基本残差块(2层卷积) 轻量级任务,快速实验
ResNet-50/101/152 50/101/152 瓶颈块(1x1→3x3→1x1) ImageNet级任务
ResNeXt 各种 分组卷积 + 残差 更高精度需求

瓶颈块的设计很有意思:先用1x1降维,3x3计算,再用1x1升维。这样既减少了参数量,又保持了表达能力。我记得第一次看到这个设计时,觉得这简直是“四两拨千斤”的典范。

二、Inception:多尺度设计,让网络“看”得更全

Inception的核心思想很简单:与其手工选择卷积核大小,不如让网络自己决定。在同一层里,同时使用1x1、3x3、5x5的卷积和池化,然后把结果拼在一起。

2.1 Inception v1(GoogLeNet)

最初的Inception模块有四个分支:1x1卷积、3x3卷积、5x5卷积、3x3池化。每个分支后面都接一个1x1卷积做降维,控制计算量。

关键设计:1x1卷积在这里扮演了两个角色:一是降维减少计算量,二是增加非线性。说白了,就是用更少的参数实现更强的表达能力。

2.2 Inception v2/v3:分解卷积

Inception v3把大卷积核分解成小卷积核的堆叠。比如5x5分解成两个3x3,3x3分解成1x3和3x1。这样做的好处是:参数量更少,非线性更多,训练更快。

# Inception v3中的分解卷积示意
# 5x5卷积 → 两个3x3卷积
# 3x3卷积 → 1x3 + 3x1 卷积

2.3 多尺度的实际意义

我在做图像分类项目时发现,不同尺度的物体需要不同大小的感受野。小猫的脸可能只需要3x3,但整只猫就需要5x5甚至更大。Inception让网络自己学习该用哪个尺度,省去了手工调参的麻烦。

注意:Inception模块的计算量并不小。虽然每个分支都做了降维,但四个分支并行计算,整体FLOPs还是偏高。移动端部署时需要考虑这个因素。

三、MobileNet:轻量化策略,让网络“跑”得起来

MobileNet的目标很明确:在移动设备上实时运行。它的核心武器是深度可分离卷积(Depthwise Separable Convolution)。

3.1 标准卷积 vs 深度可分离卷积

标准卷积:一个卷积核同时处理所有通道。深度可分离卷积:先对每个通道单独做卷积(Depthwise),再用1x1卷积混合通道(Pointwise)。

卷积类型 参数量 计算量 特点
标准卷积 Dk² × M × N Dk² × M × N × Df² 通道和空间同时处理
深度可分离卷积 Dk² × M + M × N Dk² × M × Df² + M × N × Df² 空间和通道分离处理

其中Dk是卷积核大小,M是输入通道数,N是输出通道数,Df是特征图尺寸。深度可分离卷积的参数量大约是标准卷积的1/N + 1/Dk²。当N=256, Dk=3时,参数量只有标准卷积的1/9左右。

直观理解:标准卷积像是一个全能选手,一个人干所有事。深度可分离卷积像是流水线作业,每个工人只干一件事,效率更高。

3.2 MobileNet v1 vs v2 vs v3

  • v1:深度可分离卷积 + 宽度乘数α + 分辨率乘数ρ。α控制通道数,ρ控制输入分辨率。
  • v2:倒残差结构(Inverted Residual) + 线性瓶颈。先升维再降维,和ResNet相反。
  • v3:NAS搜索 + 硬件感知。用神经网络架构搜索自动找到最优结构。

我记得在做一个移动端人脸识别项目时,用MobileNet v2替换了原来的ResNet-18,模型大小从40MB降到了8MB,推理速度提升了3倍,精度只掉了0.5%。这种trade-off在工业界非常常见。

3.3 轻量化设计的通用原则

从MobileNet的设计中,我们可以总结出几条轻量化原则:

  1. 分解大卷积:用多个小卷积代替大卷积,比如3x3代替5x5。
  2. 分离通道和空间:深度可分离卷积是典型代表。
  3. 控制通道数:用1x1卷积做降维,减少后续计算量。
  4. 使用瓶颈结构:先降维再升维,或者先升维再降维,根据任务选择。

四、三种架构的对比与选择

维度 ResNet Inception MobileNet
核心思想 残差学习 多尺度融合 轻量化
主要优势 训练深层网络 多尺度特征 低参数量、低计算量
主要劣势 参数量较大 计算量较大 精度上限较低
典型应用 通用图像分类 高精度分类 移动端、嵌入式

面试时,面试官可能会问“你会在什么场景下选择哪个架构?”我的回答是:如果追求精度且计算资源充足,选Inception;如果需要训练很深的网络,选ResNet;如果要在手机上实时运行,选MobileNet。当然,现在很多工作都在做三者的融合,比如MobileNet v2就借鉴了ResNet的残差思想。

面试技巧:当被问到“为什么ResNet能训练到1000层以上”时,不要只回答“因为跳跃连接”。要深入解释梯度流、恒等映射、退化问题这三个层次。面试官想听的是你对问题本质的理解。

五、知识结构图

下面这张图总结了三种架构的核心思想和关键设计,方便你面试前快速回顾。

经典CNN架构核心思想对比 经典CNN架构核心思想 ResNet 残差学习 跳跃连接 解决退化问题 Inception 多尺度融合 1x1降维 分解卷积 MobileNet 深度可分离卷积 倒残差结构 NAS搜索 面试核心:理解每种架构的设计动机和适用场景,能对比分析优缺点

嗯,以上就是经典CNN架构的核心内容。ResNet解决了深度问题,Inception解决了尺度问题,MobileNet解决了效率问题。面试时,能把这三个问题讲清楚,就已经超过大多数候选人了。