Self-Attention 里的匹配核是什么?从公式理解注意力打分机制
如果你已经知道 Self-Attention 的核心任务,是在一个序列内部判断“谁和谁更相关”,那么接下来最重要的问题就是:
这种“相关性”到底是怎么计算出来的?
很多人在第一次看到 Attention 公式时,都会把重点放在 softmax、矩阵乘法或者最后的加权求和上。但从建模角度来看,真正决定“谁该被关注”的,是前面那一步匹配函数(matching function),也可以理解为注意力里的某种匹配核(match kernel)。
本文会先从直觉解释匹配核,再用点积、缩放和 softmax 这三个层次,把 Self-Attention 的打分机制拆开。
什么是 Self-Attention 里的“匹配核”?
在直觉上,所谓匹配核,就是:
给定两个向量,模型用什么规则来衡量它们是否相关。
在 Self-Attention 里,这两个向量通常就是:
- 当前位置发出的查询向量 Query
- 其他位置提供的键向量 Key
模型会先计算 Query 和 Key 的匹配程度,再把这个匹配分数转换成注意力权重。
因此,所谓 match kernel,可以粗略理解为:
- “怎么打分”
- “用什么相似度函数衡量两个 token 之间的关联”
- “模型依据什么决定把注意力分给谁”
最经典的形式:点积匹配
Transformer 里最经典、最常见的注意力打分方式,是点积(dot product)。
它的核心公式通常写成:
$$ \mathrm{score}(q_i, k_j) = q_i^T k_j $$
这里:
- $q_i$ 表示第 $i$ 个位置的 Query 向量
- $k_j$ 表示第 $j$ 个位置的 Key 向量
- $q_i^T k_j$ 就是它们的点积
这个点积可以理解为一种非常常见的相似度度量:
- 如果两个向量方向更接近,点积通常更大
- 如果两个向量关系弱,点积通常较小
- 如果方向相反,点积甚至可能变成负值
所以,点积越大,通常就意味着“当前 token 更应该关注这个位置”。
为什么点积可以表示“相关性”?
从几何直觉来看,点积本质上和两个向量的夹角有关:
$$ q^T k = |q|,|k|\cos\theta $$
这里:
- $|q|$ 是 Query 的长度
- $|k|$ 是 Key 的长度
- $\theta$ 是它们之间的夹角
当两个向量方向接近时,$\cos\theta$ 更大,因此点积往往更大。
所以,从某种意义上说,Self-Attention 其实是在问:
“当前词提出的问题,和另一个词提供的信息方向是否一致?”
如果一致,就给它更高分。
从单个分数到整个注意力矩阵
在实际计算中,模型不会只看一对 Query 和 Key,而是会同时计算整个序列里所有位置之间的匹配分数。
如果把所有 Query 组成矩阵 $Q$,所有 Key 组成矩阵 $K$,那么分数矩阵可以写成:
$$ S = QK^T $$
其中:
- $Q \in \mathbb{R}^{n \times d_k}$
- $K \in \mathbb{R}^{n \times d_k}$
- $S \in \mathbb{R}^{n \times n}$
这里的 $n$ 是序列长度,$d_k$ 是 Key/Query 的维度。
矩阵 $S$ 的第 $(i,j)$ 个元素,就是第 $i$ 个位置对第 $j$ 个位置的原始注意力分数。
也就是说,整个注意力机制先构造出一张“谁和谁有多相关”的关系表。
为什么还要除以 $\sqrt{d_k}$?
标准 Transformer 并不是直接用 $QK^T$,而是用缩放后的形式:
$$ \mathrm{Attention}(Q,K,V) = \mathrm{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$
其中的关键操作是:
$$ \frac{QK^T}{\sqrt{d_k}} $$
这个缩放项的作用,是避免当维度 $d_k$ 很大时,点积结果变得过大。
如果分数太大,softmax 会变得非常尖锐:
- 一个位置权重接近 1
- 其他位置权重接近 0
这样会让训练不稳定,也会让梯度传播变差。
所以除以 $\sqrt{d_k}$ 的作用,本质上是:
控制分数的尺度,让 softmax 的输入更稳定。
softmax 在这里做了什么?
点积只是给出了“原始匹配分数”,但这些分数还不能直接当权重使用。
softmax 的作用,是把这些分数变成一组可解释的注意力权重:
$$ \alpha_{ij} = \frac{\exp(s_{ij})}{\sum_{j’} \exp(s_{ij’})} $$
其中:
- $s_{ij}$ 是位置 $i$ 对位置 $j$ 的原始匹配分数
- $\alpha_{ij}$ 是归一化后的注意力权重
这样一来,每个位置对所有其他位置的关注权重会加起来等于 1。
也就是说,模型最终不是在问:
- “这个位置相关不相关?”
而是在问:
- “在所有候选位置里,我应该把多少注意力分配给谁?”
所以 match kernel 真正决定了什么?
它决定的是注意力分配的基础规则。
如果你换一种匹配方式,那么模型眼中的“相关性”定义也会改变。
这意味着,match kernel 决定的不是输出值本身,而是:
- 哪些位置更容易彼此连接
- 信息从哪里流向哪里
- 模型更偏向捕捉哪一类关系
从这个意义上说,匹配核是注意力机制最核心的归纳偏置之一。
点积为什么会成为主流?
虽然理论上我们可以设计很多匹配函数,但点积成为主流,有几个非常现实的原因:
1. 计算高效
点积可以直接用矩阵乘法实现,非常适合 GPU / TPU 并行加速。
2. 参数少
点积本身不需要引入太多额外参数,结构简单。
3. 与线性投影结合自然
Query、Key、Value 本来就是通过线性层得到的:
$$ Q = XW_Q, \quad K = XW_K, \quad V = XW_V $$
在这种表示下,用点积做匹配非常自然。
4. 经验效果非常好
更重要的是,它在大规模训练中真的有效。
很多看似“更复杂”的相似度函数,不一定能带来更好的综合收益。
除了点积,还有别的 match kernel 吗?
有。
从更广义的 attention 研究来看,匹配函数并不只有点积一种。常见还包括:
1. 加性注意力(Additive Attention)
一种经典形式可以写成:
$$ \mathrm{score}(q,k) = v^T \tanh(W_q q + W_k k) $$
这种方式不是直接做点积,而是先对 $q$ 和 $k$ 做变换,再经过非线性层和线性投影得到分数。
它更灵活,但通常计算更复杂。
2. 双线性形式(Bilinear Form)
例如:
$$ \mathrm{score}(q,k) = q^T W k $$
这里在 Query 和 Key 中间加入了一个可学习矩阵 $W$,让匹配规则更丰富。
3. 基于距离或核函数的变体
有些研究还会用高斯核、余弦相似度、线性 attention 或其他核技巧,来改变注意力计算方式,尤其是在长序列优化场景里。
所以从研究视角看,attention 的一个重要方向,就是:
重新设计 match kernel,让“相关性”定义得更合理或更高效。
从核方法角度怎么看 attention?
有些研究会把 attention 和经典核方法(kernel methods)联系起来理解。
如果你熟悉机器学习中的核函数,可以把注意力里的匹配过程类比成:
- 给两个表示定义一个相似度函数
- 再根据相似度决定信息的组合方式
在这个视角下,$q^T k$ 就是一种最基础的核,而 softmax 再进一步把这些分数变成可用权重。
当然,严格来说,attention 并不等同于传统核方法,但这个类比非常有帮助,因为它提醒我们:
attention 不是“神奇黑箱”,它首先是一个相似度建模问题。
一个通俗例子:match kernel 如何影响结果?
假设一句话是:
“因为服务器过载,系统响应变慢,最终导致请求超时。”
当模型处理“超时”这个词时,理论上它可能关注很多词:
- “服务器”
- “过载”
- “响应变慢”
- “最终导致”
如果匹配函数更容易捕捉因果相关性,那“过载”和“响应变慢”就会获得更高分; 如果匹配函数只偏向局部邻近词,可能就更倾向看“最终导致”附近的位置。
这说明:
注意力不是天然知道什么最重要,而是通过匹配规则学会什么叫“重要”。
Multi-Head Attention 和 match kernel 的关系
在多头注意力里,不同 head 会有不同的投影矩阵:
$$ Q_h = XW_Q^{(h)}, \quad K_h = XW_K^{(h)}, \quad V_h = XW_V^{(h)} $$
虽然每个 head 最后通常都还是用点积做匹配:
$$ \mathrm{score}_h(q,k) = q_h^T k_h $$
但因为每个 head 的投影空间不同,所以它们实际上学到的是不同子空间下的匹配核。
这也是为什么多头注意力能够从多个角度看待同一段输入:
- 有的头关注句法
- 有的头关注语义
- 有的头关注指代
- 有的头关注长距离依赖
所以你可以把多头机制理解成:
不是一个匹配规则,而是一组并行学习的匹配规则。
match kernel 的局限在哪里?
尽管点积匹配非常成功,但它也有明显局限。
1. 计算复杂度高
因为每个位置都要和其他位置做匹配,复杂度通常随序列长度平方增长。
2. 相似度表达仍然有限
单纯点积虽然高效,但不一定能表达所有复杂关系。
3. 长文本成本高
序列越长,完整注意力矩阵越大,内存和计算都更重。
这也是为什么很多研究在尝试:
- 稀疏 attention
- 线性 attention
- kernelized attention
- 更适合长序列的变体
为什么理解它很重要?
如果你在做:
- Transformer 学习
- 大模型原理理解
- 长上下文优化
- 高效 attention 研究
- Agent / RAG / 多模态底层机制分析
那么理解 match kernel 非常重要。
因为它会帮助你真正看懂:
- 注意力到底在“算什么”
- 为什么是点积,不是别的
- 为什么要缩放
- 为什么 softmax 是必要的
- 为什么很多后续研究都在改 attention 的打分方式
总结
一句话概括:
Self-Attention 里的 match kernel,本质上就是定义“两个位置是否相关”的打分规则。
在标准 Transformer 中,这个规则就是缩放点积:
$$ \mathrm{score}(q_i, k_j) = \frac{q_i^T k_j}{\sqrt{d_k}} $$
而整个注意力机制,则是在这个匹配规则之上,通过 softmax 把分数转成权重,再对 Value 做加权汇总。
如果你把它理解成:
- match kernel = 相似度规则
- attention = 基于相似度规则的信息路由机制
那你就已经抓住了 Self-Attention 中最关键、也最值得继续深入的部分。