注意力的直觉

同一个词在不同句子里该有不同向量,让它关注周围的词,意思就清楚了。

知识课 · 约 25 分钟 · 更新于 2026-08-14

一个词,只有一个向量

在「词向量的性质与局限」中我们看到:word2vec 这类 静态词向量 , 每个词永远只对应同一个固定向量,一词多义在它面前无能为力。

两个「苹果」意思完全不同,向量却一模一样。我们真正想要的是 上下文相关 的表示:同一个词出现在不同句子里, 应当得到 不同的向量 。

这节课,我们就从零开始,亲手把实现它的核心机制「发明」出来。

朴素的想法:把上下文「混」进来

一个词在句子里的具体含义,是由它周围的词决定的。「苹果」和「手机」同现, 它就偏向公司;和「香蕉」同现,它就偏向水果。

那能不能直接让「苹果」的新向量去 吸收 周围词的信息? 最简单的做法:把句子里 所有词的向量做加权平均 ,作为「苹果」的新向量, 在第一句里多混入一点「手机」的成分,在第二句里多混入一点「香蕉」的成分。

其中 是一组 权重 ,加起来等于 1。权重分给谁多,新向量就更「像」谁。这样一来,同一个「苹果」, 在不同句子里混合出的新向量自然就不同了。

我们先抛开具体数字,用 颜色 直观演示这个过程。下面把每个词都画成一种固定的颜色, 拖动各词下方的滑块改变它的权重(拖动一个,其余会自动调整,让四个权重始终加起来等于 1)。上方「苹果的新向量」大色块,就是四个词的颜色 按当前权重混合 出来的结果, 权重给谁多,它就越接近谁的颜色。左右两块分别是两个句子,初始权重就是注意力替「苹果」算出的那一组, 你可以看到:同样是「苹果」,两句混出的颜色明显不同。

权重从哪来:用点积打分

权重不能随便给。直觉上, 与当前词越相关的词,权重应该越大 , 「苹果」该更依赖「手机」还是「发布」,取决于哪个词和它更相关。

怎么量化「相关」?在「从编号到向量」中我们学过用 余弦相似度 衡量两个向量有多像, 把它们的 点积 除以各自的模长,方向越一致,结果越接近 1、越「相似」。 这里我们干脆直接用 点积 本身(省去除以模长那一步),作为当前词与句中每个词的 相关度分数 :

为什么敢省掉除以模长这一步?因为接下来的三步流程只用分数的 相对大小 来分配权重,谁的分数高、谁分到的权重就大,用最朴素的点积把骨架搭起来,已经够用了。

分数有了,但它们还不是权重:可能有正有负、加起来也不等于 1。还差一步 归一化 。 这正好是 softmax 的用途,在「Softmax 回归」中我们用它把一组分数变成「和为 1 的概率分布」,这里直接拿来用:

softmax 之后,每个权重都落在 0 到 1 之间、总和恰好为 1,并且分数越高的词分到的权重越大。

三步骨架:这就是注意力

把上面的流程串起来,对句子里的 每一个词 都做一遍:

这个「打分 → 归一化 → 加权求和」的三步流程,就是 注意力机制(attention) 的全部骨架。 名字非常形象:权重大的词,就是当前词「注意」得多的词。

当权重和被加权的内容都来自 同一个句子 时,这种注意力称为 自注意力(self-attention) 。「自」指的就是「自己句子内部」的词在互相注意。

动手算一算:同一个词,两个向量

用 PyTorch 把这三步写出来,只需要几行。下面准备几个词的玩具词向量(4 维,数值仅为演示),对两个句子里的「苹果」分别做一遍注意力。 逐步往下走,左边的代码会高亮到对应行,下方画面同步展示这一步在向量上发生了什么, 最后两句的「苹果」会算出明显不同的向量。

把所有词的注意力排成一张表

刚才我们只看了「苹果」一个词。实际上句子里 每个词 都会做同样的三步。 把「每个词对每个词」的权重排成一张 L×L 的表(L 是句子长度),就得到 注意力权重矩阵 :第 i 行第 j 列的数,表示第 i 个词分给第 j 个词多少注意力。

下面以第一句「苹果 发布 新 手机」为例,把这张 4×4 的表画成热力图。每一行是一个 当前词 、每一列是它 注意的词 , 格子颜色越深,表示这一行的词分给这一列的词的注意力越大;格子里的数字就是具体权重(每行加起来等于 1)。把鼠标停在任意格子上,会显示这一格的含义,例如「『苹果』分给『手机』的注意力:0.21」。

这张表里,每个词都会把 一部分注意力分给自己 (对角线上那一格), 因此在混入上下文的同时,它自身原本的信息也保留了一部分;同时,注意力并非平均分配, 与当前词更相关的词会拿到更大的权重。这种「保留自身、又按相关度吸收上下文」的分配方式, 让同一个词能得到随上下文变化的新表示。

一点背景:注意力改变了什么

在注意力机制流行之前,处理文本序列主要依赖 循环神经网络(RNN) : 逐词读入句子、用一个不断更新的状态向量传递信息。这种串行方式有两个天然短板: 距离远的词信息在层层传递中容易丢失,而且必须一个词一个词地算,无法并行。

注意力则让任意两个词 直接 交互:不管隔多远,一步点积就能建立联系。 2017 年,Google 团队在论文 《Attention Is All You Need》 中提出了完全建立在注意力之上的架构: Transformer 。 它是后续一系列课程的主角,今天大家熟知的大语言模型都以它为基础。

还缺一样东西

回头看这套三步计算,还缺一样东西。

怎么给注意力装上可学习的参数,让模型在训练中自己学会分配注意力? 这就是「缩放点积注意力」要解决的问题。