第一部分 从DeepSeek LLM、DeepSeekMoE到DeepSeekMath

友情提醒,如不需要透彻深入理解,或者想直接看DeepSeek-V2的,可以直接跳到本文的第二部分,本文第二部分也是本文的最精华所在。

当然,如果你就是想先从本第一部分 开始看则非常好,但里面的数学公式比较多,喜欢抠公式的可以细抠,不喜欢抠公式的则不用抠太细,不影响对DeepSeek-V2的整体理解。

Image

第二部分 DeepSeek-V2:提出多头潜在注意力MLA且改进MoE

DeepSeek-V2属于DeepSeek的第二代版本,参数规模虽然达到了庞大的236B,但由于其MoE的结构,使得其中每个token激活仅21B的参数,且支持128K的上下文(It is equipped with a total of 236B parameters, of which 21B are activated for each token, and supports a context length of 128K tokens)

Image其对应论文为《DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model》,发布于24年5.7日。

  1. 他们首先在完整的预训练语料库上预训练DeepSeek-V2。
  2. 然后,收集了150万个对话会话,涵盖了数学、代码、写作、推理、安全等各个领域,以对DeepSeek-V2 Chat(SFT)进行监督微调(SFT)。
  3. 最后,他们遵循DeepSeekMath的方法,采用组相对策略优化(GRPO)进一步使模型与人类偏好对齐,并生成DeepSeek-V2 Chat(RL)。

DeepSeek-V2主要有两大创新点,其在Transformer架构「一个注意力模块和一个前馈网络(FFN),如对transformer还不够熟练,请看此文:Transformer通俗笔记:从Word2Vec、Seq2Seq逐步理解到GPT、BERT」的基础上

1. 改造注意力模块

其通过创造性的提出多头潜在注意力:Multi-head Latent Attention(简称MLA),替代传统多头注意力(Multi Head Attention) 。

具体而言,MLA利用低秩键值联合压缩(low-rank key-value joint compression)来降低推理时的KV Cache开销——相当于low-rank joint compression for keys and values to reduce KV cache,且性能不输于MHA(论文中说的是性能比MHA还更好) 。

我个人认为,MLA本质上也是受到了LoRA和Stable Diffusion的启发「前者详见此文《LLM高效参数微调方法:从Prefix Tuning、Prompt Tuning、P-Tuning V1/V2到LoRA、QLoRA(含对模型量化的解释)》,后者详见此文《AI绘画原理解析:从CLIP、BLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion(含ControlNet详解)》」

所以MLA 是多头潜在注意力,在多头注意力上 加上了低秩KV压缩。

2. 改造FFN

其把FFN的结构改成DeepseekMoE——是对传统MoE结构的改进(下图各种结构、表示很多,初看难以一看就懂,没事,下文会逐一详解,任何一个符号都不会放过——最后,反复琢磨之后,你也可以和我一样:脱离本文,手绘下图、手推下图背后的公式) 。Image

值得一提的是,他们还一块发布了 DeepSeek-V2-Lite,相当于配备 MLA 和 DeepSeekMoE 的较小模型,它总共有15.7B参数,其中每个token激活2.4B参数(we also release DeepSeek-V2-Lite, a smaller model equipped with MLA and DeepSeekMoE, for the open-source community. It has a total of 15.7B parameters, where 2.4B are activated for each token)

DeepSeek-V2-Lite 有 27 层,隐藏维度为 2048。它还采用 MLA,并具有 16 个注意力头,每个头的维度为 128 。

其 KV 压缩维度为 512,但与 DeepSeek-V2 略有不同,它不压缩查询。

对于解耦查询和键,每头维度为 64。

DeepSeek-V2-Lite 还采用 DeepSeekMoE,除了第一层外,所有前馈神经网络 (FFNs) 都被 MoE 层替换 每个 MoE 层由 2 个共享专家和 64 个路由专家组成,每个专家的中间隐藏维度为 1408。在这些路由专家中,每个token将激活6个专家。

DeepSeek-V2-Lite 也在与 DeepSeek-V2 相同的预训练语料库上从头开始训练,该语料库未被任何 SFT 数据污染。

它使用 AdamW 优化器,超参数设置为 𝛽1 = 0.9, 𝛽2 =0.95,权重衰减 =0.1。

学习率使用预热和阶梯衰减策略进行调度最初,在前2000步期间,学习率从0线性增加到最大值。

随后,在训练了大约80%的tokens后,学习率乘以0.316,并在训练了大约90%的tokens后再次乘以0.316。

最大学习率设置为4.2 × 10−4,梯度裁剪范数设置为1.0 没有采用批量大小调度策略,而是以恒定的批量大小4608个序列进行训练 在预训练期间,将最大序列长度设置为4K,并在5.7T tokens上训练DeepSeek-V2-Lite。

2.1 DeepSeek-V2提出MLA的背景与作用

2.1.1 KV Cache所导致的显存消耗大,需要尽可能降低

众所周知,KV Cache是大模型标配的推理加速功能——也是推理过程中,显存资源巨大开销的元凶之一。如下图所示,在模型推理时,KV Cache在显存占用量可达30%以上。

Image

目前大部分针对KV Cache的优化工作:

  1. 比如著名的vLLM「这是其介绍页面、这是其对应的GitHub、其论文则为:Efficient Memory Management for Large Language Model Serving with PagedAttention,当然了,我也写了一篇专门介绍vLLM的博客,详见《一文通透vLLM与其核心技术PagedAttention:减少KV Cache碎片、提高GPU显存利用率(推理加速利器)》」,其基于paged Attention,最大限度地利用碎片化显存空间,从而提升了空间利用率。

  2. 再比如GQA、MQA。

GQA是query数不变,但多个query(比如2个)组成一个group以共享一个key value MQA则query也不变,但所有query(比如8个)共享一个key、一个value Image

至于更多,详见此文:一文通透各种注意力:从多头注意力MHA到分组查询注意力GQA、多查询注意力MQA。

这些方案的问题是什么呢?在于:

  • 第一类方案并没有从根本上改变KV Cache占用空间巨大的问题。
  • 而第二类方案中的MQA虽然较大降低了KV cache计算量,但性能相比MHA下降太多了 至于第二类方案中的GQA则取了个折中:不好的是缓存下降的不够多、好的是相比MHA性能没有下降太多,毕竟我们追求的是缓存下降、性能不降。

那KV Cache到底是什呢?

\1. 对此,我们先来回顾下transformer当中的注意力计算公式:

Image

  1. GPT预测下一个token时,其只能看到待预测token之前的所有token,故在最终生成Q1,Q2,Q3,Q4整个序列的过程中,会涉及到如下计算过程:

Image

  1. 然后把上面的softmax结果和对应的V值一相乘,便可得到:

\begin{array}{l} \operatorname{Att}_{1}(Q, K, V)=\operatorname{softmaxed}\left(Q_{1} K_{1}^{T}\right) \overrightarrow{V_{1}} \ \operatorname{Att}_{2}(Q, K, V)=\operatorname{softmaxed}\left(Q_{2} K_{1}^{T}\right) \overrightarrow{V_{1}}+\operatorname{softmaxed}\left(Q_{2} K_{2}^{T}\right) \overrightarrow{V_{2}} \ \operatorname{Att}_{3}(Q, K, V)=\operatorname{softmaxed}\left(Q_{3} K_{1}^{T}\right) \overrightarrow{V_{1}}+\operatorname{softmaxed}\left(Q_{3} K_{2}^{T}\right) \overrightarrow{V_{2}} + \operatorname{softmaxed}\left(Q_{3} K_{3}^{T}\right) \overrightarrow{V_{3}} \ \operatorname{Att}_{4}(Q, K, V)=\operatorname{softmaxed}\left(Q_{4} K_{1}^{T}\right) \overrightarrow{V_{1}}+\operatorname{softmaxed}\left(Q_{4} K_{2}^{T}\right) \overrightarrow{V_{2}} + \operatorname{softmaxed}\left(Q_{3} K_{3}^{T}\right) \overrightarrow{V_{3}} + \operatorname{softmaxed}\left(Q_{4} K_{4}^{T}\right) \overrightarrow{V_{4}} \end{array}

可以很明显的看到,上述计算过程中,有不少的KV重复计算,比如:

Image

上面这句话值得反复品味三遍!

如果序列长度越长,类似这样的KV重复计算会越多,从而势必将白白消耗那么大的显存,所以才说需要降低这种KV重复计算

2.1.2 Multi-head Latent Attent:致力于在推理中降低

Image

MLA是对传统多头注意力做的改进,其目的有两个:首先是,降低推理过程中的KV Cache资源开销,其次,缓解MQA、MGA对性能的损耗。

如上文所说,KV Cache中,提到每一步都需要将K和V缓存下来。

具体而言,对于单个Attention Block块中的多头注意力(下图来自上文提到过的Transformer通俗笔记)。

比如,举个例子,假设:

Image

Image

Image

Image

Image

(注意,是针对每个token,总之,如论文中所说,During inference, all keys and values need to be cached to accelerate inference, so MHA needs to cache elements for each token)

Image

Image

对Key和Value进行了一个低秩联合压缩(即Low-Rank Key-Value Joint Compression,通过低秩转换为一个压缩的KV,使得存储的KV的维度显著减小) Image

  • 如上图所示(在MHA GQA中大量存在于keys values中的KV缓存——带阴影表示,到了MLA中时,只有一小部分的被压缩Compressed的Latent KV了) 那,MLA具体如何做压缩呢,详看下节。

2.2 详解MLA的两个部分:一部分做压缩、一部分做RoPE编码

Image

Image

2.2.1 MLA对Q K V的压缩:先对KV联合压缩后升维,再对Q压缩后升维

2.2.1.1 先对KV联合压缩(Low-Rank Key-Value Joint Compression)、后升维

ImageImage

Image

\begin{array}{l} \mathbf{c}_{t}^{K V}=W^{D K V} \mathbf{h}_{t} \ \mathbf{k}_{t}{C}=W{U K} \mathbf{c}_{t}^{K V} \ \mathbf{v}_{t}{C}=W{U V} \mathbf{c}_{t}^{K V} \end{array}

可以看到针对KV先一块降维(公式表示时用D表示降维),再K、V各自升维(公式表示用U表示升维),具体而言

Image

Image

Image

且在推理过程中

Image

(即如论文中所说,during inference, since 𝑊𝑈𝐾 can be absorbed into 𝑊𝑄, and 𝑊𝑈𝑉 can be absorbedinto 𝑊𝑂, we even do not need to compute keys and values out for attention)

注,为方便大家更好的理解,我于24年8月27日晚上特地花了个把小时(反复琢磨、反复修改),用手头的iPad Pro + apple pencil画了下上述过程,以方便大家一目了然的对比前后维度的变化(至于下图底部中“除了之外”的怎么回事,不急,下文很快会逐一阐述)

Image

2.2.1.2 再对Q压缩降维、后升维

其次,对于上图左下角的
Image

Image

  1. 之前提到KV Cache中,Q的作用只发生在当下(预测下一个token时,其只能看到待预测token之前的所有token),但是在模型训练的过程中,每个输入的token会通过多头注意力机制生成对应的query、key和value。这些中间数据的维度往往非常高,因此占用的内存量也相应很大。
  2. 所以论文中也提到为了降低训练过程中的激活内存activation memory,DeepSeek-V2还对queries进行低秩压缩——即便这并不能降低KV Cache,而其对Q的压缩方式和K、V一致,依然是先降维再升维。

Image

其中:

ImageImage

2.2.2 MLA对query和key的RoPE编码

先说结论,如下图红框所示,需要对
Image做RoPE编码,并对其中的Key位置编码的部分进行CacheImage,从而在推理时不需要对Key进行位置编码的计算,提高了推理效率。Image

再说原因,即选择对Image做RoPE编码的背后有何深意呢?且听我july慢慢道来。

首先,在RoPE的实现中,如果要让Q、K带上位置信息,会分别乘以相应的位置编码矩阵。

Image

如果计算QK时,自然就变成了:

Image

对于上面这个公式,有两个小细节值得一提

正确的就是[图片]

假设 Q 和 K 是列向量(维度 d×1)

其维度为(1 \times d) \cdot(d \times d) \cdot(d \times d) \cdot(d \times 1)=1 \times 1

而非S=R_{m}^{T} Q^{T} R_{n} K

其维度为(d \times d) \cdot(1 \times d) \cdot(d \times d) \cdot(d \times 1)

有同学可能问,为何不是Q乘以K的转置了,原因在于上RoPE与标准注意力计算顺序是各自独立的 Image

通过上一节可知,DeepSeek-V2对Q和K都进行了压缩(如下图 带着蓝色下划线的):q_{t}{C}=W{U Q} c_{t}^{Q}\mathbf{k}_{t}{C}=W{U K} \mathbf{c}_{t}^{K V}Image

则整个过程变成S=\left(W^{U Q}\right){T}\left(c_{t}{Q}\right)^{T} R_{m}^{T} R_{n} c_{t}^{K V} W^{U K}

其中的Image——如上节所述,分别是用于从低秩表示恢复到原始维度的解压缩矩阵(说白了,就是升维的)。

然而问题是:

Image

用位置编码(因为压缩操作可能已经丢失了某些信息,使得位置编码不能直接和有效地反映原始Q和K的位置关系)

换言之,RoPE与低秩KV压缩不兼容——RoPE is incompatible with low-rank KV compression咋个具体不兼容法呢,具体来说,RoPE 对键K和查询Q都是位置敏感的。如果我们将RoPE 应用于键\mathbf{k}_{t}^{C},W^{U K}

在方程 \mathbf{k}_{t}{C}=W{U K} \mathbf{c}_{t}^{K V}

中将与一个位置敏感的RoPE 矩阵耦合。

To be specific, RoPE is position-sensitive for both keys and queries. If we applyRoPE for the keys k𝐶𝑡, 𝑊𝑈𝐾in Equation 10 will be coupled with a position-sensitive RoPE matrixImage这样一来,W^{U K}在推理过程中就不能再被吸收到W^{UQ}中。

「至于如何理解absorb 𝑊𝑈𝐾 into 𝑊𝑈𝑄, and 𝑊𝑈𝑉 into 𝑊𝑂,下文会提到,比如前者absorb 𝑊𝑈𝐾 into 𝑊𝑈𝑄。

Image

此外,这里应该是W^{UQ},而非论文原文中的W^Q

Image

而矩阵乘法不遵循交换律。

In this way, 𝑊𝑈𝐾 cannot be absorbed into 𝑊𝑄——此处应该为Image any more during inference, since a RoPE matrixrelated to the currently generating token will lie between 𝑊𝑄 and 𝑊𝑈𝐾 and matrix multiplication does not obey a commutative law

因此,必须在推理过程中重新计算所有前缀token的键,如此 这将显著阻碍推理效率。

As a result, we must recompute the keys for all the prefixtokens during inference, which will significantly hinder the inference efficiency

  1. 为了解决这问题,Deepseek-V2设计了两个pe结尾的变量——ImageImage(如论文中所说,we propose the decoupled RoPE strategy that uses additional multi-head queries q𝑅𝑡,𝑖 ∈ R𝑑𝑅ℎ and a shared key k𝑅𝑡 ∈ R𝑑𝑅ℎ to carry RoPE, where Image denotes the per-head dimension of the decoupled queries and key,即表示解耦查询和键的每头维度)——亦即如下图红框里的两个变量。Image

分别是用于生成解耦查询和键的矩阵,如下图的最右下角所示「为方便大家更好的理解,我把我自己上面画的手绘图又加了一些内容,好与上述这些公式逐一比对」 Image

且顺带总结一下。

Image

Image

Image

3. 可能如果没有再三强调,有的宝子们便不太注意

故,我july再提一下上面这句话中“将信息存储和旋转编码解耦开”隐藏的一个细节,即如下图所示 Image

Image

Image

请注意上面这两句话的含金量,这点几乎没有文章会给你特地强调出来的,虽然它本身就是个事实性的存在。

压缩完、且RoPE编码完之后,最后将这4个变量——q_{t}{C}=W{U Q} c_{t}^{Q}\mathbf{k}_{t}{C}=W{U K} \mathbf{c}_{t}^{K V}\mathbf{q}_{t}^{R}\mathbf{k}_{t}^{R}

,分别拼接起来,形成

Image

Image

以进行最后的计算:

其中蓝色框中的向量[图片]、[图片]

需要缓存以进行生成。在推理过程中,the naive formula需要从\mathbf{c}_{t}^{K V}中恢复\mathbf{k}_{t}^{C}\mathbf{v}_{t}^{C}以进行注意力计算

Image

我在另一篇文章中费了比较大的篇幅进行深入阐述,详见此文《MLA实现及其推理上的十倍提速——逐行解读DeepSeek V2中多头潜在注意力MLA的源码(图、公式、代码逐一对应)》的第二部分 MLA推理层面的改进:通过矩阵吸收十倍提速 MLA 算子,比如针对前者absorb 𝑊𝑈𝐾 into 𝑊𝑈𝑄,有

Image

Image

最终,单个Token产生的缓存包含了两个部分,即\left(d_{c}+d_{h}^{R}\right) lImage

其中,如上文说过的:

Image

Image

把我上面画的手绘图:ImageImage

翻转一下,可以对比下Image之间的换算关系 Image 因此,它的KV缓存等于只有2.25组的GQA,但其性能强于MHA。

至于MLA的代码实现,详见上面提到过的此文《MLA实现及其推理上的十倍提速——逐行解读DeepSeek V2中多头潜在注意力MLA的源码(图、公式、代码逐一对应)》

2.3 DeepSeekMoE:以经济成本训练强大的模型

2.3.1 基本架构与Device-Limited Routing

由于在上文的1.3节,详细的介绍了DeepSeekMoE(包括细粒度专家分割和共享专家隔离),故本节描述从简

DeepSeekMoE有两个关键理念:

  1. 将专家细分为更细的粒度以实现更高的专家专业化和更准确的知识获取;
  2. 隔离一些共享专家以减轻路由专家之间的知识冗余。

最终,在激活和总专家参数数量相同的情况下,DeepSeekMoE 可以大幅超越传统的 MoE 架构。

Image

Image

其中

Image

对于DeepSeek-V2,除了简单的top-K路由专家选择外,其还确保每个token的目标专家最多分布在 𝑀个设备上。具体来说,对于每个token,我们首先选择 𝑀个设备,这些设备中有专家具有最高的亲和分数。

然后,在这些 𝑀个设备上的专家中进行top-K选择。在实践中,我们发现当 𝑀 ⩾3 时,设备限制路由可以实现与不受限制的 top-K 路由大致一致的良好性能。

2.3.2 负载均衡的辅助损失(Auxiliary Loss for Load Balance)

首先,不平衡的负载会增加路由崩溃的风险,防止某些专家得到充分的训练和利用。其次,当采用专家并行时,不平衡的负载会降低计算效率。

故在 DeepSeek-V2 的训练过程中,设计了三种辅助损失,分别用于控制专家级负载均衡Image

  • 专家级均衡损失
  • 设备级平衡损失
  • 通信平衡损失

此外,虽然平衡损失旨在鼓励负载平衡,但需要承认它们不能保证严格的负载平衡。

为了进一步减轻由于负载不平衡导致的计算浪费,他们在训练期间引入了设备级的Token-Dropping策略。

  1. 这种方法首先计算每个设备的平均计算预算,这意味着每个设备的容量因子相当于1.0。
  2. 然后,受Riquelme等人的启发,在每个设备上丢弃具有最低亲和力分数的token,直到达到计算预算。
  3. 此外,确保大约10%的训练序列中的token永远不会被丢弃。通过这种方式,可以根据效率要求灵活决定在推理过程中是否丢弃标记,并始终确保训练和推理之间的一致性。

我的DeepSeek部署资料已打包好(自取↓)
https://pan.quark.cn/s/7e0fa45596e4

但如果你想知道这个工具为什么能“听懂人话”、写出代码 甚至预测市场趋势——答案就藏在大模型技术里!

❗️为什么你必须了解大模型?

1️⃣ 薪资爆炸:应届大模型工程师年薪40万起步,懂“Prompt调教”的带货主播收入翻3倍

2️⃣ 行业重构:金融、医疗、教育正在被AI重塑,不用大模型的公司3年内必淘汰

3️⃣ 零门槛上车:90%的进阶技巧不需写代码!会说话就能指挥AI

(附深度求索BOSS招聘信息)
在这里插入图片描述

⚠️警惕:当同事用DeepSeek 3小时干完你3天的工作时,淘汰倒计时就开始了。

那么,如何系统的去学习大模型LLM?

作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?老师啊,我自学没有方向怎么办?老师,这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!当然这些问题啊,也不是三言两语啊就能讲明白的。

所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。

篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
在这里插入图片描述

👉大模型学习指南+路线汇总👈

我们这套资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
在这里插入图片描述
在这里插入图片描述

👉①.基础篇👈

基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
在这里插入图片描述

👉②.进阶篇👈

接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
在这里插入图片描述

👉③.实战篇👈

实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
在这里插入图片描述

👉④.福利篇👈

最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
在这里插入图片描述
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!
在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐