第 04 · 注意力 · 12 min
注意力机制就是一切
改变一切的机制。每个标记如何关注所有其他标记以理解上下文。
代词与医生
让我们回到这个我们已经见过的句子:
"医生解雇了护士,因为她很累……"
对人类来说,"她"很自然地指的是护士。对大语言模型来说,这并不那么显而易见:当模型处理到 Token 她 时,词语护士已经在八个位置之前了。它如何将两者联系起来?
这就是注意力机制的作用。
注意力机制为何存在
2017 年之前,语言模型大多是循环结构(RNN、LSTM):它们逐个 Token 地读取文本,传递一个"隐藏状态"来汇总迄今为止看到的所有内容。
问题在于:这个隐藏状态是一个瓶颈。所有信息都必须通过它。随着句子变长,旧信息会被稀释。而且学习是顺序的——要处理第 100 个词,你必须先处理前 99 个,这使得并行化变得困难。
论文 Attention Is All You Need(Vaswani 等,2017)提出了一种突破:
正是这一机制使现代模型成为可能。
直觉理解
在模型的每一层,每个 Token 执行三个操作:
- 它向句子的其余部分提出一个问题(即 Query 向量)。
- 每个其他 Token 展示一个标签,概括自己是什么(即 Key 向量)。
- 该 Token 将自己的问题与每个标签进行比较:在匹配的地方,它获取一些内容(即 Value 向量)。
结果:每个 Token 得到一个新的表示,它是其他 Token 的加权求和,权重来自 Q-K 的匹配程度。
不需要记住这个公式——记住思想就好。每个 Token 关注所有其他 Token,并融合它认为有趣的内容。
Q、K、V 究竟从哪里来?
不是凭空产生的。对每个 Token,我们取它的嵌入向量 x,乘以三个在训练中学到的矩阵:
Q = x · W_Q
K = x · W_K
V = x · W_V
这三个矩阵 W_Q、W_K、W_V 就是注意力的参数。它们在同一层的所有 Token 之间共享——这正是模型通过梯度下降所调整的对象,目的是让正确的"问题"找到正确的"标签"。
公式中的 √d_k 因子用于防止维度较高时点积爆炸。没有它,softmax 之前的值会变得很大,softmax 会饱和,梯度会消失。技术细节,但必不可少。
同时提出多个问题
单组问题是不够的。一个 Token 可能需要同时关注它的句法主语和指代关系和主谓结构。
因此有了多头注意力:不是单个 Q-K-V 系统,而是多个系统并行运行(通常是 8、16 或 32 个)。每个头都学会专注于某种类型的关系。在分析训练好的模型时,你会发现专门负责以下任务的注意力头:
- 局部注意力(每个 Token 关注自身或紧邻的邻居)
- 主谓绑定
- 指代消解(代词回指其所指对象)
- 分隔符(标点符号、句首/句尾)
- 韵脚或诗歌结构
- 我们还不知道如何命名的东西
动手探索
下面的可视化展示了在两个句子中,不同注意力头可能呈现的样子。这些模式是经过风格化处理的(真实的权重来自训练好的模型),但每个头对应的是在当前模型中实际观察到的行为。
每一行展示了一个 token 如何注视其他所有 token。有些 head 跟随句法(主语 ↔ 动词),另一些捕捉语义(指代、先行词)。这些模式都没有被手工编程——它们从训练中自发涌现。
三件值得尝试的事:
- 在猫咪睡觉这个句子中,使用"主谓"注意力头,观察
睡觉这一行。最强的权重指向猫咪。这个动词"找到"了它的主语。 - 在指代消解这个句子中,使用"指代"注意力头,观察
他这一行。最强的权重指回婴儿。这正是解决代词谜题的机制。 - 在任意头中,观察右上角的三角区域:它是灰色的。这就是因果掩码——一个 Token 只能关注它之前的 Token。这迫使模型去预测,而不是复制。
因果还是双向?
并非所有注意力都是平等的。有两种模式。
双向注意力。 每个 Token 都能看到所有其他 Token,无论是前面的还是后面的。这是 BERT(Google,2018)和 T5 的编码器所采用的方式。这类模型擅长理解句子——分类、抽取式问答、语义搜索——但它们不会逐 Token 生成文本。
因果注意力。 每个 Token 只能看到之前的 Token。这就是我们在前面看到的三角形掩码。这个约束使自回归生成成为可能:要预测下一个词,模型必须只依靠过去来工作。
GPT、Claude、Llama、Gemini、Mistral——所有面向消费者的大语言模型都采用因果注意力。正是这个掩码让它们具备了预测的能力,而不仅仅是描述。
注意力代价高昂
这种优雅是有代价的。对于长度为 n 的序列,计算注意力矩阵需要 O(n²) 次操作。上下文长度翻倍,代价翻四倍。
这就是为什么 GPT-2 的上下文窗口只有 2,048 个 Token,GPT-3.5 为 8,192 个,需要一些算法技巧(FlashAttention、滑动窗口、稀疏注意力)才能达到今天的 200,000 Token。我们会在第 18 章回到这些技术,看它们如何与 KV 缓存的内存绑在一起。
注意力机制很强大,但它也是现代大语言模型的主要瓶颈。
接下来
仅有注意力机制并不能构成语言模型。你需要将它叠加在连续的块中,加上前馈计算层、归一化和残差连接。这就是完整的Transformer 架构——下一章的主题。
更新于