TheZTHEZ / UNDERSTANDING FIRST
Transformer进阶18 分钟阅读

注意力机制入门:Q、K、V 到底在做什么?

用可运行例子理解缩放点积、softmax 与输出。

查询、键和值

把 token 向量排为 X∈Rn×dX\in\mathbb R^{n\times d}。学习投影产生 Q=XWQQ=XW_Q、K=XWKK=XW_K、V=XWVV=XW_V。查询表示要找什么,键用于比较匹配,值用于汇总内容。这个类比不代表网络必定学到人类命名的语义。

缩放点积注意力

Q,K∈Rn×dkQ,K\in\mathbb R^{n\times d_k},V∈Rn×dvV\in\mathbb R^{n\times d_v},定义

S=QKTdk,Aij=exp⁡(Sij)∑t=1nexp⁡(Sit),O=AV.S=\frac{QK^T}{\sqrt{d_k}},\quad A_{ij}=\frac{\exp(S_{ij})}{\sum_{t=1}^{n}\exp(S_{it})},\quad O=AV.

S,AS,A 均为 n×nn\times n,输出为 n×dvn\times d_v。每行权重和为 1,因此输出是值向量的加权平均。

缩放的动机

若 Q、K 的分量近似独立、零均值、单位方差,则点积方差约为 dkd_k。除以 dk\sqrt{d_k} 控制尺度,减少 softmax 过早饱和。这是依赖假设的动机,不是训练所有阶段都严格满足的定理。

稳定实现

import numpy as np

Q = np.array([[1., 0.], [0., 1.]])
K = np.array([[1., 0.], [0., 1.]])
V = np.array([[10., 0.], [0., 20.]])
scores = (Q @ K.T) / np.sqrt(Q.shape[1])
scores -= scores.max(axis=-1, keepdims=True)
weights = np.exp(scores)
weights /= weights.sum(axis=-1, keepdims=True)
output = weights @ V
assert weights.shape == (2, 2)
assert np.allclose(weights.sum(axis=-1), 1)
assert output.shape == (2, 2)
assert output[0, 0] > output[1, 0]
print(output)

减去每行最大值不改变 softmax,但能降低指数溢出风险。这里沿 token 维度计算,不是特征维度。

掩码与边界

自回归生成时,位置 ii 只能关注不晚于它的位置。常将 j>ij>i 的分数设为负无穷,再 softmax,遮挡项权重为零。若某行全被遮挡,softmax 不再有正常定义,必须避免或特别处理。

本例只有单头注意力,不是完整 Transformer;完整模型还包括多头拼接、位置表示、残差、归一化与前馈网络。朴素分数矩阵需 O(n2)O(n^2) 存储,长序列计算因此成本较高。

练习

把第二个值向量改为 [0., 100.],Q、K 不变。权重不变,输出改变。这说明“关注哪里”与“汇总什么”是不同的步骤。

这一节,你理解到哪里了?

这是你的自我反馈,与练习估计、课程进度分别记录。

本文为TheZ原创教学内容。正文采用 CC BY-NC-SA 4.0,代码采用 MIT 许可。请尊重署名与授权范围。