为什么KV Cache只存储K和V向量,而从不存储Q?这是一个经典的LLM面试问题。
理解这个问题需要回到自回归解码的本质。LLM是逐个生成token的,每个新token的生成都依赖于所有之前的token。关键在于:当生成第n+1个token时,我们需要Q_n+1与K_1到K_n+1进行注意力计算,然后乘以V_1到V_n+1。
但在生成第n个token时,我们已经计算过Q_n与K_1到K_n的点积,以及V_1到V_n的加权和。而且由于因果掩码的存在,K_1到K_n和V_1到V_n在第n步和第n+1步之间不会改变——因为它们只依赖于当前token和之前的token,不会因为后面添加了新token而变化。
所以,我们可以直接复用之前计算过的K和V,只需要计算新的Q_n+1、K_n+1和V_n+1。而Q向量只在当前步使用一次,之后就被丢弃,因此不需要缓存。
这个优化能显著减少重复计算,提升推理效率。对于长序列来说,节省的计算量非常可观。这也是为什么KV Cache是现代LLM推理中不可或缺的技术。
话题来源 @_avichawla
· 440K阅读 · ❤️2433 · x.com/…↗ · 已改写,非原文转载
22 浏览 0 评论
0 反应













