第 6 步 · 让模型学会「看哪里」
注意力机制 · AttentionAttention Mechanism
不再把整句压成一个向量,而是让每个词按需关注最相关的上下文。
12 分钟
阅读 + 实操
1 个
交互演示
高级
难度
注意力机制 · 交互演示
注意力头8
序列长16
上下文加权求和
① 注意力权重热力图(行 = Query 我在找什么 · 列 = Key 我被谁关注 · 颜色越深权重越高)— 点击格子或词标签切换 Query
② 两步走:原始打分 s = Q·Kᵀ ÷ √d(左,不受 τ 影响)→ softmax(s ÷ τ) 归一化(右,每行和为 1)
③ 输出怎么来:输出 = Σ(权重 × Value)— 先看权重,再逐项相乘、逐列相加(当前 Query 行)
为什么学这步?
注意力是现代 NLP/CV 的通用算子。它解决了 RNN 的长程依赖瓶颈,也是 Transformer 的核心。
📌 发生了什么
- Q-K 相似度得注意力权重
- 对 V 加权求和得上下文
- 多头并行捕捉多样关系
⚠️ 常见陷阱
- 序列过长计算量平方增长
- 需缩放点积防梯度爆炸
- 位置信息需额外注入
✅ 本章小结
- 注意力 = 按需加权平均
- 可并行、易捕捉长程
- 是 Transformer 基石
📐 缩放点积注意力
注意力让模型在每个位置动态决定"看哪里":用 Query 与所有 Key 的相似度对 Value 加权求和。
计算 Query Q 与 Keys K 的点积相似度,并用 √d_k 缩放,防止内积过大导致 softmax 饱和。
对相似度做 softmax 得到注意力权重(每行和为 1),再对 Value V 加权求和,得到每个位置的上下文向量。
缩放因子 √d_k 至关重要:随着 d_k 增大,点积方差随之增大,会把 softmax 推入饱和的低梯度区;除以 √d_k 让方差保持在 1。
🎛 注意力头数对比
多头注意力将 Q/K/V 拆成若干组并行,再拼接,让模型在不同子空间关注不同模式。
| 头数 | 表现 | 结果 |
|---|---|---|
| 1 | 单一注意力模式 | 表达力有限 |
| 8 | 多种模式并行 | 推荐 |
| 16 | 更细的子空间 | 强但参数更多 |
💡 头数越多表达力越强,但参数和计算量也成正比增长;8 是常用值,高维度可用更多头。
💻 单头注意力
缩放点积注意力的 Python 实现:
# 缩放点积注意力(单头)
def attention(Q, K, V, d_k):
# 1. 打分:Q 与 K 的点积,除以 √d_k 缩放
scores = Q @ K.T # [seq_q, seq_k]
scaled = scores / np.sqrt(d_k) # 防 softmax 饱和
# 2. softmax 归一化得到注意力权重(每行和为 1)
weights = softmax(scaled) # [seq_q, seq_k]
# 3. 对 V 加权求和,得到上下文向量
output = weights @ V # [seq_q, d_k]
return output
# 多头:将 Q/K/V 拆成 h 组并行做 attention,再拼接后投影
📚 参考文献与延伸阅读
- Bahdanau, Cho & Bengio (2014), Neural Machine Translation by Jointly Learning to Align and Translate, ICLR — 注意力机制的诞生
- Vaswani et al. (2017), Attention Is All You Need, NeurIPS — 缩放点积与多头注意力
- Goodfellow, Bengio & Courville, Deep Learning (2016), §12.4 Attention
- arXiv:1706.03762 — Attention Is All You Need — Transformer 论文
📝 课后练习
检验你的理解——答对为止