注意力机制:Q、K、V 与缩放点积注意力
从 RNN 的两大硬伤(串行、长程衰减)出发,讲清自注意力如何让任意两个词直接交互,用「查询—键—值」的检索直觉彻底讲透 Q/K/V,以及缩放点积注意力公式每一项的含义
- 理解自注意力要解决 RNN 的什么问题
- 用检索类比彻底理解 Query、Key、Value 三者角色
- 看懂缩放点积注意力公式:相似度→缩放→Softmax→加权求和
- 理解为什么要除以根号 dk,以及注意力权重的含义
先回到 RNN 的两个硬伤
上一模块看到,RNN 必须一个词一个词串行算,无法并行;句首信息要经过很多步才能传到句尾,沿途衰减。注意力机制换了个根本思路:处理某个词时,让它直接「看」句子里所有其他词,按相关程度聚合信息,任意两词之间的路径长度都是 1。
用「检索」理解 Q、K、V
自注意力最容易被符号吓住,其实它就是一次软检索。每个词会被投影成三个向量:
Query 查询
我现在这个词,想找什么样的相关信息(我在问什么)
Key 键
每个词对外的「标签/索引」,供别人匹配(我能提供什么)
Value 值
每个词真正要被聚合走的内容
当前词拿自己的 Query,去和所有词(包括自己)的 Key 算相似度,相似度越高说明越该关注;把相似度归一化成权重,再对所有词的 Value 做加权平均,就得到当前词融合了全局上下文的新表示。
缩放点积注意力四步
① 算相似度:Q·Kᵀ
查询与每个键做点积,得到相关性原始分数
② 缩放:除以 √dk
dk 是键向量维度,防止维度过大点积过大
③ Softmax 归一化
分数变成和为1的注意力权重(0~1),越相关权重越大
④ 加权求和:权重 × V
按权重聚合所有值,得到输出
点积结果的方差会随维度 dk 增大而增大。维度一大,点积数值拉开得很极端,Softmax 会接近 one-hot:某个权重≈1、其余≈0,梯度几乎为零、训练僵住。除以 √dk 把数值尺度拉回稳定区间,让 Softmax 保持平滑、梯度可学。这是一个很小但不能省的细节。
这里第一步「Q 与每个 K 做点积打分」,本质就是两个向量对应分量相乘再求和。stage11〈向量与张量:模型世界的通用语言〉从「一支带方向的箭」讲起点积,手算了 a·b=Σaᵢbᵢ,归一化后就是余弦相似度——和 RAG 里向量检索、全连接层打分用的是同一个运算。
自注意力「自」在哪里
一般注意力可以发生在两个序列之间(如查询来自解码器、键值来自编码器,即交叉注意力);自注意力(Self-Attention)的 Q、K、V 来自同一个序列,也就是一句话内部的词彼此打量、互相融合。经过一层自注意力,每个词的向量都已经混入了与其相关的上下文,多义词由此能根据语境确定含义——比如「苹果」到底是水果还是公司,取决于它关注了哪些词。
输入序列每个词 → 各自线性投影出 Q,K,V
所有 Q 与所有 K 两两打分
Softmax 得注意力权重矩阵
矩阵第 i 行=第 i 个词对所有词的关注分布
权重对 V 加权,输出上下文感知的新序列
其一是路径短:任意两词直接交互,长程依赖不再需要沿时间一步步传;其二是可并行:所有词的 Q/K/V 是矩阵乘法,能一次性整体计算,不像 RNN 必须等上一步。这两点正是 Transformer 能扩展到超大模型的底层原因。
在自注意力中,某个词最终的输出向量是怎么得到的?
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
从线性回归到神经网络,本质都一样:定义一个带参数的函数 fθ(x),用损失函数衡量它和真实答案的差距,再沿梯度方向更新参数。监督、无监督、强化学习的区别,只在「训练信号从哪里来」。先把这套统一视角立住,后面遇到的任何模型都是它的具体实例,就不会被层出不穷的名词淹没。