跳到主要内容

AI/LLM 架构专题 (Deep Dive)

“架构决定了智能的边界,而算子决定了实现的效率。” 本专题深入剖析现代 AI 系统中从空间建模(CNN)到序列建模(Transformer)的演进,并探讨底层工程优化的本质。


1. 卷积神经网络 (CNN) 与张量变换推导

卷积不仅仅是滑动窗口,它是局部连接与权值共享的线性映射。

1.1 卷积输出形状的严格推导

给定输入张量形状 (Hin,Win)(H_{in}, W_{in}),卷积核 (Kh,Kw)(K_h, K_w),步长 SS,填充 PP,空洞率 DD,输出形状 (Hout,Wout)(H_{out}, W_{out}) 满足: Hout=Hin+2PD(Kh1)1S+1H_{out} = \lfloor \frac{H_{in} + 2P - D(K_h - 1) - 1}{S} + 1 \rfloor Wout=Win+2PD(Kw1)1S+1W_{out} = \lfloor \frac{W_{in} + 2P - D(K_w - 1) - 1}{S} + 1 \rfloor

1.2 算子级实现:im2col 与 Toeplitz 矩阵

在高性能计算中,卷积通常转化为 GEMM (通用矩阵乘法)

  • im2col:将输入张量的每个卷积窗口拉平为行。
  • Weight Matrix:将卷积核拉平为列。
  • 变换本质:卷积 \to 矩阵乘法。

2. Transformer 架构与注意力机制数学解析

Transformer 的核心在于自注意力 (Self-Attention),它消除了 RNN 的序列依赖,实现了并行化。

2.1 缩放点积注意力 (Scaled Dot-Product Attention)

Attention(Q,K,V)=Softmax(QKTdk)VAttention(Q, K, V) = Softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V

为何要除以 dk\sqrt{d_k} 假设 QQKK 的分量是均值为 0、方差为 1 的独立随机变量。则 QKQ \cdot K 的均值为 0,方差为 dkd_k。 当 dkd_k 很大时,点积结果会很大,导致 Softmax 进入梯度极小的饱和区。除以 dk\sqrt{d_k} 可将方差缩回 1,保持梯度稳定。

2.2 多头注意力 (Multi-Head Attention) 的维度变换

Multi-Head 本质上是在不同的特征子空间中并行执行注意力:

  1. Q,K,VQ, K, V 分别通过 WQ,WK,WVW^Q, W^K, W^V 投影到 dmodeld_{model} 维。
  2. 拆分为 hh 个头,每个头维度为 dk=dmodel/hd_k = d_{model}/h
  3. 拼接结果并再次投影。 MultiHead(Q,K,V)=Concat(head1,,headh)WOMultiHead(Q, K, V) = Concat(head_1, \dots, head_h)W^O

3. 强化学习 (RL) 与 RLHF 原理

大模型的“对齐” (Alignment) 离不开强化学习。

3.1 核心原语:马尔可夫决策过程 (MDP)

RL 建模为五元组 (S,A,P,R,γ)(S, A, P, R, \gamma)

  • 策略 π(as)\pi(a|s):在状态 ss 下采取动作 aa 的概率。
  • 价值函数 V(s)V(s):长期累积奖励的期望。

3.2 RLHF (基于人类反馈的强化学习)

LLM 训练的三阶段:

  1. SFT (监督微调):模仿人类对话。
  2. Reward Modeling (奖励建模):根据人类排序训练一个打分模型。
  3. PPO (近端策略优化):使用奖励模型通过 RL 优化策略函数,使其生成的回复得分最高。

4. 算子级工程化与底层优化

AI 算力的瓶颈通常不在计算量 (FLOPS),而在内存带宽 (Memory Bound)。

4.1 内存访问模式优化

  • Kernel Fusion (算子融合):将连续的算子(如 ReLU + Bias)合并为一个 GPU Kernel,减少中间数据写入显存的次数。
  • FlashAttention 核心思想:利用 SRAM 与 HBM 的带宽差异,分块 (Tiling) 计算 Attention,避免存储 N×NN \times N 的中间注意力矩阵。

5. C++ 模拟验证与练习 (Examples)

例题 1:张量形状变换模拟器

实现一个 C++ 类,根据卷积参数自动计算输出张量形状并处理 Stride。

例题 2:手写简单自注意力算子 (CPU 版)

使用 C++ 模拟自注意力机制的核心计算过程(不含 Softmax 细节)。


6. 进阶练习与挑战 (Exercises)

练习 1:卷积的平移不变性证明

证明对于卷积算子 \ast,其满足 f(xδ)w=(fw)(xδ)f(x - \delta) \ast w = (f \ast w)(x - \delta)。这一性质对图像处理有何意义?

Check Solution

证明: 根据连续卷积定义 (fw)(t)=f(τ)w(tτ)dτ(f \ast w)(t) = \int f(\tau)w(t - \tau) d\tau。 令 g(t)=f(tδ)g(t) = f(t - \delta)。 则 (gw)(t)=f(τδ)w(tτ)dτ(g \ast w)(t) = \int f(\tau - \delta)w(t - \tau) d\tau。 令 u=τδ    τ=u+δ,dτ=duu = \tau - \delta \implies \tau = u + \delta, d\tau = du(gw)(t)=f(u)w(t(u+δ))du=f(u)w((tδ)u)du=(fw)(tδ)(g \ast w)(t) = \int f(u)w(t - (u + \delta)) du = \int f(u)w((t - \delta) - u) du = (f \ast w)(t - \delta)

意义: 平移不变性意味着如果输入图像中的物体移动了,其特征响应图(Feature Map)也会发生相应的位移,但特征本身(如边缘、纹理)不会改变。这保证了 CNN 对物体位置的不敏感性。

练习 2:C++ 算子融合 (Kernel Fusion) 模拟

在深度学习推理中,线性层后通常跟着 ReLU。编写一个 C++ 函数,分别实现“分离执行”和“融合执行”,并比较缓存局部性的差异。

Check Solution (Fusion Concept)
#include <iostream>
#include <vector>
#include <algorithm>

void layer_separate(std::vector<double>& vec, double bias) {
// Bias Stage
for(auto& x : vec) x += bias;
// ReLU Stage (再次遍历,浪费缓存)
for(auto& x : vec) x = std::max(0.0, x);
}

void layer_fused(std::vector<double>& vec, double bias) {
// 融合执行 (一次遍历,更好的 Cache Locality)
for(auto& x : vec) {
x = std::max(0.0, x + bias);
}
}

工程上,融合能显著降低对显存/内存的带宽压力。

练习 3:Transformer 显存开销估算

假设输入序列长度为 NN,模型维度为 dmodeld_{model}

  1. 计算 Self-Attention 矩阵(QKTQK^T)的空间复杂度。
  2. NN 从 1024 增加到 8192 时,显存消耗增加多少倍?
  3. 如何使用分块(Tiling)思想降低峰值显存?
Check Solution
  1. 复杂度O(N2)O(N^2)。注意力评分矩阵的大小是 N×NN \times N
  2. 倍数:由于是平方关系,(8192/1024)2=82=64(8192/1024)^2 = 8^2 = 64 倍。
  3. 优化建议:使用 FlashAttention。它不需要一次性生成完整的 N×NN \times N 矩阵,而是通过在线 Softmax(Online Softmax)算法,在计算 QKTQK^T 的一部分时立即与 VV 结合,从而将中间存储复杂度降为 O(N)O(N)