用例子和自题解释 Transformer 如何使用 attention 学习文档
Transformer 中的注意力机制:用例子和自测读懂 Self-Attention 一句话先记住 Self-Attention 让句子里的每个词,都能一次性"看到"所有其他词,并按相关程度重新组合自己的含义。 据《Attention Is All You Need》(2017 年 6 月,Google 在 arX…
Transformer 中的注意力机制:用例子和自测读懂 Self-Attention
一句话先记住
Self-Attention 让句子里的每个词,都能一次性"看到"所有其他词,并按相关程度重新组合自己的含义。 据《Attention Is All You Need》(2017 年 6 月,Google 在 arXiv 发布)一文介绍,Transformer 用纯 Attention 结构替代了传统的 CNN/RNN 序列建模方式,做到并行训练与远距离依赖建模兼顾(来源线索,未读原文,仅作背景参考)。
---
为什么需要 Attention
1.1 一个直觉问题
当人听到"小明今天没来学校,因为他生病了",听到"他"时会立刻回看"小明"。这种"指代消解"靠的不是从头复读,而是 按需拉远注意力 。
《【每日一技】Transformer》一文把这种能力描述为:每个词都可以主动去"看"句子里最相关的其他词,不再像旧模型那样逐字阅读,而是像一个聪明的读者——哪儿重要,就把注意力放到哪儿。
1.2 传统方法的两个痛点
方法 主要问题
--- ---
RNN / LSTM 序列必须按时间步串行计算,远距离信息需要经过多步累积才能相连,距离越远信号越弱
CNN 局部窗口建模,要堆叠多层才能覆盖远距离,并行效率虽好但感受野受限
Self-Attention 的解法是: 让任意两个词之间的依赖距离都"≈1" ——不管它们在句子中隔多远,都通过一次运算直接相连。摘要线索(来自《【经典精读】万字长文解读 Transformer》一文摘要,未读原文)也提到 Transformer 的核心思想是让同一序列不同位置之间"distance 1 的平行关系",但具体表述以原论文为准。
---
三件套:Query、Key、Value
注意力机制用一个"查字典"的比喻就能讲清。《【每日一技】Transformer》一文把每个词的三个角色写得很直白:
角色 它在"问"什么 类比
--- --- ---
Query (Q) 我现在想知道什么? 检索时输入的关键词
Key (K) 我有什么特征供别人匹配? 字典/索引里的标题
Value (V) 如果别人选了我,能从我这里拿到什么内容? 索引对应正文里的实际信息
2.1 走一遍计算流程(以"今天 下雨, 我 没 带 伞"为例)
假设我们要算"没"这个词的新表示。直觉上它最关心"下雨"和"伞"。算法要做这四步:
准备 Q/K/V :把每个词的 embedding 乘以三个可学习矩阵,得到 Q、K、V 三个向量。
算相似度 :用"没"的 Q 去点乘(dot product)所有词(包括自己)的 K,得到一组分数。
分数高 ≈ "没"想问的问题正好和这个词的特征匹配。
归一化 :分数除以 $\sqrt{d k}$(向量维度的平方根,防止分数过大让 softmax 饱和),再过 softmax,让所有分数变成"和为 1 的权重"。
加权求和 :用这些权重对所有词的 V 做加权平均,得到"没"的新表示。
写成公式就是论文里那个经典版本:
公式与 Q/K/V 缩放点积的描述在《【每日一技】Transformer》《Transformer模型详解》《【经典精读】万字长文解读 Transformer 模型和 Attention 机制》等资料摘要中均被反复提及;其中只有《【每日一技】Transformer》一文为可读正文,其余两份为"未读原文"标记,仅作线索,最终应以原论文《Attention Is All You Need》为准。
2.2 一个具体的数值小例子
句子:[今天, 下雨, 我, 没, 带, 伞] 算"没"对其他词的注意力权重(示意数值):
词 QKᵀ / √dₖ softmax 之后
--- --- ---
今天 0.2 0.06
下雨 2.5 0.42
我 0.8 0.11
没 0.3 0.07
带 0.4 0.07
伞 2.0 0.27
加和 1,最高的两个权重落在"下雨 (0.42)"和"伞 (0.27)"上。这与《【每日一技】Transformer》文中描述的"自动把'下雨'与'没带伞'关联起来"的效果一致。
数字仅为示意;真实数值由训练得到的 WQ/WK/WV 矩阵决定。
---
Multi-Head Attention:多视角同时看
一个 head 只学一种"关注方式"可能不够。Multi-Head Attention 的做法是:
把 Q/K/V 各自切成 $h$ 份(head),每份独立做一次 scaled dot-product attention;
把 $h$ 个输出拼起来,再乘一个输出矩阵 $W O$ 还原维度。
《【每日一技】Transformer》一文给出了一个直观的说法: "有人关注主语,有人关注时态,有人关注指代关系" ——这正是多头想达到的效果。
一个常见误解 :多头不是把头数变多就更"强",而是把不同子空间学到的关系同时利用起来。计算量大致是单头的 $h$ 倍(拼接再投影开销可控)。
---
在 Transformer 中,Attention 出现在哪里
下表整理了 Transformer 三大使用 Attention 的位置,并标注资料包中已读 / 仅有线索的支持情况。
位置 Q 来自 K, V 来自 用途
--- --- --- ---
Encoder Self-Attention 当前层 encoder 输入 同序列其他位置 让每个词看到整个句子的上下文
Decoder Masked Self-Attention 当前层 decoder 输入 同序列已生成部分 训练时用 mask 防止看到"未来"
Encoder-Decoder Cross-Attention decoder 当前状态 encoder 输出 让译文词对齐到源语言词
来源说明 :以上三处结构是公开论文的通用描述。资料包中《Transformer模型详解》《【经典精读】万字长文解读 Transformer 模型和 Attention 机制》两份摘要均提及 encoder/decoder attention 的总体架构,但未读取原文;部分细节(如下三角 mask 的具体实现方式、是否在每一层都做 cross-attention)建议回到原论文《Attention Is All You Need》核实。
---
三个常见误区,先避坑
"Self-Attention 就是注意力机制" Self-Attention 是一种特殊形式——Q/K/V 都来自同一序列。Attention 还包括 encoder-decoder 等其他形式(据《Transformer模型详解》摘要描述:"Self Attention……是 Source 内部元素之间或者 Target 内部元素之间发生的 Attention 机制",未读原文)。
"Attention 越多越能解决长文本" 自注意力的时间和空间复杂度是 $O(N^2)$,序列变长时显存和算力增长很快。摘要线索(来自《2021-Swin Transformer Attention 机制的详细推导》,未读原文)提到 Swin Transformer 通过窗口 Attention 把复杂度从 $O(N^2)$ 降到 $O(N)$,但具体机制与数据以原文为准。
"Attention 权重高 因果关系" Attention 只是相关性打分,并不天然表示因果。一个词被高度关注,可能只是模型学到了某种共现模式,而非真正的因果证据(此为对注意力机制作用的常识性辨析,资料包未直接论述,标注待核验)。
---
自测题:5 题检验掌握程度
建议先在纸上写下答案,再回看正文对照。
Q1(概念辨析) Self-Attention 和传统 RNN 的"序列建模"在依赖距离上有什么本质区别?请用一两句话回答。
Q2(公式复述) 写出 Scaled Dot-Product Attention 的公式,并解释分母 $\sqrt{d k}$ 的作用。
Q3(手算) 假设某 head 中"伞"对其他词的 QKᵀ / √dₖ 分数为 [0.1, 0.3, 0.2, 0.5, 0.1, 1.2](对应"今天、下雨、我、没、带、伞"),请估算 softmax 后分配到"下雨"和"没"两个词的权重(保留两位小数即可,过程可以近似)。
提示:先做 exp(.),再做归一化。
Q4(结构理解) Encoder-Decoder Cross-Attention 中,Q 来自哪里、K 与 V 又来自哪里?它的作用是什么?
Q5(场景迁移) 如果让你把 Self-Attention 用到"商品评论情感分类"上,输入序列是 100 个 token 的评论,输出一个二分类标签。请问:
应该只用 Encoder 的 Self-Attention,还是必须用 Decoder?
分类标签向量通常从哪里"读出"?
自测题参考答案(先做题再看)
点开查看参考答案
A1 :RNN 中两个位置的信息传递要走 $N$ 步,依赖距离随序列长度增长;Self-Attention 中任意两个位置只需一次点积,距离都被压成 1。
A2 :$\text{Attention}(Q,K,V) \text{softmax}\!\left(\frac{QK^{\top}}{\sqrt{d k}}\right)V$;$\sqrt{d k}$ 用于把点积的方差稳定在 1 附近,避免 softmax 进入饱和区、梯度消失。
A3 :exp 后 ≈ [1.11, 1.35, 1.22, 1.65, 1.11, 3.32],总和 ≈ 9.76;"下雨"权重 ≈ 1.35/9.76 ≈ 0.14;"没"权重 ≈ 1.65/9.76 ≈ 0.17。两个都明显高于"今天""带"等位置,符合"伞"应该最关注与下雨/没带相关内容的直觉。