Transformer 在计算 attention 的时候使用的是点乘还是加法?请说明理由。
- 标签:Transformer
🏛 业务架构师
Transformer 注意力用的是**点乘(缩放点积)**而非加性(加法)注意力。理由我按"计算—精度—工程"三层讲:
1. 计算效率(主因):点积可以表述为矩阵乘法 Q·K^T——GPU/TPU 为矩阵乘设计的硬件(Tensor Core)执行它的效率比逐元素加法+激活函数(加性注意力是前馈网络打分)高一个数量级。序列长、规模大时,矩阵化就是"能不能训得动"的差别。缩放因子 √dk 的作用:维度大时点积方差变大,softmax 进入饱和区(梯度趋零)——除以 √dk 把方差拉回稳定区间,训练才稳定。
2. 精度不劣:原论文实验表明 dk 较小时两者效果相当(dk 大时未缩放的点积会劣化——所以缩放是点乘方案必需的配套)。既然效果打平,计算快的方案胜出。
3. 工程生态:矩阵乘法有成熟的算子优化(cuBLAS、FlashAttention 的 IO 感知优化都建立在点积形式上)——加性注意力的逐元素非线性会成为访存瓶颈,整个推理优化生态都偏爱点积。
业务视角的引申:这个选择揭示了深度学习工程学的一条铁律——数学上等价(或近似)的方案,胜出的是最贴合硬件的那一个。"能变成矩阵乘的都会赢"在 GPGPU 时代反复应验(卷积的 im2col、注意力的 FlashAttention 都是同一逻辑)。面试时点出这层"算法-硬件协同演化"的认知,比背公式更能体现架构视野。
🏗 系统架构师
用点乘(dot product),不是加法——原论文与后续实践的一致选择,理由四层:
计算效率(决定性理由):点乘可以退化为一次矩阵乘
QK^T——整个序列的注意力分数一步算出,GPU/TPU 上的高度优化内核(GEMM)直接吃满硬件;加性注意力(Bahdanau,v^T·tanh(Wq + Uk)逐对过前向网络)无法矩阵化,慢数倍——在注意力这种 n² 对的运算上,可矩阵化就是生命线,这是 Transformer 能规模化的工程前提之一;表达力对等:理论分析表明,在 d_k 低维时两者表达力相近;加性注意力只在 q、k 维度差异大的场景有优势——标准注意力 q/k 同维,点乘够用;
点乘的数值病有廉价解:高维点积方差大(d_k 大时分数分布过宽,softmax 饱和梯度消失)——解决方式是缩放因子 √d_k(scaled dot-product):
softmax(QK^T/√d)——一个除法解决,不需要换架构。这个缩放是 Attention 公式的标配细节(面试常考"为什么除以 √d"——内积方差为 d,除 √d 归一化回单位方差,保 softmax 梯度健康);生态正反馈:FlashAttention 等所有注意力优化内核都为点乘设计——加性路线连基础设施红利都吃不到。
架构师总结:点乘 vs 加法是"能上 GPU 矩阵管线 vs 不能"的差别——深度学习架构竞争中,与硬件亲和的设计总是赢(CNN 的卷积、注意力的 GEMM 化同例)。
💻 全栈开发专家
用的是点乘(缩放点积注意力),原论文对比过加法(加性注意力,Bahdanau):
加法注意力:score(h, s) = vᵀ·tanh(W₁h + W₂s)——用一个前馈网络算分数。 点积注意力:score(q, k) = qᵀ·√(1/d_k)·k——直接矩阵乘。
选点乘的三个理由:
- 计算效率(决定性):点积是纯矩阵乘(QKᵀ),GPU/TPU 上高度优化的 GEMM 操作,可整个 batch 并行;加法要逐对过 MLP,无法融合成大矩阵乘,慢一个数量级——「数学上近似,工程上碾压」;
- 表达能力足够:实验表明两者精度相当,d_k 适当时点积不输加法(加法在 d_k 很小时理论上略优,但这个区间现代模型不处);
- 与硬件协同进化:现代加速器(Tensor Core)就是为矩阵乘设计的,整个 Transformer 生态(FlashAttention 等优化)都建立在矩阵乘原语上。
为什么还要除以 √d_k(必追问): q、k 各分量独立、均值 0 方差 1 时,点积 q·k 的方差是 d_k——维度 64 时点积标准差 8,分数值域过大直接把 softmax 推入饱和区(输出近似 one-hot),梯度近乎为零,训练不动。除以 √d_k 把方差拉回 1,softmax 保持平滑可导。
一句话:点乘赢在「矩阵乘友好 + 缩放后数值稳定」,加法注意力作为历史方案留在 seq2seq 时代——架构选择的背后是数学与硬件工程的双重博弈。