Loading
人们总用比喻来解释注意力:模型"看向"某个词、"聚焦"某个短语、"决定"什么重要。这些动词每一个都偷偷夹带了一份并不存在的意图。
下面是完整的机制,不向心理学借用任何东西。
关键结论: 注意力是一次加权平均。权重来自一次点积和一次 softmax,而 softmax 保证它们加起来等于 1——无论是否真有什么值得平均。
每个词元进入一个头时,是一个 256 维的向量。这个头立刻用三个学到的矩阵把它变成三个不同的版本:
Query 与 key 是配对的那一对,value 是货物。在 bert-mini 中,每个头在 64 维上工作:256 维的信息流被切成四份,好让四个头各自独立地专门化。
词元 i 与词元 j 之间的分数,是 i 的 query 与 j 的 key 的点积,再除以 8——也就是 64 的平方根。这个除法不是装饰。没有它,点积会随维度增长,softmax 会饱和,训练时梯度会消失。
然后每一行分数都会经过一次 softmax:取指数,再归一化。而正是这一步值得盯着看。
一行加起来等于 1 是一个约束,不是一个发现。模型必须把恰好一个单位的注意力分配到某处,哪怕它没有任何有用的话可说。
来自随包前向传播的真实权重。选一个词,显示的这一行就是它在整句上的注意力——它总是加起来等于 1,因为 softmax 不可能做别的。
softmax 无法输出"这里什么也没有"。它接收给它的任何分数,返回一个分布:全为正数,和恰好为 1。
所以,当你看到一行注意力把权重铺在九个词上时,你看到的不是模型报告了九种关系,而是模型在履行一项义务。它有一个单位的注意力必须分配出去,且没有弃权的选项。
这正是"模型对 keys 分配了 0.499"这句话比听上去要弱的原因。真正该问的从来不是有多少,而是相对于"这个头没什么可说时这一行会是什么样",它有多少。
这个比较在这里有个名字:把最大权重除以均匀份额 1/n。比值 1.0 意味着胜者并不比随机挑选更好。在九个词的句子里,均匀份额是 0.111,所以 0.499 的峰值是均匀的 4.5 倍——一个真实的偏好。而同一个词若用按头平均的 rollout 去读,峰值只有 0.141,即 1.27 倍均匀:那才是披着排名外衣的噪声。
同一个词,用两个不同的头去读。比值是最大权重除以均匀份额:1.0 表示这一行什么也没说,9 表示一个词几乎拿走了全部。
在上面的图里切换注意力头,答案会完全改变。这是最让人意外的一点,也是关于 Transformer 最重要的结构性事实。
并不存在"那一个"注意力。这个模型里有十六个——四层,每层四个头——而且从未有人训练它们达成一致。每个头都有自己的 query、key、value 矩阵,因此每个头都在对同一个句子问一个不同的问题。有的头会可靠地回答"紧接着的下一个词",有的头则会找到四个位置之前那个动词的主语。
当一张可视化图告诉你这是一句话的"注意力"时,它已经悄悄在十六个答案中做了选择,或者把它们平均成了一个。两者都是解释。都不算错,但你应该知道自己在看哪一个——而本系列的下一篇,讲的正是:如果只凭"自信度"来做这个选择,会错得多离谱。
上面这套机制,不过是一百行左右的算术。三次矩阵乘法得到 Q、K、V,再一次给所有词对打分,每行做一次 softmax,然后对 value 向量做加权求和。
没有记忆。没有检索。没有决策。一个词元的输出,是所有词元的 value 向量的混合,混合比例由点积算出。
Transformer 擅长的一切,都从堆叠这个操作、并让矩阵去学习中涌现出来。这确实了不起——而它了不起,恰恰因为这个基本单元如此朴素,而不是尽管如此。
对一个注意力权重的诚实解读是很窄的。它告诉你:在某一层的某一个头里,一个位置的 value 向量以何种比例进入了另一个位置的输出。它没有告诉你模型理解了某种关系,也没有告诉你这个权重对最终答案有影响。
最后这道缺口——投入的注意力与实际的贡献之间——是可以测量的,而第 9 篇就去测量了它。
下一篇:十六个头,以及为什么其中五个永远只会说"下一个词"。