用例子和自题解释 Transformer 如何使用 attention 学习文档
用例子和自测题理解 Transformer 中的注意力机制 这份笔记面向"已经听过 Transformer 但讲不清楚 attention 在干什么"的读者。目标是看完之后,能用自己的话讲清楚:Q/K/V 是什么、注意力分数怎么算、self-attention 和 masked attention 差别在哪,并能用一…
用例子和自测题理解 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 的每个位置,都用三个 可学习的线性层 把它映射成三个向量:
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 算相似度,常见做法是缩放点积:
除以 sqrt(d k) 是为了避免点积值太大导致 softmax 进入饱和区(梯度消失)。
第 2 步:归一化 。把第 i 行所有 score 一起送进 softmax,得到权重 α {ij},满足 Σ j α {ij} 1。
第 3 步:加权求和 。第 i 个位置的新表示 Σ j α {ij} · V j。
整个过程用矩阵表达就是大名鼎鼎的公式:
一个手算小例子
假设 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,最后拼起来再过一次线性层:
直觉上:一个头可能在抓主谓一致,另一个头在抓指代关系,还有一个头在看相邻搭配。不同头分工,合起来表征更丰富。
据《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 表示"遮住"):
把 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,为什么?
题 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都能