查询、键和值
把 token 向量排为 。学习投影产生 、、。查询表示要找什么,键用于比较匹配,值用于汇总内容。这个类比不代表网络必定学到人类命名的语义。
缩放点积注意力
,,定义
均为 ,输出为 。每行权重和为 1,因此输出是值向量的加权平均。
缩放的动机
若 Q、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 维度计算,不是特征维度。
掩码与边界
自回归生成时,位置 只能关注不晚于它的位置。常将 的分数设为负无穷,再 softmax,遮挡项权重为零。若某行全被遮挡,softmax 不再有正常定义,必须避免或特别处理。
本例只有单头注意力,不是完整 Transformer;完整模型还包括多头拼接、位置表示、残差、归一化与前馈网络。朴素分数矩阵需 存储,长序列计算因此成本较高。
练习
把第二个值向量改为 [0., 100.],Q、K 不变。权重不变,输出改变。这说明“关注哪里”与“汇总什么”是不同的步骤。
这一节,你理解到哪里了?
这是你的自我反馈,与练习估计、课程进度分别记录。
本文为TheZ原创教学内容。正文采用 CC BY-NC-SA 4.0,代码采用 MIT 许可。请尊重署名与授权范围。