LLM推理加速深度解析:为何只使用KV Cache,而不用Q Cache?

这个问题其实非常直观——在LLM的自回归解码(decoding)阶段,每一次推理仅依赖当前的Q向量,用完即弃,后续步骤不会再重复使用它。但K和V则截然不同:当前步骤用到的K和V,后续推理中依然需要反复调用,并且还要将新生成token对应的KV追加进去。因此,缓存KV能够大幅削减重复计算量,而缓存Q则完全没有实际意义。
道理虽如此,但面试官往往会进一步追问:“Attention公式中Q和K在形式上如此对称,为什么只缓存K而不缓存Q?” 那么,我们就从公式底层把这个问题彻底讲清楚。
从矩阵运算角度理解对称性如何被打破
首先将Attention中的Q、K、V写成矩阵分块形式。Q与K的转置做矩阵乘法时,表面上看K和Q可以互换,对称性非常完美。然而,当V介入后,这种对称性便不复存在。
忽略缩放系数,将第i行的softmax结果简记为s_i,则Attention的输出就是每个位置的softmax权重与对应V的加权和:
在没有Causal Mask(因果掩码)的情况下,上述操作天然对称——交换Q和K,结果形式保持不变。但一旦引入Causal Mask,局面就彻底不同。
启用Causal Mask时,当前token只能关注自己及之前的位置,无法看到未来信息。此时Attention计算变为:
写出通项公式:
- 无Causal Mask:每个位置的输出依赖于所有位置的Q、K、V。
- 有Causal Mask:第t个位置的输出仅依赖于位置1到t的K、V,以及当前位置的Q。
关键差异就在此处:在序列的第t个位置,只有当前这个 q_t 参与了计算,而K和V却有t个位置(1到t)全部参与。因此,我们需要缓存历史上所有位置的K和V,但完全无需缓存历史的Q——因为它们在后续计算中早已失效。
值得一提的是,如果没有Causal Mask,计算第t个位置的Attention还需要用到未来位置的KV,这在自回归推理中根本无法提前获取。而加上Causal Mask之后,仅需1,2,…,t位置的KV,推理才能顺利执行。这也正是KV Cache不仅是一种性能优化手段,更是自回归解码得以高效运转的核心基础。
