先看效果:词与词之间的注意力权重

点击「生成热图」,观察句子中每个词对其他词的关注程度。颜色越深表示注意力权重越高。

每次生成随机的注意力权重,模拟不同语境下词的关注分布

01 大白话讲 Attention

图书馆找书的类比

想象你去图书馆查资料,过程是这样的:

Q
Query(查询)——你想找什么

你脑子里有个问题,比如"这个词和哪些词有关联?"。这就是 Query。

K
Key(索引)——书的标题/标签

图书馆里每本书都有标题和分类标签。你把自己的问题跟每本书的标签对比,越像的书越可能是你要找的。

V
Value(内容)——书的实际内容

找到相关的书之后,你按相关程度加权阅读它们的内容,最终得到答案。这就是 Value。

Attention 解决了什么问题?

在 Attention 之前,RNN 翻译一句话时要把整句话"压缩"成一个固定向量再解码——句子越长,信息丢失越多。

Attention 的思路是:翻译每个词时,直接回头看原句,按相关程度加权取用。翻译"苹果"就多看"apple",不需要死记全句。

自注意力(Self-Attention)

Attention 最强大的变体是对句子自身做注意力——每个词同时扮演 Q、K、V 三个角色:

1
计算词与词的相似度

用 Q·Kᵀ 算每对词之间的匹配分数,再除以 √d 防止数值过大

2
Softmax 归一化

把分数变成概率分布(每行之和 = 1),就是注意力权重

3
加权求和

用权重对 V(各词的内容向量)加权求和,得到"融合了上下文的新表示"

Attention 能做什么?

机器翻译

翻译每个词时回头看源句中最相关的词(原始用途)

消歧

"苹果很好吃"和"苹果发布新品"——靠上下文 Attention 区分含义

长距离依赖

句子开头的主语可以直接 attend 到句子末尾的谓语,不受距离限制

Transformer 基础

GPT、BERT 等大语言模型全部建立在自注意力之上

一步步构建 Attention

从词嵌入到注意力权重,逐步搭建。

第一步 输入:词嵌入矩阵

3 个词,每个词用 4 维向量表示,这是 Attention 的原始输入。

第二步 线性投影:生成 Q、K、V

用三个可学习矩阵把输入投影为查询(Q)、键(K)、值(V)。

第三步 缩放点积注意力

softmax(Q·Kᵀ / √d_k) · V,输出每个词对其他词的关注度。

02 代码

03 学术性讲解

Attention(注意力机制)让模型在处理每个位置时,能够动态地聚合序列中所有位置的信息,权重由内容相似度决定,而非固定的局部窗口。

Scaled Dot-Product Attention

标准注意力机制通过 Query、Key、Value 三组向量计算:

Q K V QKᵀ / √dₖ Softmax × V 输出 Attention(Q,K,V) = Softmax(QKᵀ / √dₖ) · V
1
相似度计算:QKᵀ

矩阵乘法一次性算出所有 Q-K 对的点积,复杂度 O(n²d),n 为序列长度

2
缩放:除以 √dₖ

点积随维度 d 增大而方差增大,导致 Softmax 进入饱和区梯度消失。除以 √dₖ 将方差稳定在 1 附近

3
加权聚合:Softmax × V

Softmax 归一化权重后对 V 做加权求和,输出是序列中所有位置信息的动态混合

为什么需要 Q/K/V 三个矩阵?

直接用词向量本身计算相似度也行,但三套独立的投影矩阵(W_Q、W_K、W_V)让"如何查询"和"携带什么信息"解耦,大幅提升表达能力。这三套矩阵是训练中学到的。

计算复杂度

时间复杂度

O(n²d),n 是序列长度,d 是维度——长序列计算量大

空间复杂度

O(n²) 存储注意力矩阵——这是长上下文的主要瓶颈

并行度

矩阵乘法高度可并行,GPU 上远比 RNN 的逐步计算快

感受野

任意两个位置距离为 1 跳,彻底解决 RNN 的长距离梯度消失

总结

Query

当前词"想查什么"

Key

各词"能匹配什么"

Value

各词"实际携带的信息"

权重

Q·K 相似度经 Softmax 归一