本文译自2025年1月Epoch AI的文章。作者Ege Erdil是该机构研究员。
DeepSeek去年底发布了DeepSeek v3,在开放权重模型中在基准性能方面处于最先进水平。令人惊讶的是,他们仅用了280万H800小时的硬件训练时间就达到了这一最先进(SOTA, State Of The Arts)性能——40%的模型算力利用率(MFU, Model FLOPs Utilization),这相当于大约4e24 FLOP。比同样表现的Llama 3.1 405B的训练计算量少了约十倍。
在本文中,将介绍DeepSeek在其报告中强调的一些重要架构改进,以及为什么我们应该期待它们在性能上优于标准Transformer。完整的论文还包含大量非架构细节,我强烈建议阅读它,以便更好地了解在协调中等规模训练时必须解决的工程问题。
图 1:DeepSeek v3架构及其两个最重要的改进:DeepSeekMoE和多头潜在注意力(MLA, Multi-head Latent Attention)
一、多头潜在注意力(MLA)
MLA是DeepSeek模型在长上下文推理中的最重要架构创新。该技术首次在DeepSeek v2中引入,是一种比传统方法(如分组查询和多查询注意力)更优越的减少KV缓存大小的方法。
1、什么是KV缓存,为何重要?
当Transformer在推理过程中顺序生成token时,它需要查看所有历史token的上下文,以决定下一个输出的token。实现这一点的简单方法是每次想要生成新token时,进行一次包含所有历史token的前向传播,但这样效率低下,因为那些历史的token已经被处理过。只是在重新计算之前已经获得并丢弃的结果。
为避免重复计算,高效的做法是缓存Transformer模型所有历史token的相关内部状态,当需要处理后续token时直接从该缓存中检索结果。由于历史token对未来token的影响仅通过注意力机制中的键向量和值向量实现,因此仅需缓存这些向量即可。这正是键值缓存(Key-Value Cache,简称KV缓存)名称的由来。
当上下文长度较短时,这种方法效果很好,但当长度变长时可能会增加开销。这是因为缓存读取并不是免费的:需要将所有这些向量保存在GPU高带宽内存(HBM, High Bandwidth Memory)中,然后在需要参与计算时将它们加载到张量核心。若每个token均需知晓其全部历史上下文,这意味着生成每个新token时都必须从HBM读取完整的过往KV缓存。
在使用多头注意力机制的标准Transformer中,每个历史token的KV缓存参数量可以表示为:
2 * 注意力头维度 * 注意力头数量 * Transformer块数量
例如,GPT-3有96个注意力头,每个头有128个维度和96个块,因此对于每个token,就需要一个2.36M参数的KV缓存,当每个KV缓存参数精度为2字节的情况下为4.7MB。
GPT-3不支持长上下文窗口,如暂时假设它支持,那么在100K上下文长度下生成的每个额外token将需要470 GB的内存读取,或者在H100的HBM带宽为3.3 TB/s的情况下大约需要140毫秒的H100时间。每百万个token生成的价格为每小时2美元/H100,那么价格将是80美元,约为Claude 3.5 Sonnet价格的5倍(这可能远高于其对Anthropic自身的成本)。这种简单的成本可以通过例如投机采样来降低,但它提供了一个合理的粗略估计。
这个粗略计算显示了为什么在处理100K或更长的上下文时,找到减少KV缓存大小的方法至关重要。到目前为止,开源模型中最流行的方法是分组查询注意力——在这种架构设置中,将多个查询头分配给每对键值头,有效地将查询头分组在一起。在像Llama 3.3 70B和Mistral Large 2这样的模型中,分组查询注意力将KV缓存大小减少约一个数量级。
2、 打破分组查询注意力
像分组查询注意力或KV缓存量化等方法的根本问题在于,它们为了减少KV缓存的大小而向模型质量妥协。而DeepSeek找到了一种方法,可以在不妥协质量的情况下减少KV缓存的大小,至少在他们的内部实验中是这样。
他们通过将残差流中键值向量的计算拆分成两步过程来实现这一点。在标准Transformer中,键向量和值向量是通过残差流向量直接与形状为(头数·头维度 × 模型维度)的权重矩阵相乘得到的。
DeepSeek的方法本质上通过强制矩阵低秩分解实现优化:选取潜在维度并将其表示为两个矩阵的乘积,一个是(潜在维度 × 模型维度)的矩阵;另一个是(头数·头维度 × 潜在维度)的矩阵。在推理过程中,只缓存潜在向量而非完整键值向量。通过缩小潜在维度,即可实现KV缓存的按比例缩减。
图 2:DeepSeek v2论文中多头潜在注意力示意图
表面看来,这似乎无法解决根本问题,因为每次生成新token时仍需重新计算实际的键值向量。毕竟,注意力机制需要完整向量而非其潜在表示才能正常工作。MLA的巧妙在于:通过将潜在向量升维重构键值向量的矩阵乘法,分别与查询投影及后注意力投影进行融合。
融合之所以如此有效,是因为不同注意力头需要了解的信息之间存在冗余,可以进行压缩。压缩操作单独作用于每个注意力头的键值向量(而非所有头的整体键值叠加),该方法等同于直接使用更小的注意力头维度,无法获得任何优化收益。MLA的核心创新点在于:充分利用不同注意力头对相同基础信息的需求特征——通过共享潜在表征实现跨头参数压缩。
反观分组查询注意力,也利用了相同的重叠特性,但效果并不好,因为它们会迫使分组在一起的注意力头都对查询做出类似的反应。换句话说,信息共享机制与某种受限条件下的行为同质化相绑定。
需要对注意力头的作用有很好的理解才能提出这个优化。一旦你看到这种方法,立刻就会明白它不可能比分组查询注意力更糟,而且很可能会显著更好。
3、混合专家创新
业界对标准Transformer的改进之一是引入了混合专家(MoE, Mixture-Of-Experts)模型。该模型将Transformer的前馈块划分为多个不同的专家,并添加了一种路由机制,根据上下文将每个token发送到部分专家。这样模型可以拥有比每个特定token激活的更多参数,从某种意义上说,将模型的知识量与处理单个token的算力成本解耦。目前已知的最具影响力的MoE模型是GPT-4。
专家路由算法的工作原理:当数据流经任意层的注意力块后,将输出残差流向量。每个专家对应一个同维度的专家向量,路由决策通过计算当前残差流向量与各专家向量的内积来实现——选取内积值最高的那些专家进行激活。
其设计缺陷在于:核心引入了具有离散映射的不连续函数,与标准Transformer模型实现的连续输入输出关系形成鲜明反差。这种结构特性导致梯度下降优化在MoE模型训练中表现欠佳,常发生"路由崩溃"现象——模型总是激活同样几个专家来处理每个token,而非在可用专家网络中均衡分配知识处理与计算资源。
为了理解路由崩溃概念,考虑尝试训练一个模型,如共有16个专家的GPT-4,每个token激活两个专家。现在,假设由于随机初始化的原因,这两个专家恰好是开始时表现最好的专家。梯度下降有加强选择这些专家的倾向。这意味着在梯度更新过程中,这些专家几乎会获得更好的梯度信号,而其他专家则滞后,因此其他专家将继续不被选择,产生一个正反馈循环,导致其他专家永不会被选择或训练。
问题在于梯度下降只是朝着局部最优的方向前进。这在神经网络训练常见的高维优化场景中通常表现良好。然而,当网络行为具有高度不连续性时(如MoE路由决策的离散跳变特性),即便参数空间维度极高,也难以确保优化过程的有效性。
解决这些训练困难并非易事。DeepSeek v3通过结合几种不同的创新来实现这一点,下面逐一讨论。
4、无辅助损失的负载均衡
避免路由崩溃的主流方法是强制“平衡路由”,即每个专家在足够大的批次中大致被激活相同次数,通过向训练损失中添加一个测量特定批次中专家路由不平衡程度的项来实现。这个项被称为“辅助损失”,引入它使模型朝向平衡路由的方向发展。然而,DeepSeek v3论文指出,这确保了路由平衡,却又损害模型性能。
他们的替代方案是向路由机制添加特定专家的偏置项。这些偏置项不是通过梯度下降更新的,而是在训练过程中进行调整,以确保负载平衡:如果某个特定专家的命中率没有达到认为的水平,那么可以在每个梯度步骤中将其偏置项略微增加一个固定的数值,直到它达到预期。论文指出,这种方法的性能优于依赖辅助损失,同时仍能确保适当的负载平衡。
5、共享专家
上述解决路由崩溃方法又引入了新问题,即在没有任何理由的情况下假设一个经过最佳训练的MoE会具有平衡的路由是可疑。
原因在于任何LLM只有少量信息被频繁使用,而有大量信息很少使用。例如,几乎任何对LLM的英语请求都要求模型知道如何说英语,但几乎没有人对LLM提出1510年法国国王是谁的问题。因此,最优的MoE很可能应该有一些专家被频繁访问并存储“常见信息”,同时还有一些专家被稀疏访问并存储“专业信息”。
如果强制平衡路由,就失去了实现上述路由设置的能力,并且不得不在专家间冗余地复制信息。但如果不强制平衡路由,又面临路由崩溃的风险。为了摆脱这个困境,DeepSeek将专家分为两类:共享专家和路由专家。共享专家无论如何总是被路由:它们在任何可能的路由不平衡损失项中都被排除在外。进而就只关注确保路由专家的平衡路由了。
“路由崩溃”是一种极端情况,在这种情况下,每个单独专家被选择的可能性要么是1,要么是0。简单的负载平衡通过试图将分布推向均匀来解决这个问题,即每个专家应该有相同的被选择机会。然而,如果我们唯一关心的是避免路由崩溃,那么就没有理由特别针对均匀分布。DeepSeek v3设计了一种分布,其中每个专家要么肯定被选择(概率为1),要么对于每个token以某个固定概率p > 0被选择。
我认为即使这个分布也可能不是最优的,选择更好的分布会产生更好的MoE模型,但这已经比强制使用均匀分布有了显著改善。
二、多token预测
DeepSeek v3对标准Transformer的重大改动是在模型的每次前向传播中预测多个token。这使得模型在训练期间使用多token预测目标,而不是严格的进行下一个token预测,他们在消融实验中展示了这一变化带来的性能提升。
基本思想是:首先进行一次常规前向传播以进行下一个token的预测。与标准Transformer一样,通过解嵌入(unembedding)和softmax生成下一个token的概率,将最终残差流向量转换为下一token概率分布。然而,与标准Transformer不同,还将这个向量输入到后续的Transformer块中,并使用该块的输出预测第二个后续token。可以根据需要进行多次迭代,尽管DeepSeek v3在训练期间只预测两个token。
图 3:DeepSeek v3论文中多token预测设置示意图
通过在训练损失中添加一个额外的交叉熵项,对更远处token的预测纳入训练目标,权重可以作为超参数进行调节。这种设计不仅为模型训练提供了额外的梯度信号源,更重要的是赋予了模型自我推测解码(Speculative Decoding)的能力。具体而言,可在单次前向传播中批量生成多个候选token,随后通过模型自验证机制判断需从哪个点开始拒绝生成的延续序列。
DeepSeek v3的多token预测仅到第二个后续token,论文中表示第二个后续token预测的接受率在85%到90%之间。这相当棒,如果使用这些推测解码设置,应该可以将推理速度提高近一倍(以每秒每用户token为单位)而成本不变。
令人好奇的是,如果预测的范围超过第二个后续token会怎样。如果每个后续token可以带来15%的相对接受度降低,那么通过预测更多的token,可能可以从这种投机解码设置中挤出更多的收益。
三、结束语
我认为DeepSeek v3所做的许多改进在“事后看来是显而易见的”:这并不意味着一开始就容易想出这些想法。
我听到很多人表达这样的观点:DeepSeek团队在研究方面“品味很好”。仅仅基于这些架构改进,我认为评价是正确的。这些改进并不是通过对可能的想法进行蛮干而发现的;相反,是由于理解Transformer如何工作以及如何解决其各种缺陷的研究人员精心设计的。
如果让我猜测类似的改进还能从哪里下手,计算资源可能是一个不错的目标。现在Transformer在处理或预测任何token时,每个token所消耗的计算量都是相同的。在直观上是低效的:如果模型在做一个更难的预测,它应该多思考,而在做一个更简单的预测时则应该少思考。在某种程度上,可通过可变的测试时间计算缩放纳入推理设置,但我认为也应该有一种方法将其直接纳入基础模型的架构中。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
第一阶段(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 的正确特征了。