使用ChatGPT生成的图片(由作者创作)。
这是我们新系列文章“DeepSeek-V3 解析”中的第一篇文章,在这里我们将尝试为您解释 DeepSeek-V3 [1, 2],这是 DeepSeek 最新开放源代码的模型 DeepSeek-V3。
在这个系列中,我们将讨论两个主要主题。
- DeepSeek-V3 中的重大架构创新,包括 MLA(多头潜在注意力)[3]、DeepSeekMoE [4]、无辅助损失的负载均衡 [5] 以及多令牌预测。
- DeepSeek-V3 的训练流程,包括预训练、微调和强化学习对齐。
这篇文章主要讨论的是多头注意力机制,该机制首先在DeepSeek-V2的开发中提出,随后也在DeepSeek-V3中得到了应用。
目录:
- 背景信息:我们从标准的MHA开始,解释为什么在推理阶段需要使用键值缓存,以及MQA和GQA如何优化,RoPE的工作原理等。
- 多头隐注意力机制:对MLA进行深入介绍,包括其动机、解耦RoPE的必要性及其性能。
- 参考资料。
为了更好地理解MLA并让这篇文章自成一体,我们将在这一部分重新审视一些相关概念,然后再来详细了解MLA的相关细节。
Transformer中的仅解码器MHA请注意,MLA是为了加快自回归文本生成过程的推理过程的速度而开发的,这里的MHA指的是仅在解码器端的Transformer。
下面的图表比较了三种在解码时使用的Transformer架构,其中(a)展示了原始论文“Attention Is All You Need”中提出的编码器和解码器。随后,[6] 对其解码器部分进行了简化,从而得到仅包含解码器的Transformer模型,如(b)所示。此模型后来被许多生成模型,如GPT [8] 等使用。
如今,大语言模型更常选择如(c)所示的结构来实现更稳定的训练,归一化操作是在输入端进行的,而不是在输出端,并将LayerNorm(层归一化)升级为RMS Norm(均方根归一化)。这将作为我们在本文中讨论的基础架构。
图1. Transformer架构图。(a)[6]中提出的编码器-解码器模型。(b)[7]中提出的仅解码器的Transformer模型,在GPT [8]中使用。(c)在注意力层前增加RMS归一化的(b)的优化版本。
在此背景下,MHA的计算过程基本上按照文献[6]中的方法进行,如下图所示:
图2展示了缩放点积注意力机制和多头注意力机制的区别。图片来自参考[6]。
我们假设存在n_h个注意力头,每个的维度是d_h,这样拼接后的维度就是(n_h·d_h)。
给定一个具有l层的模型,如果我们把该层第t个token的输入表示为h_t,其维度是d,我们需要通过线性映射矩阵将h_t的维度从d映射到(h_n×d_h)。
更正式地讲,我们有(如下方程式来自[3]):
其中 W^Q、W^K 和 W^V 是线性映射矩阵。
经过这样的映射,q_t,k_t 和 v_t 将拆分,以计算缩放点积注意力机制:
W^O 是用来把 (h_n · d_h) 这个维度逆向映射回 d 的投影矩阵:
请注意,以下方程(1)到(8)描述的过程仅针对单个令牌。在进行推理时,我们需要为每个新生成的令牌重复此过程,这会产生大量的重复计算。这导致了一种称为键值缓存技术的方法。
键值缓存区正如其名,键值缓存技术是一种通过缓存和重用之前的键值,而不是在每一步解码中重新计算这些键值,来加快自回归流程的技术。
注意,KV(键值)缓存通常仅用于推理阶段,因为在训练阶段,我们仍需并行处理完整的输入序列。
KV缓存通常实现为一个滚动缓存。在每个解码步骤中,只需计算新的查询Q,而缓存中的K和V会被重复使用,这样注意力计算就会使用新的Q和之前的K、V。同时,新词的K和V也会被添加到缓存中供后续使用。
然而,通过KV缓存实现的加速需要占用更多内存,因为KV缓存通常按 批量大小 × 序列长度 × 隐藏维度 × 头的数量 增长,当批量较大或序列较长时,会导致内存瓶颈。
这进一步引出了两种旨在解决这一限制问题的技术:多查询注意机制和分组查询注意机制等方法。
MQA vs GQA,这两个术语分别指的是多查询注意力机制和分组查询注意力机制。下图对比了原始的MHA、分组查询注意力机制(GQA)[10]和多查询注意力机制(MQA)[9]。
图3. MHA [6],GQA [10] 和 MQA [9]。图片引自 [10]。
MQA的基本理念是让所有查询头共享同一个密钥和值头,这可以显著降低内存使用量,但也会在注意力准确性方面带来影响。
GQA可以被视为一种介于MHA和MQA之间的插值方法,其中一组查询头共享一对键值头,而不是由所有查询共享。但这种方法的效果仍然会比MHA差。
在后面的章节中,我们将看到MLA是如何做到在内存利用率和模型准确性之间找到平衡点的。
RoPE (旋转位置编码)最后要提到的一点背景信息是RoPE(旋转位置编码)[11],它通过在多头注意力中的查询和键向量上使用正弦函数进行旋转,从而将位置信息编码进注意力机制,从而将位置信息编码进注意力机制。
更具体地说,RoPE对每个标记的查询和键向量应用了一个位置相关的旋转矩阵,虽然使用正弦和余弦作为基础,但通过独特的方式应用它们。
为了看看它为什么依赖位置,考虑一个简化了的嵌入向量,例如 (x_1, x_2, x_3, x_4)。
要使用RoPE,首先我们将连续的维度配对。
- 例如:(x_1, x_2) -> 位置1:
- 例如:(x_3, x_4) -> 位置2:
接着,我们使用旋转矩阵对每一对进行旋转。
图4. 旋转矩阵施加于一对标记的说明。作者提供。
其中 θ = θ(p) = p ⋅ θ_0,θ_0 是一个 基本频率。在我们的 4 维例子中,这表示 (x_1, x_2) 将旋转 θ_0,(x_3, x_4) 将旋转 2 ⋅ θ_0。
这就是为什么我们将这种旋转矩阵称为位置相关的:在每个位置(或每对),我们将使用不同的旋转矩阵,旋转角度会根据位置变化。
RoPE 在现代大型语言模型中被广泛使用,因为在编码长序列时效率很高,如上公式所示,它对 Q 和 K 都是对位置敏感的,这使得它在某些方面与 MLA 不兼容。
多头注意力机制终于我们可以进入到MLA部分了。在这节中,我们将首先阐述MLA的高层次概念,然后更深入探讨为什么它需要修改RoPE。最后,我们将展示MLA的详细算法以及它的表现。
MLA:高层次的想法MLA的基本思想是将注意力输入h_t压缩成一个低维度的潜在向量,其维度为d_c,其中d_c远低于原始高维空间(h_n·d_h)。在需要计算注意力时,可以将这个潜在向量重新映射回高维空间,从而恢复键和值。因此,只需存储潜在向量,从而大大节省了内存。
这一过程可以用以下方程更正式地描述,其中c^{KV}_t是潜在向量,W^{DKV}是压缩矩阵,将h_t的维度从(h_n · d_h)压缩到维度d_c(这里的上标D表示“降维”,意味着压缩维度),而W^{UK}和W^{UV}是升维矩阵,将这个共享的潜在向量映射回原来的高维空间。
同样,我们也可以这样做:将查询映射到低维潜在向量,然后再映射回原来的高维空间中。
正如我们之前提到的,RoPE 是训练生成模型来处理长序列时常用的策略。如果我们直接应用上述 MLA 方法,那将与 RoPE 不兼容,无法直接应用。
要更清楚地看出这一点,考虑使用公式(7)计算注意力时会发生什么:当我们把转置后的q和k相乘时,矩阵W^Q和W^{UK}会出现在中间位置,它们的组合相当于从d_c到d的一个映射过程。
在原论文 [3] 中,作者们描述为 W^{UK} 可以被“合并”到 W^Q 中,不需要将 W^{UK} 存储在缓存中,从而进一步降低了内存占用。
然而,当我们考虑图(4)中的旋转矩阵时,情况将不会如此,因为RoPE会在W^{UK}左侧应用一个旋转矩阵,这个旋转矩阵最终会位于转置后的W^Q和W^{UK}之间。
正如我们在背景部分所解释的,这个旋转矩阵是位置相关的,意味着每个位置的旋转矩阵都不同。因此,W^{UK} 无法被 W^Q吸收。
为了解决这一冲突,作者们提出他们所谓的“解耦的RoPE”,即引入额外的查询向量和一个共享的键向量,并在RoPE过程中仅用这些额外的向量,而让原有的键向量不参与旋转矩阵的运算。
MLA的整个过程可以总结如下:方程式编号沿用附录C中的[3],流程如下。
图5. MLA流程,图片由作者根据[3]中的公式编辑。
哪里
- 式 (37) 到 (40) 描述了如何处理查询令牌。
- 式 (41) 和 (42) 描述了如何处理键令牌(密钥令牌)。
- 式 (43) 和 (44) 描述了如何使用额外的共享键进行 RoPE,需要注意的是,(42) 的输出不参与 RoPE 操作。
- 式 (45) 描述了如何处理值令牌。
在这个过程中,只有带有方框的蓝色变量需要缓存。下面的流程图可以更清楚地说明这个过程。
图6. MLA的流程图。图片来源:[3]。
MLA的性能
下表比较了每个令牌所需的KV缓存元素数量以及MHA、GQA、MQA和MLA之间的模型容量,这表明MLA确实可以在内存效率和模型容量之间取得更好的平衡。
有意思的是,MLA的建模能力甚至比原来的MHA模型更强。
1见于参考文献[3]。
更具体地说,如下表所示,MHA、GQA和MQA在7B规模的模型中的性能,其中,MHA的表现明显优于MQA和GQA。
参见表8 [3]。
[3]的作者还对MHA和MLA进行了比较分析,结果如下表所示,MLA的整体结果更好。
参考文献[3]中的表9,
参考文献- [1] DeepSeek
- [2] DeepSeek-V3 技术报告
- [3] DeepSeek-V2:一种强大、经济且高效的专家混合语言模型
- [4] DeepSeekMoE:朝向极致专家专长的混合专家语言模型
- [5] 无辅助损失的混合专家负载均衡策略
- [6] 注意力就是一切
- [7] 通过长序列摘要生成维基百科
- [8] 通过生成预训练提升语言理解
- [9] 快速Transformer解码:一个写头就已经足够了
- [10] GQA:从多头检查点训练通用多查询Transformer模型
- [11] RoFormer:带有旋转位置嵌入的增强Transformer
共同学习,写下你的评论
评论加载中...
作者其他优质文章