第一章:卷积神经网络基础
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 小结
这一章,我们聊了三个核心问题:
- 为什么不用全连接?——参数太多,丢空间信息
- 卷积在算什么?——滑动窗口做加权求和
- 为什么能提取特征?——局部模式匹配,层层抽象
我个人觉得,理解这些比背公式重要得多。公式忘了可以查,但直觉丢了就真丢了。下一章,我们会深入卷积的具体计算细节,以及它在硬件上是怎么跑的——嗯,那才是加速器设计的重头戏。
一句话总结:卷积就是用局部+共享的方式,让网络学会“看”图像中的模式。你想想看,这不就是人类视觉系统的简化版吗?
可可精品资料库