42 分钟
大模型内核:从经典机器学习到对齐与前沿

注意力机制:Q、K、V 与缩放点积注意力

从 RNN 的两大硬伤(串行、长程衰减)出发,讲清自注意力如何让任意两个词直接交互,用「查询—键—值」的检索直觉彻底讲透 Q/K/V,以及缩放点积注意力公式每一项的含义

  • 理解自注意力要解决 RNN 的什么问题
  • 用检索类比彻底理解 Query、Key、Value 三者角色
  • 看懂缩放点积注意力公式:相似度→缩放→Softmax→加权求和
  • 理解为什么要除以根号 dk,以及注意力权重的含义

先回到 RNN 的两个硬伤

上一模块看到,RNN 必须一个词一个词串行算,无法并行;句首信息要经过很多步才能传到句尾,沿途衰减。注意力机制换了个根本思路:处理某个词时,让它直接「看」句子里所有其他词,按相关程度聚合信息,任意两词之间的路径长度都是 1。

用「检索」理解 Q、K、V

自注意力最容易被符号吓住,其实它就是一次软检索。每个词会被投影成三个向量:

Q/K/V:一次数据库检索的三个角色

Query 查询

我现在这个词,想找什么样的相关信息(我在问什么)

Key 键

每个词对外的「标签/索引」,供别人匹配(我能提供什么)

Value 值

每个词真正要被聚合走的内容

当前词拿自己的 Query,去和所有词(包括自己)的 Key 算相似度,相似度越高说明越该关注;把相似度归一化成权重,再对所有词的 Value 做加权平均,就得到当前词融合了全局上下文的新表示。

举个具体例子感受一下:句子「它把苹果切成块」里,「苹果」这个词的 Query 大概率会和「切」「块」的 Key 高度匹配,而和「公司股价」这类词匹配度低——于是它聚合到的 Value 偏「水果」这一侧,多义词就此消歧。注意这个过程里权重是「软」的:不是只挑一个最相关的词,而是对所有词都给一点权重,按相关度分配。这跟人读句子时的注意力很像——你理解某个词时会不自觉地回头扫一遍相关上下文,而不是死盯它旁边那个词。Q、K、V 之所以要从同一个输入线性投影出来,是因为原始词向量未必天然适合「当查询」或「当索引」,让网络自己学出三套投影,才知道该用什么角度去匹配、取什么内容。

缩放点积注意力四步

Attention(Q,K,V) = softmax(QKᵀ/√dk)·V

① 算相似度:Q·Kᵀ

查询与每个键做点积,得到相关性原始分数

② 缩放:除以 √dk

dk 是键向量维度,防止维度过大点积过大

③ Softmax 归一化

分数变成和为1的注意力权重(0~1),越相关权重越大

④ 加权求和:权重 × V

按权重聚合所有值,得到输出

ℹ️为什么要除以 √dk

点积结果的方差会随维度 dk 增大而增大。维度一大,点积数值拉开得很极端,Softmax 会接近 one-hot:某个权重≈1、其余≈0,梯度几乎为零、训练僵住。除以 √dk 把数值尺度拉回稳定区间,让 Softmax 保持平滑、梯度可学。这是一个很小但不能省的细节。

💡Q·K 的点积,stage11 从向量讲起

这里第一步「Q 与每个 K 做点积打分」,本质就是两个向量对应分量相乘再求和。stage11〈向量与张量:模型世界的通用语言〉从「一支带方向的箭」讲起点积,手算了 a·b=Σaᵢbᵢ,归一化后就是余弦相似度——和 RAG 里向量检索、全连接层打分用的是同一个运算。

自注意力「自」在哪里

一般注意力可以发生在两个序列之间(如查询来自解码器、键值来自编码器,即交叉注意力);自注意力(Self-Attention)的 Q、K、V 来自同一个序列,也就是一句话内部的词彼此打量、互相融合。经过一层自注意力,每个词的向量都已经混入了与其相关的上下文,多义词由此能根据语境确定含义——比如「苹果」到底是水果还是公司,取决于它关注了哪些词。

一层自注意力够不够?通常不够。单头一次的全局混合还比较粗糙,所以 Transformer 把「注意力+FFN」这个 Block 反复叠几十层:每叠一层,词与词之间的信息就交换、消化得更深一层。低层可能在关注局部搭配,高层才捕捉到整段的指代与逻辑。这也是为什么加深有用——它不是简单重复同一运算,而是让信息在越来越抽象的层次上反复重组。

一层自注意力的数据流(序列长度不变,信息被混合)

输入序列每个词 → 各自线性投影出 Q,K,V

所有 Q 与所有 K 两两打分

Softmax 得注意力权重矩阵

矩阵第 i 行=第 i 个词对所有词的关注分布

权重对 V 加权,输出上下文感知的新序列

🐍两大优势,一次解决

其一是路径短:任意两词直接交互,长程依赖不再需要沿时间一步步传;其二是可并行:所有词的 Q/K/V 是矩阵乘法,能一次性整体计算,不像 RNN 必须等上一步。这两点正是 Transformer 能扩展到超大模型的底层原因。

天下没有免费的午餐,自注意力的代价是计算量随序列长度平方增长。因为要让任意两个词两两打分,一句话有 n 个词,注意力矩阵就是 n×n 个元素——从 n=1000 涨到 n=8000,开销不是 8 倍而是几十倍。这就是为什么「上下文窗口从 8K 扩到 128K」听着只是数字变大,背后却是显存和算力的陡增,也是后来各种「稀疏注意力、滑动窗口、长上下文优化」持续被研究的原因。理解这个 O(n²) 代价,就理解了大模型为什么不能无限免费地「读长文」。

选择题

在自注意力中,某个词最终的输出向量是怎么得到的?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

从线性回归到神经网络,本质都一样:定义一个带参数的函数 fθ(x),用损失函数衡量它和真实答案的差距,再沿梯度方向更新参数。监督、无监督、强化学习的区别,只在「训练信号从哪里来」。先把这套统一视角立住,后面遇到的任何模型都是它的具体实例,就不会被层出不穷的名词淹没。