第二章 AI算法基础:神经网络核心概念
做芯片架构设计,不懂AI算法,就像盖楼不看图纸。我个人习惯是,先搞清楚算法在算什么,再去想硬件怎么加速。这一章,我们聊聊神经网络那些最基础、也最关键的东西。
2.1 感知机:一切开始的起点
感知机,说白了就是最简单的神经元模型。输入乘以权重,加上偏置,过个激活函数,输出结果。嗯,就这么简单。
核心公式: y = sign(w·x + b)
其中sign是阶跃函数,大于0输出1,否则输出0。
我在项目中遇到过一个问题:感知机只能处理线性可分的问题。你想想看,异或(XOR)这种简单逻辑,单层感知机死活搞不定。这就是后来多层感知机出现的原因。
我的经验: 做硬件加速时,感知机虽然简单,但它的计算模式——乘加运算(MAC),是所有神经网络的基础。芯片里90%的计算量都耗在这上面。
2.2 多层感知机:从线性到非线性
多层感知机(MLP)解决了感知机的局限。它引入了隐藏层和非线性激活函数。为什么会这样?因为多层+非线性,才能逼近任意复杂函数。
我记得第一次在FPGA上实现MLP时,最头疼的是层与层之间的数据搬运。每一层的输出要存下来,再喂给下一层。这直接影响了芯片的存储架构设计。
// 一个简单的MLP前向传播伪代码
// 输入层 -> 隐藏层 -> 输出层
for each layer in layers:
for each neuron in layer:
sum = bias[neuron]
for each input in previous_layer:
sum += weight[neuron][input] * activation[input]
activation[neuron] = ReLU(sum) // 或sigmoid/tanh
避坑指南: 我曾经在芯片设计时忽略了激活函数的硬件实现代价。ReLU很简单,但sigmoid/tanh需要查表或近似计算,面积和功耗差别很大。选激活函数时,一定要考虑硬件友好性。
2.3 卷积神经网络核心算子
CNN的核心就三个东西:卷积、池化、全连接。其中卷积占了80%以上的计算量。
2.3.1 卷积操作
卷积说白了就是滑动窗口做点积。输入图像上滑过一个卷积核,每个位置算一个值。你想想看,一张224x224的图,64个3x3的卷积核,一次卷积就要算几百万次乘加。
| 参数 | 典型值 | 硬件影响 |
|---|---|---|
| 卷积核大小 | 3x3, 5x5 | 决定乘法器阵列规模 |
| 输入通道数 | 3, 64, 256 | 影响数据复用策略 |
| 输出通道数 | 64, 128, 512 | 决定输出缓冲大小 |
| 步长 | 1, 2 | 影响数据读取模式 |
关键洞察: 卷积的硬件加速核心是数据复用。输入特征图、权重、输出特征图,三者之间如何复用数据,直接决定了芯片的带宽需求和计算效率。
2.3.2 池化与全连接
池化很简单,就是取最大值或平均值,降低特征图尺寸。全连接层其实就是MLP,放在CNN最后做分类。
我个人习惯把池化看成是"降采样",它不涉及乘加运算,但需要比较器或加法器。全连接层虽然计算量不如卷积大,但参数量惊人——一个1024x1000的全连接层就有100万个参数。
2.4 循环神经网络与Transformer
RNN处理序列数据,比如文本、语音。它的特点是:当前时刻的输出依赖上一时刻的隐藏状态。说白了就是有"记忆"。
但RNN有个大问题:梯度消失/爆炸。长序列训练时,前面的信息传不到后面。我在项目中遇到过,训练一个50步的RNN,梯度传到第10步就几乎为零了。
2.4.1 LSTM与GRU
LSTM通过门控机制解决了这个问题。遗忘门、输入门、输出门,三个门控制信息的流动。GRU是简化版,只有两个门。
硬件视角: LSTM的计算量是普通RNN的4倍。每个时间步要算4组权重矩阵的乘加。做芯片时,我建议优先考虑GRU,效果差不多但计算量少25%。
2.4.2 Transformer:颠覆者
Transformer彻底改变了序列建模的方式。它用自注意力(Self-Attention)替代了循环结构。核心思想是:每个位置都能直接看到所有其他位置。
自注意力的计算分三步:
- 生成Q、K、V三个矩阵(通过线性变换)
- 计算注意力分数:Q × K^T,再除以√d_k
- Softmax归一化后乘以V
你想想看,这计算量有多大?序列长度N,每个注意力头要算N×N的注意力矩阵。这就是为什么Transformer在芯片上需要大量的矩阵乘法单元。
避坑指南: 我曾经在早期设计时低估了Softmax的硬件开销。它涉及指数运算和除法,在FPGA上实现很麻烦。后来用了近似计算和查找表,才把延迟降下来。
2.5 量化与稀疏化基础
这两个技术是AI芯片的"法宝"。为什么?因为神经网络有冗余,我们可以用更少的比特、更少的计算来达到差不多的精度。
2.5.1 量化:用更少的比特
量化就是把32位浮点数变成8位甚至4位整数。我见过最极端的项目,用2位量化,精度只掉了1%。
| 量化方式 | 比特数 | 精度损失 | 硬件收益 |
|---|---|---|---|
| FP32 | 32 | 无 | 基准 |
| INT8 | 8 | <1% | 4倍存储,4倍计算速度 |
| INT4 | 4 | 1-3% | 8倍存储,8倍计算速度 |
| 二值化 | 1 | 5-10% | 32倍存储,乘法变XNOR |
核心原则: 量化不是简单的截断。需要做校准(Calibration),找到合适的缩放因子和零点。我建议用KL散度或均方误差来选量化参数。
2.5.2 稀疏化:砍掉冗余计算
稀疏化就是让权重矩阵中很多元素变成0。为什么可以这样?因为训练后的神经网络,很多权重值很小,对结果影响不大。
稀疏化有两种:
- 非结构化稀疏: 随机位置置零,压缩率高但硬件不友好
- 结构化稀疏: 按块或按通道置零,硬件容易加速
我记得有一次做芯片架构评估,非结构化稀疏虽然压缩率更高,但硬件利用率只有30%。换成结构化稀疏后,利用率直接飙到85%。
我的建议: 做AI芯片时,优先考虑结构化稀疏和INT8量化的组合。这个组合在精度和效率之间取得了最好的平衡。我经手的三个项目都是这么做的,效果都不错。
2.6 本章知识体系
下面这张图展示了本章的核心知识结构,从感知机到Transformer,再到量化稀疏化,层层递进。
嗯,这一章的内容就到这里。神经网络的基础概念,是后面所有芯片架构设计的前提。搞懂了这些,你才能理解为什么芯片要这么设计、为什么计算单元要这么排布、为什么存储架构要这么组织。
公众号:蓝海资料掘金营,微信deep3321