专栏算法工具链Transformer不是只有注意力:一文吃透Q/k/v、本体积木、与Cnn的异同&量化落地注意

Transformer不是只有注意力:一文吃透Q/k/v、本体积木、与Cnn的异同&量化落地注意

Huanghui2025-09-07
92
0

1. 注意力的本质:Q/K/V 的角色与数据流

1.1 三个角色

  • Q(Query,查询):我要找什么(我的检索意图)。
  • K(Key,键):我是谁(供别人匹配我的“身份标签”)。
  • V(Value,值):我能提供的内容(被加权汇总的语义)。

1.2 公式

$$
\mathrm{Attention}(Q,K,V) = \mathrm{softmax}\left( \frac{QK^{\top}}{\sqrt{d_k}} \right) V
$$
  • 输入序列 $X\in\mathbb{R}^{B\times S\times H}$ 乘以可学习的 $W_Q,W_K,W_V$ 得到 $Q,K,V$。

  • 点积得到相似度,softmax 转成概率分布。

  • 对所有位置的 $V$ 加权求和(不是“命中一个取一个”),得到输出。

1.3 多头注意力(Multi-Head Attention)

  • 将 $H$ 划分为多个头(head),每头维度 $D=H/\mathrm{heads}$:$[B,S,H]\to[B,\mathrm{heads},S,D]$。

  • 不同头学习不同的相关性样式(短/长依赖、语法/语义偏好等),分工+汇合,总体表达不减反增。
示意图
Multi-Head Attention
图:Multi‑Head Attention 数据流

2. Transformer 架构全貌(注意力只是其中一环)

注意力是心脏,但 Transformer 是一个完整的“身体”。典型 Encoder/Decoder Block 还包含:

组件

作用

特点

类比

Multi‑Head Attention

全局依赖建模

高并行,核心 O(S²)

开会交流

前馈网络 FFN

每 token 独立特征提炼

两层线性+激活,常 4H 扩展

会后总结

残差连接

保信息/稳训练

防梯度退化

保留原始记录

LayerNorm

数值稳定

控制均值/方差

心理医生

Positional Encoding

注入顺序感

绝对/相对/旋转位置

页码/座位号

Encoder Block 结构图
Transformer Encoder Block
图:Transformer Encoder Block(来源:Lilian Weng 博客)

常见实现要点:

  • FFN:FFN(x)=ϕ(xW_1+b_1)W_2+b_2,$\phi$ 常用 GELU/SiLU/RELU,维度 H→4H→H。
  • 残差+Norm:x = x + SubLayer(LN(x))(Pre‑LN 更易深层训练)。
  • 位置:绝对(正余弦/可学习)、相对(T5/Transformer‑XL)、旋转位置(RoPE)。

3. 为什么有那么多 reshape / transpose?

3.1 数据形状切换

  • 原始:[B, S, H]
  • 拆头:→ [B, S, heads, D] → [B, heads, S, D]
  • 计算 Q @ K^T:需要 K 形状 [B, heads, D, S](对后两维转置)
  • 拼头:[B, heads, S, D] → concat → [B, S, H]

3.2 工程挑战

  • 在 PyTorch 里多为视图变换;但端侧 BPU 上,layout 不匹配可能触发真实拷贝/重排,带来带宽与延迟成本。

3.3 工程优化

  • QKV 融合(一次 GEMM 产出三者);
  • layout‑aware:用 matmul(transpose_b=True) 避免显式 permute 新张量;
  • 对齐:让 heads/seq_len/head_dim 成为内核友好的倍数;
  • 块化注意力/FlashAttention:降低中间态与溢出风险。

4. Transformer vs CNN

维度

Transformer

CNN

依赖建模

全局(任意两位置直接交互)

局部(需叠层/池化扩感受野)

复杂度

注意力核 O(S²D),可用块化/稀疏/线性注意力优化

单层 O(S·k²·C),总体近线性

归纳偏置

弱(更依赖数据)

强(平移不变、局部平滑)

并行性

高度 GEMM 并行

高缓存命中率与数据局部性

位置/空间

需显式位置编码

天然位置感

数据效率

往往更吃数据与正则

通常更高效

擅长

长依赖、跨模态、预训练大模型

实时/边缘视觉

工程折中:Conv stem、FFN 中引入 DWConv、局部注意力等 = 弱卷积先验 + 全局注意力 的结合。

5. Transformer 量化难点与破法

下列每项按 作用 → 原理 → 难点 → 解法 → 示例 五段式给出,便于检索与落地。

5.1 Softmax 与 Attention Score(QK^T)

作用:把相关性打分转为概率分布,控制每个 token 的注意力。
原理:scores=(QK^T)/√D + mask,weights=softmax(scores)。
难点:范围波动大;mask 注入极大负值;exp/归一化 对量化误差极敏感 → 分布塌缩/过平。
解法:logit clipping;减行最大值;块化 softmax(FlashAttention);混合精度;exp 近似(LUT/多项式)。
示例(PyTorch)

5.2 LayerNorm(或 RMSNorm)

作用:稳定激活分布,缓解梯度爆炸/消失。
原理:LN(x)=(x-μ)/√(σ²+ε)*γ+β;RMSNorm(x)=x/||x||_rms*γ。
难点:低比特下均值/方差路径不稳,误差被放大。
解法:RMSNorm 替代, 去掉减均值操作,只用均方根作为缩放。
示例(RMSNorm)

5.3 残差分支(Add)与尺度对齐

作用:y=x+f(x),保留原信息,支持深层训练。
原理:逐元素相加,需同一标度。
难点:量化尺度不齐(Sx≠Sf)→ 饱和/分辨率丢失。
解法:requant 对齐;残差用更高比特(INT16/FP16);图融合 BiasAdd/ResidualAdd。
示例(定点相加)

5.4 FFN 与激活(GELU/SiLU)

作用:每 token 独立非线性变换与特征重组。
原理:FFN(x)=φ(xW1+b1)W2+b2;常用 φ=GELU/SiLU,维度 H→4H→H。
难点:GELU 含高斯 CDF,整数域代价高;激活/权重分布长尾。
解法:函数近似(多项式/Tanh 近似);可替换 ReLU/Relu6(视任务);QAT。
示例(GELU 近似)

5.5 Q/K/V 与形状变换(重排带宽)

作用:线性映射得到 Q/K/V 并拆多头并行。
原理:三次线性层或一次 QKV 融合,输出 [B,S,3H] 再切片。
难点:显式 permute/transpose 在端侧触发拷贝;heads/D/S 不对齐致慢核与填充。
解法:QKV 融合;matmul(transpose_b=True) 避免显式转置;对齐到向量宽度(8/16/32)。
示例(融合 QKV)

5.6 KV Cache(长上下文推理)

作用:缓存历史 K/V,避免重复计算,加速自回归/长上下文。
原理:每步把新 token 的 K/V 追加到缓存,查询只与缓存做注意力。
难点:INT8 下 K/V 尺度漂移,长序列累计误差;层/头统计差异大。
解法:per‑head / per‑layer scale;块化缓存(128/256 token 一块);关键层回退 FP16。
示例

5.7 RoPE / 相对位置编码的量化

作用:在注意力中注入相对位置(旋转坐标/相位编码),增强长距建模。
原理:对偶奇维做二维旋转:$[e,o]\to[e\cos\theta-o\sin\theta,e\sin\theta+o\cos\theta]$。
难点:三角函数整数域实现复杂;长序列相位外推更敏感。
解法:预计算 cos/sin(FP16)并广播;LUT/分段近似;QAT 中模拟近似核。
示例(RoPE 片段)

汇总速查表

环节

作用

难点

参考解法

Softmax/scores

概率归一

溢出/塌缩

剪裁+减行最大+块化+混合精度

LN/RMSNorm

稳定数值

统计不稳

RMSNorm/高精/折叠

残差 Add

深层训练

尺度不齐

requant 对齐/高比特残差

FFN/GELU

非线性提炼

近似误差

函数近似/QAT/可替换激活

QKV/重排

带宽瓶颈

隐式拷贝

QKV 融合/layout‑aware/对齐宽度

KV Cache

长序列

尺度漂移

per‑head scale/块化/混合精度

RoPE/相对位

位置建模

三角近似

预计算/LUT/QAT


6. 实操要点

全章采用统一结构,便于检索与复用;在不改变你原先要点的前提下,补齐“原理与示例”

6.1 架构选择:优先 Pre‑LN

作用:提升深层训练稳定性与收敛性,便于混合精度/量化落地。
原因(保留):Pre‑LN 梯度更稳、收敛更易;LN 可保高精,其余低精时更一致。
原理:子层输入前做归一化,反向梯度不穿过未归一化长链路;Post‑LN 需跨子层与残差,易消失/爆炸。
做法:每子层采用 x = x + SubLayer(LN(x))。
收益:更深层可训、震荡小;量化时 LN 保高精不破结构。
示例

6.2 归一化算子保高精 / RMSNorm 替代

作用:稳定激活分布,降低低比特误差放大。
原因(保留):LN 对统计量敏感;RMSNorm 更简洁稳定。
原理:LN 需均值/方差(平方/开方),RMSNorm 只需均方根,路径更短。
做法:LN/RMSNorm 用 FP16/BF16;把缩放与后续线性层融合减算子。
收益:推理更稳、延迟更低。
示例

6.3 QKV 融合与 layout‑aware 设计

作用:降低带宽与重排开销,减少 GEMM 次数。
原因(保留):三次投影与显式转置放大带宽/拷贝;融合更高效。
原理:内核支持 transpose_b/strided_batched_gemm;算子级转置优于张量级 permute+contiguous。
做法:一次线性层产出 [B,S,3H] 切 Q/K/V;用 matmul(transpose_b=True)。
收益:延迟下降、吞吐提升。
示例(C++)

6.4 SmoothQuant / Outlier 处理

作用:抑制激活 outlier 对 INT8 尺度的拖累。
原因(保留):outlier 迫使激活 scale 过大,主体分辨率下降。
原理:通道尺度重分配(A 缩小 / W 放大)保持线性等价。
做法:统计每通道激活峰值 a_max[c],设 α_c=a_max[c]^β 调整。
收益:激活 per‑tensor 量化更稳,精度回升。
示例

6.5 残差尺度策略

作用:保证 x + f(x) 在整数域的可加性与精度。
原因(保留):不同尺度相加会溢出或丢分辨率。
原理:在公尺度 Sx 下做 X + round(F*Sf/Sx) 的整数加法。
做法:Add 前做 requant 对齐;必要时残差路径用 INT16/FP16。
收益:防溢出,保留残差信息。
示例

6.6 校准与验证

作用:让量化尺度匹配真实分布与场景。
原因(保留):仅短序列/无掩码校准会失配长序列/有掩码推理。
原理:量化标定相当于估计上界/分位数,需覆盖多模态分布。
做法:混合不同长度、掩码形态、采样温度的样本校准。
收益:部署精度与线上一致。
示例

6.7 静态形状与对齐

作用:避免动态形状引起的编图/调度降级与隐式拷贝。
原因(保留):动态 shape 触发慢核或重编译;对齐减少尾部填充。
原理:对齐到向量宽度(8/16/32)能减少分支与 padding。
做法:限制 S/Heads/D 到固定集合并对齐。
收益:吞吐提升、延迟更稳。
示例(配置)

6.8 混合精度映射表(推荐)

作用:在精度与性能间取得最优折中。
原因(保留):把敏感环节放高精,线性算子用 INT8 更经济。
原理:softmax/LN 误差放大效应高;线性层依赖 int32 累加与 per‑channel scale。
做法:按模块指定精度策略。
收益:兼顾精度/吞吐。
示例(YAML)

6.9 端到端流程(PTQ → QAT → 部署)

作用:保证训练/推理数值路径一致,避免“训练好、部署崩”。
原因(保留):近似函数/布局/块化策略不一致会造成域外误差。
原理:以 QAT 模拟部署核,确保量化、近似、块化完全对齐。
做法:Pre‑LN + FusedQKV + RMSNorm → SmoothQuant → PTQ 校准 → 不达标则 QAT → 部署启用块化注意力与静态形状。
收益:达成精度目标并获得稳定吞吐。
示例(伪带啊吗)

7. 结语

  • 注意力 ≠ Transformer:Attention 是心脏,但 Transformer 的身体还有 FFN/残差/Norm/位置等关键器官。
  • 与 CNN 的差异:全局 vs 局部、弱偏置 vs 强偏置、GEMM 并行 vs 高数据局部性。
  • 量化落地三要素layout‑aware + 混合精度 + QKV 融合。再配合 块化注意力静态形状对齐,才能把理论优势转成端侧吞吐。
算法工具链
技术深度解析杂谈
评论0
0/1000