01: Transformer 与注意力机制
核心主题:Self-Attention、Multi-Head Attention、位置编码、Encoder-Decoder
来源:Happy-LLM 第二章 + Base-LLM 第四章
1. 从 RNN 到 Attention 的动机
RNN 的三大核心问题驱动了 Transformer 的诞生:
- 顺序计算:时间复杂度 $O(n)$,无法并行化,GPU 利用率低
- 梯度乘法链:长距离依赖需梯度经过多次矩阵乘法 → 梯度消失/爆炸
- 信息瓶颈:所有历史信息压缩到固定维度的隐状态中
Transformer 核心思想
完全基于注意力机制,允许每个 token 直接关注序列中任意位置,实现 $O(1)$ 的信息传递路径和完全并行化计算。
2. Self-Attention 机制
2.1 Q, K, V 投影
输入序列 $X \in \mathbb{R}^{n \times d}$ 通过三个可学习矩阵映射:
- Query:当前 token 的"提问"表示
- Key:其他 token 的"索引"表示
- Value:其他 token 的"内容"表示
2.2 缩放点积注意力 (Scaled Dot-Product Attention)
计算步骤:
- 计算 $QK^T$:得到 $n \times n$ 的注意力分数矩阵
- 除以 $\sqrt{d_k}$:缩放防止数值过大
- (可选)应用 Mask:将不允许关注的位置设为 $-\infty$
- Softmax:归一化为概率分布
- 乘以 $V$:加权求和得到输出
2.3 为什么要除以 $\sqrt{d_k}$?
面试高频题
当 $d_k$ 较大时,$q \cdot k = \sum_{i=1}^{d_k} q_i k_i$ 的方差约为 $d_k$(假设 $q_i, k_i$ 独立同分布,均值0方差1)。
大方差 → softmax 输入值差异极大 → 输出趋近 one-hot → 梯度接近 0。
除以 $\sqrt{d_k}$ 将方差归一化为 1,确保 softmax 工作在梯度敏感区间。
3. Multi-Head Attention
3.1 动机与公式
动机:单一注意力只能捕获一种关系模式;多头可以同时关注不同子空间的不同关系。
每个头的维度:$d_k = d_v = d_{model} / h$
3.2 参数量计算
| 组件 | 参数量 |
|---|---|
| $W_i^Q, W_i^K, W_i^V$ (所有头) | $3 \times d_{model} \times d_{model}$ |
| 输出投影 $W^O$ | $d_{model} \times d_{model}$ |
| MHA 总参数 | $4d_{model}^2$ |
4. Transformer Block
4.1 Pre-Norm vs Post-Norm
| 方式 | 公式 | 优劣 |
|---|---|---|
| Post-Norm (原始) | $x = \text{LN}(x + \text{MHA}(x))$ | 正则化更强,但深层训练不稳定 |
| Pre-Norm (现代) | $x = x + \text{MHA}(\text{LN}(x))$ | 梯度传递更稳定,适合深层模型 |
现代 LLM 统一采用 Pre-Norm(LLaMA, GPT-3 等)。
4.2 前馈网络 (FFN)
原始 Transformer:$d_{ff} = 4 \times d_{model}$,使用 ReLU。现代 LLM 使用 SwiGLU(见第3章)。
5. 位置编码
5.1 正弦位置编码 (Sinusoidal PE)
性质:
- 不同位置有唯一编码
- 相对位置可通过线性变换表示:$PE(pos+k) = f(PE(pos))$
- 有界(值域 [-1, 1]),支持任意长度外推
5.2 RoPE 旋转位置编码
RoPE 核心思想
将位置信息编码为复数平面的旋转,使得 $q_m \cdot k_n$ 的注意力分数仅依赖相对位置 $m - n$。
为什么要用复数乘法?—— 二维平面旋转
将向量相邻两个维度看作复数的实部和虚部:$x = x_r + i x_i$。乘上单位复数 $e^{i\theta} = \cos\theta + i\sin\theta$:
展开后等价于二维旋转矩阵:
即:向量在二维平面上旋转了角度 $\theta$。不同位置用不同旋转角度 $\theta_m = m \cdot \theta_0$,旋转角度差即为相对距离。
实现方式(逐对维度做二维旋转):
# 频率计算
freqs = 1.0 / (theta ** (torch.arange(0, dim, 2) / dim))
# 应用旋转
xq_out_r = xq_r * cos - xq_i * sin
xq_out_i = xq_r * sin + xq_i * cos
RoPE vs Sinusoidal PE 面试对比
| 特性 | Sinusoidal PE | RoPE |
|---|---|---|
| 编码类型 | 绝对位置 | 相对位置 |
| 作用位置 | 加到输入 embedding | 加到 Q/K(每层) |
| 长度外推 | 较弱 | 较强(NTK-aware 可进一步增强) |
| 额外参数 | 无 | 无 |
| 使用模型 | 原始 Transformer, BERT | LLaMA, Qwen, GPT-NeoX |
6. Encoder-Decoder 架构
6.1 Encoder
每一层:Self-Attention + FFN(均带残差 + LN)
- 双向注意力:每个 token 可以关注全部位置
- 输出:上下文感知的序列表示
6.2 Decoder & Causal Mask
Decoder 使用 Masked Self-Attention:通过上三角 Mask 矩阵阻止关注未来位置。
实现:将 $-\infty$ 加到注意力分数上,softmax 后变为 0。
6.3 Cross-Attention
Decoder 的第二个注意力层:
- Q:来自 Decoder 的当前表示
- K, V:来自 Encoder 的输出
作用:让 Decoder 在生成时"查阅"输入序列的信息。
7. 时间复杂度对比
| 模型 | 每层复杂度 | 序列操作数 | 最大路径长度 |
|---|---|---|---|
| Self-Attention | $O(n^2 \cdot d)$ | $O(1)$ | $O(1)$ |
| RNN | $O(n \cdot d^2)$ | $O(n)$ | $O(n)$ |
| CNN | $O(k \cdot n \cdot d^2)$ | $O(1)$ | $O(\log_k n)$ |
Self-Attention 优势:最短信息传递路径 $O(1)$,但二次复杂度是长序列的瓶颈。
面试要点总结
高频面试题
- Transformer 相比 RNN 的优势? 并行计算 + $O(1)$ 信息路径 + 无梯度消失
- 为什么要缩放(除以 $\sqrt{d_k}$)? 防止 softmax 饱和,保持梯度流动
- Multi-Head 的作用? 不同头捕获不同类型的关系(语法、语义、指代等)
- Pre-Norm vs Post-Norm? Pre-Norm 训练更稳定(梯度直通),现代 LLM 标配
- Self-Attention 的缺点? $O(n^2)$ 复杂度;无位置感知(需要PE);无归纳偏置
- Causal Mask 如何实现? 上三角矩阵填充 $-\infty$,softmax 后自动归零
- Transformer 参数量估算? 每层 $\approx 12d^2$(4d^2 MHA + 8d^2 FFN),总 $\approx 12Nd^2$