CONCEPT / neural-networks
注意力机制:从加权平均到自注意力
从数据相关的加权平均推导缩放点积注意力,明确 query、key、value 的形状、softmax 归一化与解释边界。
本页目标
- 解释 query、key 和 value 在加权读取中的不同角色。
- 写出缩放点积注意力的矩阵形式并核对张量形状。
- 区分注意力权重与因果解释所需的额外证据。
本页目录
学习目标
注意力从普通加权平均出发,让权重随 query 与 key 的内容变化。完成学习后,应能检查 的形状、缩放因子、softmax 方向与掩码,能手算一个因果注意力矩阵,并能区分信息混合权重、模型置信度和因果贡献。
先修知识与符号
需要掌握向量内积、矩阵乘法、线性投影和归一化权重。条件概率中的“在给定查询下对候选项分配总和为一的权重”提供有用类比,但注意力权重由模型分数确定,只有在额外统计建模与校准条件下才具有概率解释。
用 表示 query 数量, 表示 key/value 数量, 表示 query 与 key 的共同维数, 表示 value 维数。矩阵约定每一行对应一个位置。自注意力常有 ;交叉注意力允许二者不同。Softmax 默认沿 key 轴逐行计算,若实现沿错轴归一化,形状仍可能正确但语义已经改变。
为什么固定权重不够
读一句话时,不同位置需要的信息取决于当前问题。处理代词可能要寻找它指向的名词;判断动词形式可能更依赖主语。固定卷积核或固定平均权重无法针对每个查询位置重新选择信息。
注意力可精确定义为一种数据相关的读取:
- 用 query 表示当前要找什么;
- 用 key 表示每个候选项如何被匹配;
- 用 value 表示匹配后实际取回什么;
- 把相似度转为归一化权重,再对 value 加权求和。
从加权平均到单个查询
给定 query 、keys 和 values ,先计算分数
再归一化
输出为
因此,在没有额外变换时,输出位于 values 的凸包中。权重取决于 query 和 keys,实际被混合的内容来自 values;三者角色不应互换。
为什么除以
作一个有限的方差估计。假设 query 和 key 的各分量独立、均值为零、方差为一,则点积 的方差约为 。维数增大时,未缩放分数的典型幅度随 增长,softmax 更容易进入接近单点饱和的区域,梯度变小。
除以 使这个理想化假设下的分数量级保持稳定。若分量高度相关或方差不同,该推导只是近似动机,不能当作任何数据分布下的精确保证。
缩放后仍要使用数值稳定的 softmax。对一行分数减去同一个常数不会改变权重,因此可先减去该行最大值:
这个改写降低指数上溢风险,但不能修复非有限输入或错误掩码。若某一行所有位置都被屏蔽,分母没有合法项;实现必须定义空行策略或在进入 softmax 前拒绝该状态。
矩阵形式与形状
对长度为 的序列,把所有查询、键和值排成矩阵:
缩放点积注意力为
的形状是 。softmax 对每个 query 所在的行独立归一化;得到的权重矩阵再乘 ,输出形状为 。
在自注意力中, 来自同一输入 的不同线性投影:
“同一输入”不表示三者数值相同。可学习矩阵让匹配空间与被读取内容的空间承担不同功能。
例题一:两个候选值
令
并暂时省略缩放以方便手算。分数为 ,所以
若 、 ,则
匹配分数来自 key,输出坐标来自 value。把 对调会改变输出,却不会改变注意力权重,这正说明“看向哪里”和“取回什么”是两层概念。
自注意力、交叉注意力与多头结构
自注意力让 都由同一序列表示投影得到,因此输出位置数通常与输入位置数相同。交叉注意力让 query 来自一个序列,key 与 value 来自另一个序列。例如解码器状态可作为 query,编码器输出作为 key/value。此时分数矩阵形状为 ,输出形状为 ,没有理由强求 。
多头注意力把模型维度投影到多个子空间。第 个头计算
再把各头输出沿特征轴拼接,并乘输出矩阵。不同头拥有独立投影,但没有训练约束保证每个头获得可命名且互不重复的功能。头数增加还会改变每头维度、参数布局和并行效率,应与固定模型维度和计算预算一起讨论。
掩码与顺序
因果语言模型不能让位置 读取未来位置。通常在 softmax 前给禁止位置加上 的掩码,使其归一化权重为零。实现中应使用数值稳定的掩码方式,避免低精度下产生 NaN。
纯注意力公式本身对输入置换具有相应的置换等变性,公式中没有词序信息。Transformer 需要位置编码或其他位置机制把顺序注入表示。
掩码应在归一化前作用于分数。若在 softmax 后把禁止位置权重改成零,却没有重新归一化,允许位置的权重和会小于一,输出尺度随屏蔽数量改变。填充掩码与因果掩码用途也不同:前者忽略批处理中补齐的无效 token,后者阻止读取未来位置。
例题二:手算三位置因果注意力
设三个位置的标量 value 为 。加入因果掩码后的三行 logits 分别为
逐行 softmax 得
每一行只在当前位置及其之前归一化。输出 依次为 、、。第二、三行结果恰好相同,但权重分布不同;只查看输出值无法反推出唯一注意力矩阵。第一行无论未来 value 如何变化都保持为二,体现了因果屏蔽。
交互实验:分数、权重与掩码
操作前先选择一行 query,预测提高某个 key 相似度后该行所有权重如何重新分配;再预测打开因果掩码会清零哪些单元。还要记录一个判断:权重最大的格子是否足以确定输出变化最大的 value。
注意力权重矩阵
正在加载交互实验…
按以下顺序检查:
- 固定 query 和 values,只移动一个 key,比较原始分数与归一化权重。
- 改变缩放或温度,观察权重熵如何变化,同时确认每行和仍为一。
- 开启因果掩码,逐行核对未来位置为零,且允许位置重新归一化。
- 固定权重后改变一个 value,确认分数矩阵不变而输出随内容变化。
- 重置并分享状态 URL,核对矩阵、掩码和当前步骤能够复现。
热力图只展示选定层、选定头和当前输入。颜色还必须配合数值或文本摘要,因为相近颜色不等于相同权重,色彩也不能作为唯一数学编码。实验能验证公式在具体状态下的计算,不能据此证明某个 token 对最终预测具有因果作用。
计算复杂度与适用边界
长度为 的全注意力需要形成 分数矩阵,时间和中间存储通常随 增长;投影与输出乘法还包含模型维度因子。长序列中,分数矩阵可能成为主要内存开销。局部窗口、稀疏模式、低秩或核近似可以降低特定成本,但会改变允许的信息路径或近似误差,不能只更换算法名称就假定与全注意力等价。
注意力还依赖表示质量。若 query/key 投影没有学到有用匹配,即使 softmax 完全正确,权重也可能无助于任务。反方向上,权重很集中也不保证预测正确,因为被读取的 value 可能缺少信息,后续层还会继续变换结果。结构、优化和统计评估应分开诊断。
常见误区
“注意力权重高就证明该 token 是模型决策的原因。”权重描述某层某头的一次信息混合,不能单独提供因果贡献;残差路径、后续层和值向量内容都可能改变最终结果。
“自注意力就是在整个互联网中检索。”标准自注意力只在当前输入提供的 key/value 集合中加权。外部检索需要额外的数据源、索引和检索流程。
“softmax 后最大的权重必须接近一。”权重集中程度由分数差和尺度共同决定;分数相近时分布可以很平坦。
代码:单查询缩放点积注意力
function dot(a: readonly number[], b: readonly number[]): number {
if (a.length !== b.length) {
throw new Error("Query and key dimensions must match.");
}
return a.reduce((sum, value, index) => sum + value * b[index], 0);
}
function softmax(values: readonly number[]): number[] {
const maximum = Math.max(...values);
const exponentials = values.map((value) => Math.exp(value - maximum));
const denominator = exponentials.reduce((sum, value) => sum + value, 0);
return exponentials.map((value) => value / denominator);
}
export function attend(
query: readonly number[],
keys: readonly (readonly number[])[],
values: readonly (readonly number[])[],
): number[] {
if (keys.length === 0 || keys.length !== values.length) {
throw new Error("Keys and values must be non-empty and aligned.");
}
const scale = Math.sqrt(query.length);
const weights = softmax(keys.map((key) => dot(query, key) / scale));
const output = new Array<number>(values[0].length).fill(0);
values.forEach((value, row) => {
if (value.length !== output.length) {
throw new Error("All value dimensions must match.");
}
value.forEach((component, column) => {
output[column] += weights[row] * component;
});
});
return output;
}
减去最大分数不会改变 softmax 结果,却能降低指数溢出的风险。代码仍是教学实现,未处理批次、多头、掩码和加速矩阵乘法。
参数实验
使用例题中的两个 key,令 ,从 缓慢转到 :
- 计算两项权重随角度的变化。
- 把所有分数再除以温度 ,比较权重集中程度。
- 保持权重不变,只替换 values,验证输出可以显著变化。
温度实验解释 softmax 的尺度效应,模型置信度校准还需要带标签数据上的独立检验。
练习
概念检查:为什么 value 的维数 可以不同于 key 的维数 ?
查看解答
key 只参与与 query 的匹配,因此必须与 query 维数兼容;value 是被加权读取的内容,只需所有 value 彼此同维。加权后输出维数由 决定。
计算:若某一行缩放分数全为零,该行 softmax 权重和输出分别是什么?
查看解答
有 个候选时,每个权重为 ,输出是对应 values 的算术平均。
迁移应用:解释为什么删除一个低注意力权重 token 后,模型输出仍可能明显变化。
查看解答
该 token 可能在其他层或其他头中权重较高,也可能通过残差路径影响表示;删除还会改变后续位置、归一化和所有 query/key/value。单层单头权重不能隔离删除操作的因果效应。
与其他知识的关系
延伸阅读
Attention Is All You Need
Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin
阅读注意力机制文章时用于核对原始模型定义和实验边界。
打开官方来源《Attention Is All You Need》给出缩放点积、多头注意力和 Transformer 架构的原始定义,可用于核对公式、形状和模型组成。论文实验针对其数据与配置,不能直接转换成所有注意力模型的性能结论。
Deep Learning
Ian Goodfellow, Yoshua Bengio, Aaron Courville
适合作为反向传播和优化章节的完整参考。
打开官方来源《Deep Learning》提供表示学习、前馈网络、softmax 与优化的系统背景,适合补足注意力所依赖的线性代数和概率建模基础。该书出版早于 Transformer,不应被当作自注意力架构的原始来源。