Transformer
鉴于Transformer架构已经逐步成为深度学习乃至机器学习的核心架构,我单独开这么一篇笔记来记录学习Transformer架构。在DNN架构介绍中我们已经简单了解了Transformer的一些特点,在本笔记中我们将进一步深入了解Transformer。
自回归
KV-Cache
KV-cache 是专门为了服务于大语言模型的自回归(Auto-regressive)推理过程而诞生的技术,是大语言模型(如 GPT、LLaMA)在推理(Inference)阶段用来加速生成速度、减少重复计算的一种核心技术手段。
简单来说,它是模型为了“不把算过的东西重算一遍”而建立的一个临时存储区。
在 Transformer 的注意力机制中,每个词都会生成三个向量:
- Q (Query) :当前的查询(我是谁?我要找什么?)。
- K (Key) :索引标签(我的特征是什么?)。
- V (Value) :实际内容(我的含义是什么?)。
比如模型要生成句子 "我 爱 学习" :
- 第1步 :输入 "我",模型算出 "爱"。
- 第2步 :模型把 "我" 和 "爱" 放在一起看,算出 "学习"。
- 第3步 :模型把 "我"、"爱"、"学习" 放在一起看,算出下一个词(比如句号)。
如果没有 KV-cache,第3步会发生什么?
- 模型拿到 "我、爱、学习"。
- 模型重新计算 "我" 的 K 和 V。
- 模型重新计算 "爱" 的 K 和 V。
- 模型计算新词 "学习" 的 K、V 和 Q。
- 然后大家一起做注意力运算。
问题: "我" 和 "爱" 的 K 和 V,在第1步和第2步早就又算过一遍了!它们是固定的, 重复计算它们是在浪费时间(GPU 算力) 。
KV-cache 的逻辑是:算过的就存起来(Cache),下次直接用。带 KV-cache 的流程:
- 第1步(生成“爱”):
- 计算 "我" 的 \(K_{1}, V_{1}\)。
- 【存储】 把 \(K_{1}, V_{1}\) 存入显存(这就是 KV-cache)。
- 输出 "爱"。
- 第2步(生成“学习”):
- 输入新词 "爱"。
- 只计算 "爱" 的 \(K_{2}, V_{2}\) 和 \(Q_{2}\)。
- 【读取】 从显存里把 "我" 的 \(K_{1}, V_{1}\) 拿出来。
- 【拼接】 把旧的 \(K, V\) 和新的 \(K, V\) 拼在一起。
- 做注意力运算,输出 "学习"。
- 【存储】 把 \(K_{2}, V_{2}\) 也存入 KV-cache。
- 第3步(生成“。”):
- 输入新词 "学习"。
- 只计算 "学习" 的 \(K_{3}, V_{3}\) 和 \(Q_{3}\)。
- 【读取】 拿之前的 \(K_{1}, V_{1}, K_{2}, V_{2}\)。
- ...以此类推。
模型不需要重新“阅读”原文,只要拿着这些 KV 向量,就拥有了对过去所有对话的“记忆”。因此KV-Cache实际上是一种“工作时记忆”。在具身智能笔记中介绍世界模型的时候我们提到过,KV-Cache的局限性在于线性增长和显存爆炸:1000个词的对话,就要存1000组 KV;10万个词,就要存10万组。