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 步骤

每一步解码时:

  1. 计算对齐分数:et, i = fatt(st − 1, hi)(用小网络或线性层)
  2. Softmax 归一化:$a_{t,i} = \frac{\exp(e_{t,i})}{\sum_j \exp(e_{t,j})}$(注意力权重,和为1)
  3. 加权求和:ct = ∑iat, ihi(上下文向量)
  4. 输入解码器: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 对顺序的无感知

下一讲:CS231n(玖)——检测分割与可视化