跳到主要内容

卷积神经网络(CNN)

问题

CNN 的核心原理是什么?卷积、池化、全连接层分别起什么作用?ResNet 的残差连接如何解决网络退化问题?

答案

卷积神经网络(Convolutional Neural Network, CNN) 是专门处理具有网格结构数据(如图像)的神经网络,通过卷积运算自动提取空间特征。

一、CNN 的核心组件

卷积层(Convolution Layer)

卷积层使用卷积核(Filter/Kernel) 在输入上滑动,计算局部区域的加权和:

概念说明
卷积核大小通常 3×3 或 5×5
步幅(Stride)卷积核每次移动的像素数
填充(Padding)输入边缘补零,保持输出尺寸
通道(Channels)滤波器数量决定输出通道数

关键特性

  • 局部连接:每个神经元只关注输入的一小片区域(感受野)
  • 权重共享:同一个卷积核在整张图上共享参数 → 大幅减少参数量
  • 平移不变性:无论目标出现在图像哪个位置,都能被同一个卷积核检测到

池化层(Pooling Layer)

池化层对特征图进行下采样,减少计算量和参数,同时提供一定的平移不变性。

类型操作效果
最大池化(Max Pooling)取区域内最大值保留最显著特征
平均池化(Avg Pooling)取区域内平均值保留全局信息
全局平均池化(GAP)整个特征图取平均替代全连接层,减少参数

二、经典 CNN 架构演进

模型年份层数关键创新
LeNet-519985CNN 先驱,手写数字识别
AlexNet20128ReLU + GPU 训练,ImageNet 夺冠
VGGNet201416/19全用 3×3 卷积,更深更规整
GoogLeNet201422Inception 模块,多尺度特征
ResNet201550/101/152残差连接,突破深度限制
EfficientNet2019-复合缩放(深度×宽度×分辨率)

三、ResNet 残差连接

当网络层数增加到一定程度(如 56 层),训练误差反而比浅层网络(20 层)更高——这不是过拟合,而是退化问题(Degradation):深层网络难以学习恒等映射。

残差连接的解决方案

y=F(x)+x\mathbf{y} = F(\mathbf{x}) + \mathbf{x}

让网络学习残差 F(x)=H(x)xF(\mathbf{x}) = H(\mathbf{x}) - \mathbf{x},而不是直接学习目标映射 H(x)H(\mathbf{x})。如果某层不需要做任何变换,只需让 F(x)=0F(\mathbf{x}) = 0 即可(恒等映射),这比学习 H(x)=xH(\mathbf{x}) = \mathbf{x} 容易得多。

残差连接的深远影响

残差连接不仅解决了 CNN 的退化问题,Transformer 也大量使用残差连接——每个注意力层和 FFN 层都有残差连接。它是现代深度学习中最重要的架构设计之一。

四、CNN 的感受野

感受野(Receptive Field) 是输出特征图上一个点对应的输入区域大小。

网络深度3×3 卷积核的感受野
1 层3×3
2 层5×5
3 层7×7
n 层(2n+1) × (2n+1)

为什么 VGGNet 偏好 3×3 卷积?两个 3×3 卷积的感受野等于一个 5×5 卷积,但参数更少2×32=182 \times 3^2 = 18 vs 52=255^2 = 25)且有更多非线性(两次 ReLU)。


常见面试问题

Q1: 1×1 卷积的作用是什么?

答案

  1. 通道降维/升维:改变通道数而不改变空间尺寸(如 256 通道 → 64 通道)
  2. 跨通道信息融合:将不同通道的特征组合
  3. 增加非线性:1×1 卷积后接 ReLU 增加网络表达力
  4. 减少计算量:GoogLeNet 的 Inception 模块用 1×1 卷积减少通道数后再做 3×3/5×5 卷积

Q2: CNN 和 Transformer 在计算机视觉中的对比?

答案

CNNVision Transformer (ViT)
归纳偏置局部性、平移不变性几乎没有
全局建模需要很深才能获得大感受野每层都可以全局注意力
数据需求小数据也能工作需要大量数据(或预训练)
计算复杂度O(n)O(n)(线性于像素数)O(n2)O(n^2)(注意力矩阵)
当前趋势仍在边缘部署场景主流大规模预训练模型主流

Q3: 特征图尺寸如何计算?

答案

output_size=input_sizekernel_size+2×paddingstride+1\text{output\_size} = \frac{\text{input\_size} - \text{kernel\_size} + 2 \times \text{padding}}{\text{stride}} + 1

例如:输入 32×32,卷积核 3×3,stride=1,padding=1 → 输出 32×32(尺寸不变)。


相关链接