CS231n(捌)——注意力与Transformer
Transformer 如今无处不在!但它们最初是从 RNN 的 Encoder-Decoder 架构演变而来的。
$\large\star$ 一、从 RNN 到 Attention
1.1 Encoder-Decoder 的瓶颈
RNN 机器翻译流程:
- Encoder:逐词读入源语言 → 更新隐藏状态 → 最终隐藏状态 hT 作为上下文向量 c
- Decoder:从 c 初始化解码器 → 逐词生成目标语言
⚠️ 问题:整个输入序列的信息被压缩进一个固定大小的向量 c 中。如果 T = 1000,会严重信息瓶颈!
1.2 解决方案:Attention
让 Decoder 在每一步回顾整个输入序列,而不是只看一个固定的 c。
1.3 Bahdanau Attention 步骤
每一步解码时:
- 计算对齐分数:et, i = fatt(st − 1, hi)(用小网络或线性层)
- Softmax 归一化:$a_{t,i} = \frac{\exp(e_{t,i})}{\sum_j \exp(e_{t,j})}$(注意力权重,和为1)
- 加权求和:ct = ∑iat, ihi(上下文向量)
- 输入解码器:st = gU(yt − 1, st − 1, ct)
💡 直觉: - 翻译
"vediamo"时注意力集中在"we"和"see"上(a11 ≈ a12 ≈ 0.45) - 翻译"il"时注意力集中在"the"上(a23 ≈ 0.8) - 整个过程中注意力权重没有显式监督,完全由梯度下降自动学习!
1.4 Attention 的本质
Attention 是一个通用算子:给定一组查询向量 Q 和一组数据向量 X,每个查询关注所有数据向量,产生一个输出向量。输出 = 所有数据的加权和,权重由查询与数据的相似度决定
$\large\star$ 二、Attention 层的形式化
2.1 标量点积 Attention
输入:查询 q、数据向量 X = [x1, ..., xN]
计算: $$e_i = q \cdot x_i / \sqrt{D} \qquad a = \text{softmax}(e) \qquad y = \sum_i a_i x_i$$
除以 $\sqrt{D}$(scaled dot product)防止大维度导致内积过大、Softmax 饱和、梯度消失。
2.2 向量化 Attention
输入:Q[NQ × DQ], X[NX × DX], WK, WV
计算: $$K = XW_K \quad V = XW_V \quad E = QK^T / \sqrt{D_Q}$$ A = softmax(E, dim=1) Y = AV
2.3 三种 Attention 形式
| 类型 | 查询来源 | 数据来源 | 用途 |
|---|---|---|---|
| Cross-Attention | Decoder 状态 Q | Encoder 输出 X | Seq2Seq 翻译 |
| Self-Attention | X 自身 | X 自身 | 输入序列内部建模 |
| Masked Self-Attention | X 自身 | X 自身(禁止看未来) | 自回归语言模型 |
2.4 Self-Attention 的数学公式
每个输入向量 xi 同时作为查询、键和值:
Q = XWQ, K = XWK, V = XWV $$\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^T}{\sqrt{d_k}}\right) V$$
Self-Attention = 就是 4 个矩阵乘法! 1. QKV 投影;2. QK 相似度;3. V 加权;4. 输出投影
2.5 Self-Attention 的性质
| 性质 | 说明 |
|---|---|
| 排列等变性 | 对输入进行排列只会产生相同排列的输出:F(π(X)) = π(F(X)) |
| 无法感知顺序 | Self-Attention 不天然知道输入顺序 → 需要位置编码 |
2.6 位置编码
| 方案 | 方法 |
|---|---|
| 可学习的位置嵌入 | 每个位置一个可学习向量,直接加到输入上 |
| RoPE(旋转位置编码) | 将位置映射为角度,旋转 Q 和 K 来编码相对位置:qm ⋅ kn = q[(m − n)θ] |
| ALiBi | 从相似度中减去与距离成比例的偏置 |
2.7 Multihead Self-Attention
并行运行 H 个独立的 Self-Attention(称为 heads),每个有不同的 WQ, WK, WV:
- 每个 head 用较小的维度 DH = D/H
- 将所有 head 的输出拼接 → 投影回 D 维
完整的 Multihead Attention 公式:
[Q, K, V] = X[WQ, WK, WV] [N × 3HDH]
$$E = QK^T / \sqrt{D_H} \qquad [H \times N \times N]$$
A = softmax(E, dim=2) Y = AV O = YWO
2.8 复杂度分析
| 指标 | 复杂度 |
|---|---|
| 计算量 | O(N2) |
| 内存 | O(N2)(存储注意力矩阵 H × N × N) |
当 N = 100K, H = 64 时,注意力矩阵占 1.192 TB!
Flash Attention (Dao et al., 2022):通过 IO 感知的平铺计算,在不显式存储完整注意力矩阵的情况下完成 Attention,将内存降至 O(N)。
$\large\star$ 三、Transformer 架构
3.1 Transformer Block
$$x \to \boxed{\text{Self-Attention}} \to \boxed{+} \to \boxed{\text{LayerNorm}} \to \boxed{\text{MLP}} \to \boxed{+} \to \boxed{\text{LayerNorm}} \to y$$
- Self-Attention:向量之间的唯一交互
- MLP:独立作用于每个向量(通常 D → 4D → D)
- 残差连接 + LayerNorm:稳定训练
Transformer = 大量相同 Transformer Block 的堆叠。自 2017 年以来架构几乎没有变化——只是变得更大。
3.2 三种序列处理方式对比
| 方法 | 优点 | 缺点 |
|---|---|---|
| RNN | O(N) 计算和内存;理论擅长长序列 | 不可并行化;实践中难以保留长程信息 |
| 卷积 | 可并行化 | 需堆很多层才能建立大感受野 |
| Self-Attention | 每个输出直接依赖所有输入;高度并行 | O(N2) 计算,O(N) 内存 |
📜 “Attention is All You Need” (Vaswani et al., NeurIPS 2017)
$\large\star$ 四、总结
| 概念 | 核心要点 |
|---|---|
| Attention | 操作在向量集合上的新算子;消除 Encoder-Decoder 瓶颈 |
| Scaled Dot-Product | 除以 $\sqrt{D}$ 防止 Softmax 饱和 |
| Q/K/V | Query 查询 Key → 产生注意力权重 → 加权求和 Value |
| Self-Attention | Q、K、V 来自同一输入;排列等变;O(N2) |
| Multihead | H 个并行的 Self-Attention,每个关注不同方面 |
| Transformer Block | Self-Attention + MLP + 残差 + LayerNorm |
| Position Encoding | 弥补 Self-Attention 对顺序的无感知 |
