将键和值压缩来减小缓存尺寸是MLA(一种特定的技术或方法)的一个重要创新。
注意力是使大型语言模型能够捕捉长程依赖关系和上下文信息的基本机制。它作为2017年Transformer架构的一部分在《注意力就是你所需要的》(Attention is All You Need)中被引入。随着模型规模的增长,出现了新的变体,解决了多头注意力机制的计算成本问题。
多头潜在注意力(MLA),在Deepseek-V2论文中提出,代表了高效注意力的新方法。MLA引入了低秩压缩技术,减少了内存占用量,同时不影响模型性能。MLA被用于DeepSeek-V3和DeepSeek-R1模型,这些模型可在Vertex Model Garden中获取,并可以部署在Google Kubernetes Engine。
在这篇博客文章中,我们将从标准注意力机制开始,一步步介绍多头注意力的独特之处。
请注意:
为了说明单头注意力机制是如何工作的,可以考虑这个例子。
这只动物没有过马路,因为它太累了,所以。
(Note: The word "所以" is added to enhance the logical flow, making the sentence more coherent, but the sentence structure is kept simple, maintaining the casual tone of the original text.)
我们怎样才能理解‘它’的意思?更准确地说,我们需要观察周围的词汇单元。注意力让我们能够从数学的角度分析这种上下文。
代词“它”的自注意力, (source)
注意力机制由三个组件构成:查询、键和值。我们将查询词(“它”)与句子中的每个键进行匹配。点积衡量两个向量的“相似”程度。点积越高,表示越相关的“注意力”就越多。这在注意力计算中的QKᵀ项中体现出来。为了避免点积过大,会应用一个基于键维度的缩放因子。
我们然后利用这些得分来加权Value向量,这些向量包含了每个键的实际信息。更“相关”的词使查询词更具相关性。这些加权的Value向量就成为了注意力输出:一个上下文相关的“it”词的表示。
注意力简介 (来源)
位置编码在我们继续之前,还有件事要说清楚:位置编码。到目前为止,我们还没有考虑过句子中单词的顺序。没有这些信息,这两个句子就会被看作一样的,因为注意力机制本身并不关心顺序。比如,“穿过街道”和“街道穿过”这两个句子会被认为是一样的。
为了处理这个问题,我们添加了位置编码向量。这些是特殊的向量,告诉注意力机制每个单词在序列中的位置。在《Attention is All you Need》这篇论文中,采用正弦函数的位置编码。这些位置编码使用不同频率的正弦和余弦函数为每个单词生成一个独特的“位置签名”。
位置编码的可视化 (来源:source)
这些位置编码值会在我们计算 Queries、Keys 和 Values 之前添加到输入词的表示形式中。这样一来,注意力机制现在具备了位置感知能力。
尽管Transformer架构的许多部分经过时间的验证依然有效,但现在常用一种新的位置编码技术。Rotary Position Embeddings(RoPE)于2021年在RoFormer架构中引入。RoPE不是简单地添加位置项,而是根据它们的相对位置旋转查询和键向量。这种旋转使模型能够根据单词间的相对位置来理解它们之间的关系。
通过旋转将位置信息嵌入向量的示意图
如果你想深入了解位置编码方法,我推荐这篇Designing Positional Encoding 博客文章。
多头注意力机制到目前为止,我们已经了解了使用一组Query、Key和Value投影的注意力机制。为了捕捉更复杂的关系,我们可以使用多头注意力或MHA。MHA使用多组QKV投影——“Head 1”、“Head 2”、“Head 3”等。每个头专注于单词之间关系的不同方面。例如,一个头可能专注于语法关系,而另一个头则专注于语义关系,如同义词或反义词。每个头计算自己的注意力输出,然后MHA将这些输出拼接,并投影结果向量以获得最终输出。
多头注意力机制计算(参见:来源)
早期标记对应的键值张量保持不变,因此可以缓存以避免重复计算。这可能会成为一个内存瓶颈,从而减慢推理过程,尤其是处理较长文本时。
图示展示了KV缓存随着每个标记的增长而变大
多查询和分组注意力机制幸好,新的方法已经出现,能够解决这个问题,通过减少键值对的数量。
我们先来看看多查询注意力,即MQA。所有查询头部共享一组键值,而不是每个头部有自己的键值。由于KV缓存的大小与每个头部的维度相关,MQA能显著减小缓存大小。
然而,不过,这样做有个权衡。通过共享一个Key和Value,模型的性能会受到影响。Grouped-Query Attention,简称GQA,是一种折中方案。与MQA不同,它不是只共享一个Key和Value,而是使用少量的共享Key和Value集合,称为“组”(groups)。
MHA、MQA和GQA注意力机制的不同版本的概览
简介 MLA最理想的是,我们希望缩小KV缓存的大小而不牺牲性能。这就引入了多头注意力机制(MLA)。
KV 缓存对比(来源链接:来源)
MLA 将键值压缩,将其压缩成一个更小的 低秩 矩阵。在注意力计算过程中,这个压缩后的矩阵会被还原。我们能看到,通过降维矩阵 W-DispositionKeys 和 W-DispositionValues,一个在低维空间中的压缩潜在矩阵是如何得出的。键和值则可以通过 W-DispositionKeys 和 W-DispositionValues 分别升维。
计算压缩后的潜矩阵、键和值
MLA需要一种修改后的方法来处理令牌位置,这种方法被称为解耦RoPE。标准的RoPE直接用位置信息修改压缩后的键和值。MLA的压缩技术使得这种方法变得更复杂,这会妨碍推理效率。相反,使用解耦RoPE,相对位置信息被编码到独立的向量中,然后与压缩后的键和值一起合并,在进行上投影前。这样可以在不干扰压缩/解压缩过程的前提下,有效地应用位置信息。
查询向量(q)和键向量(k)是由它们的压缩部分(C)和位置部分(R)通过拼接形成。
最终,多头隐式注意力提供了更快的推理速度和更小的内存占用。根据Deepseek-V2论文,这种方法在性能上保持甚至提升了与多头注意力相比的表现。将键和值压缩为低秩表示并未丢失太多信息,甚至可能有助于泛化能力。
要尝试使用 MLA,你可以使用 GPU 在多个节点上在 GKE 上部署 DeepSeek-R1 或 DeepSeek-V3 671B,请参阅此指南。你还可以在Vertex 模型花园中部署 DeepSeek。欢迎在[LinkedIn][X][Bluesky]上与我交流,进一步讨论!
共同學習,寫下你的評論
評論加載中...
作者其他優質文章