第一次读注意力公式时,最困惑的往往不是矩阵乘法,而是 Q、K、V 这三个名字。 后来换了一个说法就好理解多了:把每个词想象成一个参会的人,Q 是他想问的问题, K 是他挂在胸前的标签,V 是他真正能提供的信息。注意力做的事,就是让每个词拿着自己的问题, 去和其他所有词的标签比对,再按匹配程度把信息取回来。

Q、K、V 在做什么

一句话里的每个 token 先被投影成三个向量。用 Q 和 K 做点积得到相似度,经过缩放和 softmax 变成一组权重,再用这组权重对 V 加权求和。输出的每一行,都是「当前这个词从整句话里取回的信息」。

缩放因子 1/sqrt(d_k) 的作用容易被忽略:当维度变大时,点积的方差也会变大, softmax 会退化成接近 one-hot 的分布,梯度变得很小。除以维度的平方根,是为了把分布拉回一个 更平滑的范围。

多头注意力

单个注意力头只能学到一种匹配关系,可能只关注相邻词,也可能只关注句法依赖。多头把 d_model 切成若干份,每个头在更低的维度上独立做一次注意力,最后拼接再投影。

形状上可以这样记:输入 [batch, seq, d_model],拆成 h 个头后每个头是 [batch, h, seq, d_head],其中 d_head = d_model / h,算完再合并回原维度。

位置编码为什么不能省

注意力本身对顺序是不敏感的:把 token 打乱,只要同时打乱对应的 K 和 V,结果完全一样。 但语言是有顺序的。所以必须额外注入位置信息,无论是正弦位置编码、可学习的位置向量, 还是后来的旋转位置编码(RoPE)。

小结

把注意力理解成「带权重的信息检索」,比死记公式更容易迁移到具体问题上。 之后再看到 KV Cache、多头、分组查询这些概念,也能顺着同一套直觉去理解。