第二章 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)替代了循环结构。核心思想是:每个位置都能直接看到所有其他位置。

自注意力的计算分三步:

  1. 生成Q、K、V三个矩阵(通过线性变换)
  2. 计算注意力分数:Q × K^T,再除以√d_k
  3. 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,再到量化稀疏化,层层递进。

第二章 AI算法基础:知识体系 感知机 多层感知机(MLP) 激活函数 卷积神经网络 (CNN) 卷积层 | 池化层 | 全连接层 循环神经网络 / Transformer LSTM | GRU | 自注意力 | 多头注意力 量化与稀疏化 从基础到优化,每一层都影响芯片架构设计

嗯,这一章的内容就到这里。神经网络的基础概念,是后面所有芯片架构设计的前提。搞懂了这些,你才能理解为什么芯片要这么设计、为什么计算单元要这么排布、为什么存储架构要这么组织。


公众号:蓝海资料掘金营,微信deep3321