一步一步建立直观
先预测,再点“演示本步”核对右图。每一步都重设到指定情形,随后可以自由修改参数。
01从一个问题出发选择要读取的信息
把查询看成当前要找的特征,把键看成可供匹配的索引,把值看成真正需要传递的内容。右图直接调两个匹配分数的差,省去向量点积,只观察匹配之后的读取阶段。分数相等时,两个值具有相同权重,输出落在它们的中点。
02权重移动,输出也随之移动
提升第二项分数后,它的指数权重增大,输出向第二个值移动。由于权重非负且总和为一,单次标量加权结果始终落在两个值之间。读数与图形共同显示这个凸组合约束;经过后续线性层或残差相加后,整体输出则不再受同一界限约束。
03温度改变选择的锐利程度
固定分数差而降低温度,较大分数占据更大份额;提高温度则趋向平均。softmax 仍然是连续加权,不是简单地取最大值。非常小的温度会使数值敏感,程序还应使用稳定计算方法。这里的两个标量值只是便于检查机制的缩小模型。
3.8.1 同一个词为什么需要不同上下文表示¶
想象“银行”出现在取款句子与河岸翻译任务中。初始 token 表示本身不足以决定当前语境,需要从周围位置读取信息。注意力为每个位置建立一份按上下文改变的加权汇总,而不是给所有位置固定同一平均值。
查询负责提出匹配需求,键负责供匹配,值负责携带真正传递的内容。查询与键点积得到分数,再通过归一化产生权重。键与值分开,使“怎样找到信息”和“取回什么信息”能使用不同变换。
3.8.2 用两个值理解汇总,再放回矩阵¶
只有两个标量值二与十时,权重 给出四;把第二权重增大,输出向十移动。非负且和为一的权重保证汇总位于两值之间。交互实验会同时展示分数、温度、权重和输出,便于区分这四个对象。
真实单头中,每个查询都对多个键计算一行分数,所以出现 。除以 是缩放分数的设计;因果掩码让当前位置不能偷看未来 token。对每行独立归一化,再乘 ,便批量完成所有查询的汇总。
凸包解释只约束这一步的值平均,后续输出投影、多个头和残差连接都会改变最终位置。查询“寻找某类词”的比喻有助于理解可能行为,但某个训练模型究竟学了什么,仍须查看参数和实验,不能从命名直接断言。
定义 3.8.1 归一化指数权重
给定实数分数 与正温度 ,令 。各权重为正,且总和为一。
命题 3.8.1 一次注意力读取是凸组合
若标量值都在区间 中,则加权输出 也在 中。
证明 · 展开纸笔推导
逐项有 ,因为各权重非负。求和后得到 。
使用权重和为一便得到结论。本命题只约束这一次加权汇总,未约束接下来的线性输出变换、残差相加或整个网络的数值范围。
□
数学表述 3.8.1¶
查询向量表达“正在寻找什么”,键向量用于匹配,值向量提供被汇总的信息。每个位置根据自身查询选择不同的权重。
以 token 为行:, 因果掩码 禁止关注未来位置。每一行的有限权重非负且和为 。
例 3.8.1 把概念用于具体计算
两个标量值 ,权重 得输出 ,位于 内。
练习 3.8.1¶
权重 时结果?
展开解答与检查
。查询与键的维数相同,值维数可以不同。
Lean 对照 3.8.1 命题、证明与适用边界
完整证明两标量值的凸组合处在二者之间,保留权重 的条件。
NeuralNetworks.attention_convex
theorem attention_convex (u v w : ℝ) (hw : 0 ≤ w) (hw₁ : w ≤ 1)
(huv : u ≤ v) : u ≤ w*u+(1-w)*v ∧ w*u+(1-w)*v ≤ v := by
constructor
· nlinarith [mul_nonneg (sub_nonneg.mpr hw₁) (sub_nonneg.mpr huv)]
· nlinarith [mul_nonneg hw (sub_nonneg.mpr huv)]