第一章:卷积神经网络基础

1.1 从全连接说起——为什么我们需要卷积

做AI加速器这么多年,我经常被问到同一个问题:“为什么非要用卷积?全连接层不也能做分类吗?”

嗯,这个问题问得好。咱们先想想看,一张224x224的彩色图片,如果直接用全连接层处理,第一个隐藏层假设有1000个神经元——那参数量是多少?224*224*3*1000,大约1.5亿个参数。我当年第一次算这个数的时候,差点把咖啡喷在屏幕上。

说白了,全连接层有两个硬伤:

  • 参数爆炸:图像稍微大一点,模型就胖得跑不动
  • 无视空间结构:它把像素排成一维向量,相邻像素的关系全丢了

我在项目中遇到过一位同事,非要用全连接层做图像识别。模型倒是收敛了,但推理一次要3秒,而且稍微换个角度就认不出来。后来换成卷积,速度提升了20倍,准确率也上去了。

核心观点:卷积的本质,就是用局部连接 + 权值共享,把全连接的“暴力计算”变成“高效特征提取”。

1.2 卷积的数学本质——到底在算什么?

很多人一看到卷积公式就头疼。其实没那么复杂。你想想看,卷积到底在干嘛?

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

(f * g)[n] = Σ f[m] · g[n - m]

但咱们做图像处理的,更关心二维版本:

输出像素 (i, j) = Σ 输入像素 (i+p, j+q) × 卷积核 (p, q)

说白了,就是拿一个小窗口(卷积核),在图像上滑动,每个位置做一次点乘求和。

我记得刚入行时,导师跟我说:“卷积就是加权求和,只不过权重是学出来的。” 这句话我到现在都觉得精辟。

概念 通俗解释 我的经验
卷积核 一个可学习的特征模板 3x3最常用,5x5也行,但别太大
步长 窗口每次移动的像素数 步长=2相当于下采样,省计算量
填充 边缘补零,保持尺寸 我习惯用SAME填充,省心

避坑指南:我曾经在加速器设计时忽略了填充对数据流的影响,结果边界像素的处理延迟比中间多了3个周期。后来我学乖了,设计前先把填充策略定死。

1.3 为什么卷积能提取特征?

这个问题,我思考了很久。后来在一次调试中突然想通了。

你看,卷积核本质上是一个局部模式检测器。比如:

  • 一个检测水平边缘的核:[[-1, -1, -1], [0, 0, 0], [1, 1, 1]]
  • 一个检测垂直边缘的核:[[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]]

当这个核在图像上滑动时,如果某个区域和核的“模式”匹配,输出值就大;不匹配,输出值就小。这就是特征提取的本质——匹配度打分。

我做过一个实验:用随机初始化的卷积核去提取特征,结果一团糟。但训练几轮后,低层核学会了边缘和纹理,高层核学会了眼睛和轮子。这就是卷积网络的层级特征——从具体到抽象。

注意:不是所有卷积核都能提取有用特征。如果训练不好,核可能学到噪声。我曾经见过一个模型,卷积核全是高频噪声,提取的特征毫无意义。所以,好的初始化 + 充足的数据是关键。

1.4 知识体系总览

下面这张图,是我做课程时画的。它把卷积神经网络的基础逻辑串起来了:

全连接层的问题 参数爆炸 丢失空间结构 卷积核心思想 局部连接 权值共享 平移不变性 数学本质 滑动窗口 点乘求和 特征匹配 为什么能提取特征? 局部模式匹配 层级抽象:边缘→纹理→物体 加速器设计启示 数据复用 → 减少访存 并行计算 → 提升吞吐 图:卷积神经网络基础逻辑框架

从这张图你能看到,卷积不是凭空出现的——它是为了解决全连接层的痛点而设计的。而它的数学本质(滑动窗口+点乘求和),恰好让它具备了特征提取的能力。这些,都是我们后面设计加速器时的理论基础。

1.5 小结

这一章,我们聊了三个核心问题:

  1. 为什么不用全连接?——参数太多,丢空间信息
  2. 卷积在算什么?——滑动窗口做加权求和
  3. 为什么能提取特征?——局部模式匹配,层层抽象

我个人觉得,理解这些比背公式重要得多。公式忘了可以查,但直觉丢了就真丢了。下一章,我们会深入卷积的具体计算细节,以及它在硬件上是怎么跑的——嗯,那才是加速器设计的重头戏。

一句话总结:卷积就是用局部+共享的方式,让网络学会“看”图像中的模式。你想想看,这不就是人类视觉系统的简化版吗?

可可精品资料库