1. 卷积神经网络基础:从全连接到卷积,为什么需要卷积?

各位同学好,我是你们这门课的主讲。做了十几年芯片设计,从通信基带到AI加速器,我越来越觉得——理解卷积的动机,比背公式重要一百倍。

今天咱们不急着推公式。先聊聊一个很朴素的问题:为什么图像处理不能用全连接?

1.1 全连接网络的困境

你想想看,一张 256×256 的灰度图,展开成向量就是 65536 个像素。如果第一层隐藏层有 1000 个神经元,那这一层的权重数量是多少?

65536 × 1000 = 6553.6 万。六千多万个参数。

我早年做图像识别项目时,试过用全连接网络处理 64×64 的小图。模型文件动不动就几百兆,训练一次要一整天。更头疼的是——它根本不理解“平移不变性”。你把猫往左挪了 5 个像素,它就觉得是另一张图了。

全连接的问题,说白了就三点:

  • 参数爆炸:图像稍微大一点,参数量就失控
  • 破坏空间结构:强行把 2D 图像拉成 1D 向量,邻居关系全丢了
  • 没有平移不变性:同一个特征换个位置,网络就得重新学

核心矛盾:全连接网络假设“每个输入和每个输出都相关”,但图像里真正重要的是“局部模式”和“相对位置”。

1.2 卷积的数学本质

好,那卷积是怎么解决这些问题的?

数学上,离散二维卷积的定义是:

(I * K)(x, y) = Σ Σ I(x-m, y-n) · K(m, n)
         m  n

别被符号吓到。我换个说法:拿一个小窗口(卷积核)在图像上滑动,每个位置做一次点乘求和。

举个例子,一个 3×3 的卷积核:

图像区域(3×3)    卷积核(3×3)        输出(1个值)
[ a11 a12 a13 ]   [ k11 k12 k13 ]     a11·k11 + a12·k12 + a13·k13
[ a21 a22 a23 ] · [ k21 k22 k23 ] =   a21·k21 + a22·k22 + a23·k23
[ a31 a32 a33 ]   [ k31 k32 k33 ]     a31·k31 + a32·k32 + a33·k33

这个操作,本质上就是局部加权求和。卷积核就是一组可学习的权重,它在整张图上共享。

我的经验:做硬件加速时,我习惯把卷积拆成“滑动窗口 + 乘累加”。这个视角对 FPGA 实现特别有用——后面讲脉动阵列时会反复用到。

1.3 卷积的物理意义

卷积的物理意义,我分三个层次讲:

1.3.1 特征检测器

每个卷积核就是一个特征检测器。比如:

  • 边缘检测核:[[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]] 检测垂直边缘
  • 模糊核:[[1/9, 1/9, 1/9], [1/9, 1/9, 1/9], [1/9, 1/9, 1/9]] 做均值滤波
  • 锐化核:[[0, -1, 0], [-1, 5, -1], [0, -1, 0]] 增强细节

在 CNN 里,这些核不是手工设计的,而是从数据里学出来的。浅层学边缘、纹理,深层学形状、物体部件。

1.3.2 局部连接 + 权重共享

这是卷积最巧妙的设计:

  • 局部连接:每个神经元只连接输入的一个小区域(感受野)
  • 权重共享:同一个卷积核在整张图上参数相同

这两个特性,直接把参数量从 O(N²) 降到了 O(K²),其中 K 是卷积核大小(通常 3 或 5)。

1.3.3 平移等变性

这个我多说两句。卷积有一个很漂亮的数学性质:输入平移多少,输出特征图也平移多少。

换句话说,猫在图像左边还是右边,卷积检测到的“猫耳朵”特征在特征图上的相对位置不变。这就是为什么 CNN 对平移这么鲁棒。

注意:平移等变性不等于平移不变性。等变是“位置信息被保留但跟着移动”,不变是“完全忽略位置”。CNN 通过池化层才真正获得平移不变性。这个区别,我在做目标检测项目时踩过坑——后面讲目标检测章节会细说。

1.4 从全连接到卷积:一个直观对比

我整理了一张对比表,方便你理解:

特性 全连接层 卷积层
连接方式 每个输入连每个输出 局部感受野
权重共享 否 是(同一核共享)
参数量(256×256 输入,64 个输出通道) 256×256×64 ≈ 419 万 3×3×64 ≈ 576(步长1,无填充)
空间结构 破坏(展平为向量) 保留(输出仍是 2D 特征图)
平移等变性 无 有
硬件实现 矩阵乘法(GEMM) 滑动窗口 + 乘累加

你看,参数量差了四个数量级。这就是为什么图像任务必须用卷积。

1.5 知识体系总览

下面这张图,是我做这门课之前画的整体框架。你先有个印象:

卷积神经网络硬件加速知识体系 卷积基础 全连接 vs 卷积 数学本质与物理意义 经典 CNN 结构 池化与激活 批量归一化 残差连接 FPGA 加速原理 脉动阵列架构 数据复用策略 量化 RTL 设计与验证 片上系统集成 性能调优 本章聚焦第一层(蓝色),为后续硬件加速打下理论基础

1.6 为什么硬件加速需要理解这些?

你可能觉得,做硬件的人懂点 RTL 就行了,为什么要抠这些数学概念?

我跟你讲个真实经历。有一次做 FPGA 加速器,团队里一个同事把卷积核设计成 7×7,觉得“大核感受野大,效果更好”。结果资源消耗爆炸,DSP 不够用,BRAM 也不够用。

后来我让他算了一笔账:

  • 7×7 卷积核:49 次乘法/输出点
  • 3×3 卷积核:9 次乘法/输出点
  • 堆叠两层 3×3:18 次乘法/输出点,感受野等效 5×5
  • 堆叠三层 3×3:27 次乘法/输出点,感受野等效 7×7

你看,用三个 3×3 替代一个 7×7,乘法量从 49 降到 27,节省了 45% 的算力,而且非线性更强(中间多了两层激活函数)。

硬件视角的启示:3×3 卷积在 FPGA 上特别好优化——数据复用率高,脉动阵列的 PE 利用率也高。后面第 15 章讲脉动阵列时,你会看到 3×3 核的硬件效率几乎是 7×7 的两倍。

1.7 本章小结

好,咱们捋一下今天的关键点:

  1. 全连接不适合图像:参数爆炸、破坏空间结构、没有平移等变性
  2. 卷积的核心操作:滑动窗口 + 局部加权求和
  3. 两个关键设计:局部连接(感受野)和权重共享
  4. 物理意义:每个卷积核是一个可学习的特征检测器
  5. 硬件启示:卷积核大小直接影响资源消耗和加速效率