「DeepSeek-V3 技术解析」:多头潜在注意力机制(MLA)

1、技术背景

为了便于读者更好地理解 MLA 架构并保持本文的完整性,在深入探讨 MLA 的技术细节之前,我们将首先回顾几个相关技术概念。

1.1 Decoder-only Transformers 中的多头注意力机制

有一点需要特别说明,MLA 架构的研发初衷是加快自回归文本生成的推理效率,因此本文讨论的 MHA(多头注意力机制)特指 Decoder-only Transformer 架构。

图 1 对比了三种可用于解码的 Transformer 架构:(a) 展示的是《Attention is All You Need》论文提出的编码器-解码器架构。其解码器部分随后被文献 [6] 简化,形成如 (b) 所示的 decoder-only Transformer 架构,该架构被 GPT 等生成模型广泛采用[8]。

© 则是当前大语言模型更常采用的优化版本,对输入而不是输出进行归一化。并采用 RMS Norm 替代 LayerNorm,本文将以 © 所示架构作为 baseline 架构展开讨论。

请添加图片描述
在这种情况下, MHA 计算大致遵循文献 [6] 中的流程,如下图所示:

请添加图片描述
图 2. 缩放点积注意力与多头注意力架构对比(图源文献[6])假设模型包含 n_h 个注意力头,每个注意力头维度为 d_h,则拼接后总维度为 n_h·d_h。

对于具有 l 层的模型,若设某层第 t 个 token 的输入表示为维度 d 的向量 h_t,则需要通过线性映射矩阵(linear mapping matrices)将 h_t 的维度从 d 映射到(h_n - d_h)。

更形式化地表述如下(公式引用自文献[3]):

请添加图片描述
其中,WQ、WK 和 W^V 是线性映射矩阵:

请添加图片描述
完成映射后,q_t、k_t 和 v_t 将被分割为 n_h 个注意力头进行缩放点积注意力计算:

请添加图片描述
最终通过投影矩阵 W^O 将维度从 (h_n - d_h) 反向映射到 d:

请添加图片描述
需要强调的是,上述公式 (1)-(8) 描述的是单 token 处理流程。在推理过程中,每个新生成的 token 都需要重复这一计算流程,这产生了大量重复计算 —— 这正是催生键值缓存(Key-Value Cache)技术的关键动因。

1.2 Key-Value Cache

正如其名称所示,键值缓存(Key-Value Cache)是一种通过缓存和复用先前计算的键值对(Keys and Values)来加速自回归过程的技术,避免了在每个解码步骤重新计算这些参数的需求。

需要注意的是,键值缓存通常仅在推理阶段使用,因为在训练阶段,我们仍然需要并行处理整个输入序列。

键值缓存通常以滚动缓冲区(rolling buffer)的形式实现。在每个解码步骤中,仅计算新的查询向量 Q(Query),而缓存中存储的 K(Keys)和 V(Values)会被复用,注意力机制将通过新计算的 Q 与复用的 K、V 进行运算。与此同时,新生成的 token 对应的 K 和 V 也会被追加到缓存中以供后续使用。

然而,键值缓存带来的加速是以内存消耗为代价的。由于键值缓存的大小通常与批处理量大小(batch size)× 序列长度(sequence length)× 隐藏层维度(hidden size)× 注意力头数(number of heads)成正比,当出现更大批处理量或更长序列时,极易形成内存瓶颈。

这种限制进一步催生了两项旨在突破该瓶颈的技术:多查询注意力机制(Multi-Query Attention)和分组查询注意力机制(Grouped-Query Attention)。

1.3 多查询注意力机制(MQA) vs 分组查询注意力机制(GQA)

下图展示了原始的多头注意力机制(MHA)、分组查询注意力机制(GQA)[10] 和多查询注意力机制(MQA)[9] 的对比。

请添加图片描述
MQA 的核心思想是让所有查询头(query heads)共享一个单独的键头(key head)和值头(value head)。这种做法能显著降低内存占用,但也会对注意力的计算精度产生负面影响。

GQA 可视为 MHA 与 MQA 的一种折中方案。在这种方法中,一组查询头仅共享一对键头和值头,而非所有查询头共享同一对。尽管如此,相较于原始的 MHA,其效果仍会有所逊色。

在后续章节中,我们将探讨 MLA 如何在内存效率与建模精度之间实现平衡。

1.4 旋转位置编码(RoPE)

最后需要提及的相关背景知识是旋转位置编码(RoPE)[11]。该方法通过在多头注意力机制中对查询向量(Query)和键向量(Key)施加基于正弦函数的旋转操作,将位置信息直接编码到注意力计算中。

具体而言,RoPE 会对每个词元(token)的查询向量和键向量应用一个与位置相关的旋转矩阵。该矩阵以正弦和余弦函数为基础,但以一种独特的方式应用它们来实现旋转。

为理解其“位置相关(position-dependent)”特性,我们以一个 4 维的嵌入向量(x₁, x₂, x₃, x₄)为例。

要应用 RoPE,首先需要将连续的维度两两配对:

  • (x₁, x₂) → 位置1
  • (x₃, x₄) → 位置2

然后,对其中的每一对应用旋转矩阵:

请添加图片描述

其中旋转角度 θ = θ§ = p ⋅ θ₀(θ₀为基频参数)。在此示例中,(x₁, x₂) 会被旋转 θ₀ 角度,而 (x₃, x₄) 则被旋转 2 · θ₀ 角度。

因此,我们称这种旋转矩阵为“位置相关(position-dependent)”:在每个位置(或每对),将应用不同的旋转矩阵,其中旋转角度由位置决定。

RoPE 因其在长序列编码中的高效性被现代大语言模型广泛采用。然而,从上述公式可见,该方法对查询向量和键向量的位置敏感性,使其在部分场景下与 MLA 机制不兼容。

2、Multi-head Latent Attention

最后我们终于可以进入 MLA 部分的讲解。在这一章节中,我们将首先阐述 MLA 的核心设计思想,然后深入探讨其为何需要修改 RoPE,最后展示 MLA 的具体算法实现及其性能表现。

2.1 MLA:核心设计思想

MLA 的核心设计思想是将注意力机制的输入 h_t 压缩为一个低维的潜在向量(维度 d_c,且 d_c 远小于原始维度(h_n·d_h))。当需要计算注意力时,我们可以将这个潜在向量重新映射回高维空间,以还原键向量和值向量。通过这种方式,只需存储潜在向量即可,从而实现显存占用的大幅降低。

这个过程可以通过以下公式更正式地进行描述。其中 c^{KV}_t 表示潜在向量,W^{DKV} 是压缩矩阵(上标 D 代表"下投影",即降维操作),负责将 h_t 的维度从(h_n·d_h)压缩到d_c;而 W^{UK} 和 W^{UV} 则是上投影矩阵,负责将共享的潜在向量映射回高维空间。

请添加图片描述
类似地,我们也可以将查询向量映射到一个潜在的低维向量,然后再将其映射回原始的高维空间:

请添加图片描述

2.2 为何需要解耦式 RoPE

正如前文所述,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} 之间。

正如技术背景部分所述,这个旋转矩阵是位置相关(position-dependent)的,即每个位置对应的旋转矩阵都不同。因此,W^{UK} 无法再被 W^Q 吸收。

为解决这一矛盾,作者提出了“解耦式RoPE”方案:通过引入额外的查询向量和一个共享的键向量,并仅在 RoPE 过程中使用这些新增向量,同时保持原始键向量与旋转矩阵的隔离。

完整的 MLA 流程可总结如下(公式编号沿用文献 [3] 附录 C 的编排):

请添加图片描述

其中:

  • 公式 (37)-(40) 描述查询向量的处理流程
  • 公式 (41)-(42) 描述键向量的处理流程
  • 公式 (43)-(44) 说明如何将新增的共享键向量用于 RoPE,需注意公式 (42) 的输出不参与 RoPE 计算
  • 公式 (45) 描述值向量的处理流程

在此过程中,仅需缓存蓝色变量。该流程可通过下图更直观地展示:

请添加图片描述

2.3 MLA 的性能表现

下表对比了 MHA、GQA、MQA 与 MLA 在 KV 缓存(每个 token)所需元素数量及建模能力上的差异,证明 MLA 确实能在显存效率与建模能力间实现更优平衡。

有趣的是,MLA 的建模能力甚至超越了原始 MHA 架构。

请添加图片描述
下表展示了 7B 参数规模下 MHA、GQA 与 MQA 的性能表现,其中 MHA 显著优于 MQA 和 GQA。

请添加图片描述
文献 [3] 的作者还对 MHA 与 MLA 进行了对比分析,结果如下表所示。数据显示 MLA 在整体指标上表现更优。

请添加图片描述

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

img

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

img

### 多头潜在注意力机制 (MLA) 和传统注意力机制的区别 在深度学习领域,多头潜在注意力机制(Multi-Head Latent Attention, MLA)[^1] 是一种改进型的注意力模型设计方法。与传统的单头或多头注意力机制不同的是,在MLA中引入了隐含空间的概念来捕捉更复杂的特征表示。 #### 隐含空间建模能力增强 MLA通过构建多个独立工作的潜藏向量路径实现并行处理,并允许各个子模块专注于输入序列的不同方面或模式。这种结构使得网络能够更好地理解数据内部复杂关系以及上下文依赖性[^2]。 ```python import torch.nn as nn class MultiHeadLatentAttention(nn.Module): def __init__(self, d_model, num_heads=8): super().__init__() self.d_k = d_model // num_heads self.num_heads = num_heads # 定义线性变换层用于创建查询、键和值矩阵 self.q_linear = nn.Linear(d_model, d_model) self.v_linear = nn.Linear(d_model, d_model) # 初始化权重参数... def forward(self, query, key, value): batch_size = query.size(0) # 对Q,K,V做线性变化后再拆分成num_heads份 q = self.q_linear(query).view(batch_size, -1, self.num_heads, self.d_k) v = self.v_linear(value).view(batch_size, -1, self.num_heads, self.d_k) # 继续完成后续计算... ``` #### 参数效率提升 相比于标准版本中的每一个head都需要单独设置一组完整的Wq,Wk,Wv转换矩阵;而在MLA里,则共享部分基础组件以减少冗余度并提高训练过程中的泛化性能[^3]。 #### 计算资源优化分配 由于采用了更加灵活高效的架构设计理念,MLA可以在不显著增加额外开销的情况下获得更好的表达能力和更快收敛速度。这有助于解决大规模语料库上预训练模型所面临的挑战之一——即如何平衡好精度同效率间的关系问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值