---
title: "用例子和自题解释 Transformer 如何使用 attention 学习文档"
description: "用例子和自测题理解 Transformer 中的注意力机制 这份笔记面向\"已经听过 Transformer 但讲不清楚 attention 在干什么\"的读者。目标是看完之后,能用自己的话讲清楚:Q/K/V 是什么、注意力分数怎么算、self-attention 和 masked attention 差别在哪,并能用一…"
canonical_url: "https://threadlab.pages.dev/d/5L6ekynGFHWyhl"
published_at: "2026-07-03T07:45:50.211Z"
updated_at: "2026-07-03T07:41:30.676Z"
word_count: 3090
source: "ALab public document"
---

# 用例子和自测题理解 Transformer 中的注意力机制

> 这份笔记面向"已经听过 Transformer 但讲不清楚 attention 在干什么"的读者。目标是看完之后,能用自己的话讲清楚:Q/K/V 是什么、注意力分数怎么算、self-attention 和 masked attention 差别在哪,并能用一个小例子手算一遍。

## 一句话先给结论

Attention 的本质是**让序列中的每个位置都能"按需"从其他位置拿信息**:对当前位置生成一个"问题"(Query),跟所有位置"招牌"(Key)对比相似度,再按相似度从对应"内容"(Value)里加权取回。这就是 Transformer 摆脱 RNN 顺序依赖、能并行处理长序列的根本原因。

据《【每日一技】:Transformer》一文介绍,Transformer 的核心思路是"每个词都可以主动去'看'句子里最相关的其他词";Query/Key/Value 三元组的分工是这套机制的基础。

## 第一性原理:Q/K/V 到底是什么

用一个图书馆的比喻来建立直觉:

- **Query(查询)**:你当前想查的主题,比如"找讲 2017 年的书"。
- **Key(键)**:每本书的索引标签,用来跟你的查询比匹配度。
- **Value(值)**:书里实际的内容。

Transformer 里,对输入序列 X 的每个位置,都用三个**可学习的线性层**把它映射成三个向量:

```
Q = X · W_Q
K = X · W_K
V = X · W_V

```

W_Q/W_K/W_V 是模型在训练中学习到的"提问方式、招牌写法、内容抽取方式"。

据《transformer中的Q,K,V到底是什么?》(知乎,未读原文,摘要线索):在 Encoder 端,Q/K/V 都来自同一段输入,执行的是 self-attention;在 Decoder 端,Q/K/V 都来自目标语言 embedding,执行的是 masked self-attention;另在 Encoder-Decoder 交界处,典型设置是 Q 来自 Decoder、K/V 来自 Encoder 输出(即 cross-attention)。该说法以英→德机器翻译为例,具体出处与图示细节待核验。

## 注意力分数怎么算:用一张表走一遍

输入句子:"The cat sat on the mat",我们想知道第 2 个词 **cat** 在看其他词时的注意力分布。

**第 1 步:打分**。对每对位置 (i, j),用 Q_i 和 K_j 算相似度,常见做法是缩放点积:

```
score(i, j) = (Q_i · K_j) / sqrt(d_k)

```

除以 sqrt(d_k) 是为了避免点积值太大导致 softmax 进入饱和区(梯度消失)。

**第 2 步:归一化**。把第 i 行所有 score 一起送进 softmax,得到权重 α_{ij},满足 Σ_j α_{ij} = 1。

**第 3 步:加权求和**。第 i 个位置的新表示 = Σ_j α_{ij} · V_j。

整个过程用矩阵表达就是大名鼎鼎的公式:

```
Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) · V

```

### 一个手算小例子

假设 d_k = 4,cat 的 Query 向量 q = [1, 0, 1, 0],三个 Key(简化版):

- The: k1 = [1, 1, 0, 0]
- cat: k2 = [1, 0, 1, 0] ← 自身
- sat: k3 = [0, 1, 1, 0]

点积:

- q·k1 = 1
- q·k2 = 2
- q·k3 = 1

除以 sqrt(4)=2 后 softmax,得到大致权重 [0.27, 0.46, 0.27]。注意 q·k2 最大,**cat 最关注的是自己**——这其实是自注意力的常见现象,主语往往自身信息最稠密。

## 多头注意力:为什么不是一个头

单头注意力只能学**一种**"该看哪里"的模式。多头机制把 Q/K/V 拆成 h 组,每组独立算一次 attention,最后拼起来再过一次线性层:

```
MultiHead(Q, K, V) = Concat(head_1, ..., head_h) · W_O

```

直觉上:一个头可能在抓主谓一致,另一个头在抓指代关系,还有一个头在看相邻搭配。不同头分工,合起来表征更丰富。

据《nlp中的Attention注意力机制Transformer详解》(知乎 JayJay,未读原文,摘要线索)目录,multi-head self-attention 的具体计算流程是其讲解重点之一;本笔记未读取原文细节,具体多头切分维度以 Vaswani 等人的原论文及代码实现为准。

## Self-Attention vs Masked Attention:一个能"往前看",一个只能"回头看"

这是理解 Encoder-Decoder 差别的关键。

- **Self-Attention(自注意力)**:Q/K/V 同源,位置 i 可以看到所有位置。常用于 Encoder,也用于 BERT 这种"双向"理解模型。
- **Masked Self-Attention(因果/掩码注意力)**:在算第 i 个位置的输出时,**人为把 i 之后的位置遮住**,只让它看 ≤ i 的位置。常用于 Decoder 和 GPT 这类自回归生成模型。

为什么生成时要遮住?因为训练时如果让模型"偷看"未来 token,它就只是学会了抄答案,而不是学会预测下一步。

据《Transformer自回归关键技术:掩码注意力原理与PyTorch完整实现》(deephub,2025-09-25)可读正文:掩码注意力"人为地阻断了对未来 tokens 的访问",与自回归生成的因果约束直接对应。该文给出的 PyTorch 实现中,用 `torch.triu(torch.ones(context_length, context_length), diagonal=1)` 生成上三角掩码矩阵,并通过 `register_buffer` 注册到模块,使其随模型在 CPU/GPU 间移动但不作为可训练参数参与梯度更新。

### 掩码的最简示意

对长度 4 的序列,掩码矩阵 M(1 表示"遮住"):

```
[0 1 1 1]
[0 0 1 1]
[0 0 0 1]
[0 0 0 0]

```

把 score 加上一个很大的负数(如 -1e9)再 softmax,被遮住的位置权重自然趋近 0。

## 常见误区

- **"注意力权重越大,这两个词关系越强"** —— 不一定。注意力分布还受 Query 内容、训练目标影响,有时模型会用大权重去看一个语义上无关但辅助预测的 token。
- **"Self-attention 完全没有顺序信息"** —— 错。模型本身不知道"猫"在第几位,所以 Transformer 必须额外加 **位置编码(positional encoding)** 把位置信息塞进去,通常是正弦/余弦或可学习向量。
- **"Masked attention 只是把分数置 0"** —— 应该是置一个很大的**负数**后再 softmax,这样数值才稳定;直接置 0 后 softmax 仍会重新归一化。

## 自测题(做一遍就记住)

**题 1(基础):** Q/K/V 三个矩阵在 self-attention 和 cross-attention 里分别来自哪里?

**题 2(计算):** d_k = 8,某行缩放前的分数向量是 [2, 4, 2]。除以 sqrt(8)≈2.83 后 softmax,大致权重是多少?(提示:答案应该接近 [0.09, 0.82, 0.09])

**题 3(判断):** 训练一个生成式语言模型时,如果忘了加 causal mask,会出现什么现象?

**题 4(代码阅读):** 看下面这段,判断它属于 self-attention 还是 masked attention,为什么?

```python
scores = Q @ K.transpose(-2, -1) / sqrt(d_k)
mask = torch.triu(torch.ones(L, L), diagonal=1).bool()
scores = scores.masked_fill(mask, -1e9)
weights = softmax(scores, dim=-1)
out = weights @ V

```

**题 5(应用):** 在英译中任务里,Decoder 第 3 个位置正在生成第二个中文词,它的 Q 来自哪里?K 和 V 来自哪里?这时注意力矩阵的形状是什么?

### 参考答案

- **题 1:** Self-attention 三者同源(同一段输入);cross-attention 中 Q 来自 Decoder 当前状态,K/V 来自 Encoder 输出。
- **题 2:** [2, 4, 2] / 2.83 ≈ [0.71, 1.41, 0.71],softmax 后中间项占主导,接近 [0.09, 0.82, 0.09]。
- **题 3:** 模型会在训练时"偷看"未来 token,把目标序列当输入直接复现,推理时一旦没有未来可看,生成质量会急剧下降。
- **题 4:** 是 **masked(self-)attention**。`torch.triu(..., diagonal=1)` 构造的是上三角掩码,`masked_fill` 把"未来位置"分数替换为 -1e9,softmax 后权重≈0,保证每个位置只能看到自己和之前的 token。
- **题 5:** Q 来自 Decoder 已生成部分(中文 embedding),K/V 来自 Encoder 编码后的英文表示。注意力矩阵形状是 [batch, num_heads, tgt_len, src_len],即"目标位置 × 源位置"。

## 一页纸回顾

- Attention = "提问(Q) → 比对招牌(K) → 取内容(V)"。
- 公式: `softmax(QK^T / sqrt(d_k)) V`。
- 多头 = 多种关注模式并行。
- Masked = 把未来位置分数填成大负数,实现因果。
- 没有位置编码,Transformer 不知道词序。

## 进一步阅读

- 《Attention Is All You Need》原论文(Vaswani et al., 2017):多头、缩放点积、位置编码的权威定义。
- 《Transformer自回归关键技术:掩码注意力原理与PyTorch完整实现》(deephub, 2025-09-25):含可直接运行的 PyTorch 因果注意力实现。
- 《nlp中的Attention注意力机制Transformer详解》(知乎 JayJay):QA 形式覆盖 attention 分类与变种(本次未读取原文,仅作为目录线索)。
- 《transformer中的Q,K,V到底是什么?》(知乎, 2023):用机器翻译例子解释不同位置 Q/K/V 的来源(本次未读取原文,仅作为线索)。

## 不确定点与待核验问题

以下说法在资料包中没有完整原文支持,或证据强度较弱,后续需补充原文核验:

- **Decoder 内部 cross-attention 中 Q/K/V 的精确来源**:初稿中关于"Decoder Q 来自目标语言、K/V 来自 Encoder 输出"的描述,主要依据《transformer中的Q,K,V到底是什么?》的摘要线索;摘要原文将英→德翻译中的 decoder 端描述为 Q/K/V 都来自德文 embedding(即 masked self-attention),并未直接描述 Encoder-Decoder 交界处的 cross-attention 设置。因此 cross-attention 的 Q/K/V 来源属于对原 Transformer 架构的通识推断,**待核验**:建议直接核对该知乎原文全文,或参考 Vaswani et al. 2017 论文图 1 与 3.2.3 节。
- **多头切分维度("一个头抓主谓一致、另一个抓指代")**:这是常见的教学类比,资料包未提供原文支持;该说法属于推断,**待核验**:可参考 JayJay 知乎文章全文,或论文附录中的可视化分析。
- **"注意力权重越大关系越强"作为误区**:这是编者整合的常见说法,资料包未直接给出该表述;**待核验**:可参考 BERT/attention 可解释性相关综述。
- **自测题题 5 中注意力矩阵形状 [batch, num_heads, tgt_len, src_len]**:这是现代 HF Transformers / PyTorch 实现的常见张量布局,资料包未直接说明;**待核验**:以代码实现为准。
- **资料 3、6、7(Roblox 脚本执行器与动画资源)** 与本主题无关,已在素材中剔除。

## 资料包证据链

- devforum.roblox.com｜Script Executor - Simple Script Execution - Roblox：Script Executor - Simple Script Execution - Community Resources - Developer Forum | Roblox Developer Forum | Roblox Script Executor - Simple Script Execution Resources Community Resources studio , scripting , plugin , lu
- MiniMax Search｜Transformer自回归关键技术:掩码注意力原理与PyTorch完整实现：搜索资讯页 --> Transformer自回归关键技术：掩码注意力原理与PyTorch完整实现 deephub 2025-09-25 掩码注意力（Causal Attention）是生成式模型的核心技术，它传统自注意力机制有根本的不同，掩码注意力限制模型只能关注当前位置之前的tokens，确保了自回归生成的因果性。 自注意力的掩码 自注意力机制在Transformer编码器和BERT等模型中广泛应用。这种机制的特点是每个token都能
- MiniMax Search｜nlp中的Attention注意力机制Transformer详解 - 知乎：未读取原文，仅来自搜索或 RSS 摘要：JayJay有自己的公众号啦,以后文章都在那里哦,欢迎关注《高能AI》公众号 本文以QA形式对自然语言处理中注意力机制(Attention)进行总结,并对Transformer进行深入解析。 目录 一、Attention机制剖析 1、为什么要引入Attention机制? 2、Attention机制有哪些?(怎么分类?) 3、Attention机制的计算流程是怎样的? 4、Attention机制的变
- MiniMax Search｜transformer中的Q,K,V到底是什么?_知乎：未读取原文，仅来自搜索或 RSS 摘要：1. 机器翻译 transformer刚被提出的时候就是被用于处理机器翻译的｡在transformer架构中的不同位置Q,K,V指代的变量是不一样的｡ 假设现在处理的是英文->德文的翻译任务｡ 在encoder的输入端, QKV都是指代英文的embedding ,这里执行的是self-attention｡ 在decoder的输入端, QKV都是指代德文的embedding ,这里执行的是maske
- MiniMax Search｜【每日一技】:Transformer：
Transformer 的思路就跟人一样:
**每个词都可以主动去“看”句子里最相关的其他词**,这种机制叫**注意力机制(Attention)**｡
它不再像旧时代的模型一样逐字阅读,而是像一个聪明的读者——哪儿重要,就把注意力放到哪儿｡”
Transformer 会自动把“下雨”与“没带伞”关联起来,而不是只看字面｡
T 参考来源：[devforum.roblox.com](https://devforum.roblox.com/t/script-executor-simple-script-execution/3141932)、[zhuanlan.zhihu.com](https://zhuanlan.zhihu.com/p/53682800)、[zhihu.com](https://www.zhihu.com/question/427629601)（共 7 个）
