Attention
注意力机制让模型学会"有选择地关注"——翻译一句话时,不需要死记整段,只需看最相关的词
✦ 先看效果:词与词之间的注意力权重
点击「生成热图」,观察句子中每个词对其他词的关注程度。颜色越深表示注意力权重越高。
01 大白话讲 Attention
图书馆找书的类比
想象你去图书馆查资料,过程是这样的:
你脑子里有个问题,比如"这个词和哪些词有关联?"。这就是 Query。
图书馆里每本书都有标题和分类标签。你把自己的问题跟每本书的标签对比,越像的书越可能是你要找的。
找到相关的书之后,你按相关程度加权阅读它们的内容,最终得到答案。这就是 Value。
Attention 解决了什么问题?
在 Attention 之前,RNN 翻译一句话时要把整句话"压缩"成一个固定向量再解码——句子越长,信息丢失越多。
Attention 的思路是:翻译每个词时,直接回头看原句,按相关程度加权取用。翻译"苹果"就多看"apple",不需要死记全句。
自注意力(Self-Attention)
Attention 最强大的变体是对句子自身做注意力——每个词同时扮演 Q、K、V 三个角色:
用 Q·Kᵀ 算每对词之间的匹配分数,再除以 √d 防止数值过大
把分数变成概率分布(每行之和 = 1),就是注意力权重
用权重对 V(各词的内容向量)加权求和,得到"融合了上下文的新表示"
Attention 能做什么?
翻译每个词时回头看源句中最相关的词(原始用途)
"苹果很好吃"和"苹果发布新品"——靠上下文 Attention 区分含义
句子开头的主语可以直接 attend 到句子末尾的谓语,不受距离限制
GPT、BERT 等大语言模型全部建立在自注意力之上
一步步构建 Attention
从词嵌入到注意力权重,逐步搭建。
3 个词,每个词用 4 维向量表示,这是 Attention 的原始输入。
用三个可学习矩阵把输入投影为查询(Q)、键(K)、值(V)。
softmax(Q·Kᵀ / √d_k) · V,输出每个词对其他词的关注度。
02 代码
03 学术性讲解
Attention(注意力机制)让模型在处理每个位置时,能够动态地聚合序列中所有位置的信息,权重由内容相似度决定,而非固定的局部窗口。
Scaled Dot-Product Attention
标准注意力机制通过 Query、Key、Value 三组向量计算:
矩阵乘法一次性算出所有 Q-K 对的点积,复杂度 O(n²d),n 为序列长度
点积随维度 d 增大而方差增大,导致 Softmax 进入饱和区梯度消失。除以 √dₖ 将方差稳定在 1 附近
Softmax 归一化权重后对 V 做加权求和,输出是序列中所有位置信息的动态混合
为什么需要 Q/K/V 三个矩阵?
直接用词向量本身计算相似度也行,但三套独立的投影矩阵(W_Q、W_K、W_V)让"如何查询"和"携带什么信息"解耦,大幅提升表达能力。这三套矩阵是训练中学到的。
计算复杂度
O(n²d),n 是序列长度,d 是维度——长序列计算量大
O(n²) 存储注意力矩阵——这是长上下文的主要瓶颈
矩阵乘法高度可并行,GPU 上远比 RNN 的逐步计算快
任意两个位置距离为 1 跳,彻底解决 RNN 的长距离梯度消失
总结
当前词"想查什么"
各词"能匹配什么"
各词"实际携带的信息"
Q·K 相似度经 Softmax 归一