本文详细介绍 DeepSeek 模型中的一些创新技术,包括对 Transformer 架构的改进(如 MLA、MOE)、Multi-Token Prediction 提高训练效率、算法、框架和硬件的协同设计、Group Relative Policy Optimization (GRPO) 强化学习算法,以及结合监督微调和强化学习的迭代训练方法。这些技术不仅提高了模型的性能,还显著降低了训练成本。记录供参考。
- MLA多头潜在注意力
Transformer架构的注意力机制是实现高效自然语言处理的关键组件。Multi-Head Latent Attention(MLA)是DeepSeek模型中用于改进标准多头注意力(Multi-Head Attention, MHA)的一种创新技术。
1.1 标准多头注意力
在标准的MHA中,输入的每个token通过投影矩阵进行变换,生成查询(queries)、键(keys)和值(values)。具体来说,输入嵌入
经过三个投影矩阵
变换为查询、键和值:
其中,
是输入嵌入的维度,
是头的数量,
是每个头的维度。
为了实现多头注意力,输入被分割成
个头,每个头有
的维度:
每个头的计算过程如下:
最后,所有头的输出被拼接并通过一个输出投影矩阵
进行变换:
在推理过程中,每个token需要存储的KV缓存大小为
,其中
是Transformer的层数。
1.2 低秩键值联合压缩
MLA的核心思想是将投影矩阵分解为两个低秩矩阵:
其中,
是用于键和值的降维矩阵,
是上投影矩阵,且
。这种分解可以将键和值压缩为一个潜在向量:
由于
,每个token只需要存储
的大小为
,而不是
和
的大小
,从而大大减少了KV缓存。
键和值从潜在向量
计算如下:
其中
和
分别是用于键和值的上投影矩阵。在推理过程中,
和
被吸收到
和
中,因此不需要显式计算
和
。
1.3 解耦旋转位置嵌入
DeepSeek-V2引入了旋转位置嵌入(RoPE)来增强注意力机制的位置感知能力。然而,标准的RoPE实现会导致推理过程中的高计算成本,因为需要将
吸收到
中。
为了解决这个问题,DeepSeek-V2提出了解耦RoPE策略,将查询和键分开处理。具体来说,使用多头的查询
和一个共享的键
,其中
表示解耦查询和键的每个头的维度。
这种解耦策略计算两组独立的注意力权重,然后将它们相加。完整的MLA计算过程如下:
在推理过程中,解耦的键
的维度为
也被缓存。因此,每个token总共需要缓存的KV缓存大小为
。对于DeepSeek-V2,其中
和
,每个token的KV缓存为
。
MLA通过引入低秩矩阵和解耦RoPE,减少了KV缓存的大小,同时保持了甚至优于标准MHA的性能。这种改进使得MLA在处理长上下文时更具效率。
2 MOE(混合专家系统)
deepseek671B提到的MOE是什么?图解MOE(混合专家模型) MoE是一种用于提高模型参数规模和计算效率的架构设计。在深度学习中,特别是在大语言模型中,MoE 通过将模型的前馈网络 FFN层替换为专家网络来实现这一目标。
在 MoE 架构中,模型的 FFN 层被替换为多个专家网络(experts),这些专家网络在结构上与标准的 FFN 相同。输入的每个 token 被路由到一个或多个专家进行处理。这种路由机制通常通过一个门控函数来实现,该函数决定每个 token 应该分配给哪些专家。
transformer vs MOE
2.1 细粒度专家分割
在传统的 MoE 架构中,整个 FFN 层被看作是一个整体,并被分割为若干个专家。细粒度专家分割在此基础上进一步细化,将 FFN 层分割为更小的子模块,每个子模块对应一个专家。这种分割方式可以表示为:
- 如果传统 MoE 中每个 FFN 层有
个专家,每个 token 激活
个专家。
- 在细粒度 MoE 中,每个 FFN 层被分割为
个更小的专家,这样每个 token 将激活
个专家。
这种细粒度分割策略提高了激活专家的组合灵活性,使得模型能够更好地适应不同的输入特征。
2.2 共享专家隔离
共享专家隔离是一种优化策略,旨在减少不同专家之间的参数冗余。在 MoE 中,一些专家被指定为共享专家,这些专家负责捕捉跨不同上下文的通用知识。
- 设定
个专家作为共享专家。
- 每个 token 在被路由到其特定的专家之外,还会被分配到这些共享专家。
为了保持计算成本的恒定,总路由专家数
减少为
,每个 token 激活的路由专家数减少为
。
2.3 负载均衡
在 MoE 中,自动学习的路由策略可能会导致负载不均衡的问题,即某些专家总是被选择而其他专家则未被充分利用。为了解决这个问题,引入了负载均衡的辅助损失函数:
- 专家级别的负载均衡损失函数通过监控每个专家的激活次数和亲和度来调整路由策略,以确保专家的均匀使用。
- 设备级别和通信负载均衡用于确保在不同设备上的计算和通信负载均衡。
负载均衡的目标是使每个专家的激活次数尽可能均匀,以避免某些专家过载而其他专家闲置。
2.4 辅助损失函数
负载均衡的辅助损失函数通常包括专家级别的平衡损失,其形式化定义如下:
其中: •
表示第
个专家的激活频率。 •
表示第
个专家的亲和度。 •
是超参数,用于调整损失的权重。
通过最小化这个损失函数,可以促使专家的激活次数和亲和度更加均匀分布。
小结
MOE 通过将模型的 FFN 层替换为多个专家网络,并通过细粒度分割和共享专家隔离来提高模型的参数规模和计算效率。负载均衡策略则确保了专家的均匀使用,避免了资源浪费。
3 MTP
在 MTP 中,模型不仅预测下一个词,而是预测一系列连续的词。对于输入序列中的每个词,模型会预测一个因果链上的多个后续词。这种方法通过在训练过程中增加更多的预测目标来提高模型的样本利用率。
3.1 实现细节
MTP 的实现通常涉及以下几个步骤:
- 多阶段预测 :在每个训练步骤中,模型会生成一个因果链,预测多个后续词。这个过程可以通过在模型中添加多个预测头来实现,每个预测头负责预测不同深度的后续词。
- 共享嵌入层和输出头 :在每个深度的预测中,使用共享的嵌入层和输出头来处理输入和生成输出。这样可以减少模型的参数量并提高计算效率。
- 独立变换器块和线性投影层 :每个深度的预测还包括一个独立的变换器块和一个线性投影层。输入到线性投影层的信号是当前深度的嵌入和前一深度的输出嵌入的拼接。
- 损失函数 :MTP 的训练目标是最大化多阶段的交叉熵损失。具体来说,损失函数是每个深度的交叉熵损失的平均值:
其中,
是在第
个深度的交叉熵损失,
是预测的深度,
是一个权重因子。
3.2 挑战
- 计算开销 :由于需要预测多个后续词,MTP 引入了额外的计算开销,导致训练时间增加。
- 复杂性 :MTP 的实现比传统的单词预测更为复杂,需要仔细设计模型结构和训练策略。
4 算法、框架和硬件的联合设计
在深度学习模型的开发和训练中,算法、框架和硬件的协同设计对于提高训练效率和模型性能至关重要。DeepSeek 模型在这方面进行了多项创新,特别是在算法和硬件优化方面。
4.1 DualPipe
DualPipe 是一种创新的管道并行算法,旨在减少跨节点专家并行性引入的通信开销。在大型模型训练中,通常需要在多个 GPU 或节点之间分配计算任务,这会导致大量的通信开销。DualPipe 通过重叠计算和通信来减少这种开销。
实现细节
- 管道划分 :DualPipe 将每个计算块划分为四个部分,其中反向计算块进一步划分为输入和权重两部分。这种划分有助于减少管道气泡(pipeline bubbles),即计算和通信之间的空闲时间。
- 双向调度 :DualPipe 采用双向管道调度,从管道的两端同时提供数据。这种策略可以进一步提高计算和通信的效率。
- 通信隐藏 :通过将一部分 GPU SMs(流处理器)专门用于通信,DualPipe 可以确保在执行期间通信完全隐藏,从而实现接近零的全对全通信开销。
- 内存消耗 :DualPipe 需要保留两个模型参数的副本,导致额外的内存消耗。尽管如此,研究表明这种开销是可以接受的,因为计算和通信效率的提升弥补了这一点。
改进
最近的研究表明,DualPipe 的双向部分是不必要的,并可以通过“减半”程序来移除,从而进一步减少内存消耗。
4.2 FP8 混合精度训练
混合精度训练是一种在保持模型性能的同时提高训练效率的技术,可以在不牺牲性能的情况下减少计算资源的使用。DeepSeek 使用 FP8 精度来实现高效的训练。
实现细节
- 精度选择 :FP8 是一种低精度格式,用于加速计算。然而,由于某些操作对低精度计算敏感,DeepSeek 在嵌入模块、输出头、MoE 门控模块、归一化操作和注意力操作中保持了原始精度。
- 量化策略 :为了扩展 FP8 格式的动态范围,DeepSeek 采用了一种细粒度的量化策略。具体来说,使用 tile-wise 或 block-wise 分组来处理数据,其中
是通道大小,在 DeepSeek 中设置为 128。 3. 高精度积累 :为了确保计算的准确性,DeepSeek 在低精度 GEMM 操作中使用高精度积累。具体来说,通过定期将中间结果复制到 CUDA 核心的 FP32 寄存器中进行全精度 FP32 积累。
5 GRPO
先来简单看下PPO和GRPO的区别:
- PPO:通过奖励和一个“评判者”模型(critic 模型)评估每个行为的“好坏”(价值),然后小步调整策略,确保改进稳定。
- GRPO:通过让模型自己生成一组结果(比如回答或行为),比较它们的相对质量(优势),然后优化策略。它的特点是不需要额外的“评判者”模型(critic 模型),直接用组内比较来改进。
5.1. GRPO目标函数的数学原理
GRPO的目标函数如下:
这个函数看起来复杂,但我们可以将其拆解为几个关键部分,逐一分析其作用和意义。GRPO的目标函数由两大部分组成:策略梯度更新项和KL散度正则化项。我们分别分析它们的作用。
策略梯度更新项
策略梯度部分是目标函数的主要成分,形式为:
核心思想
这一部分的目标是通过策略梯度调整
,使策略
在有利动作(
)上提高概率,在不利动作(
)上降低概率。为了避免更新过于激进,GRPO引入了剪切机制。
概率比
这是当前策略与旧策略在动作
上的概率比。若
,表示当前策略更倾向于选择该动作;若
,则倾向于减少该动作。
剪切操作
剪切操作将
限制在
区间内:
- 如果
,则被截断为
;
- 如果
,则被截断为
。
这限制了策略更新的幅度,防止单次更新偏离旧策略太远。
最小值操作
- 当
(动作有利)时,
选择较小的值,确保更新不会过于增加概率。
- 当
(动作不利)时,
同样选择较小的值(即较大的负值),限制概率减少的幅度。
这种设计类似于PPO算法,通过剪切和最小值操作增强训练稳定性。
平均操作
- : 对单个轨迹内的所有时间步取平均。
- : 对所有
个轨迹取平均。
- : 在状态和轨迹分布上取期望。
这些平均和期望操作使目标函数能够泛化到不同的状态和轨迹。
KL散度正则化项
作用
KL散度(Kullback-Leibler divergence)衡量当前策略
与参考策略
之间的差异。负号和权重
表示这是一个惩罚项,目标是限制
偏离
过远。
意义
- 当
较大时,惩罚增加,迫使策略更新更加保守。
- 控制正则化强度:
越大,策略变化越小。
GRPO算法的整体工作流程
GRPO是一种基于组奖励的策略优化算法,其工作流程可以分为以下几个步骤:
-
采样响应(Sample G responses)
对于每个输入问题
,从旧策略
中采样
个响应
。这些响应可以看作是对问题的多种可能回答,图示中用粉色方块表示“prompts”(输入问题),绿色方块表示“completions”(生成响应)。
-
分配奖励(Assign rewards based on rules)
根据预定义的规则为每个响应分配奖励
。奖励可能基于回答的质量(如准确性、流畅性等),图示中用蓝色方块表示“rewards”。
-
计算优势(Compute advantages)
通过比较每个响应的奖励与组内统计值,计算优势值
。具体公式为:
其中,
是组内奖励的平均值,
是标准差。优势值
反映了每个响应相对于组内平均表现的优劣,图示中用紫色方块表示“advantages”。
-
更新策略(Update the policy)
通过最大化目标函数
,调整策略参数
,以提高高优势值(
)响应的生成概率,同时降低低优势值(
)响应的概率。
-
KL散度惩罚(KL Divergence penalty)
为避免新策略
过于偏离参考模型
,引入KL散度惩罚项
。这一正则化措施确保策略更新的稳定性并保留通用推理能力,图示中用橙色方块表示“
”。
整个流程通过迭代优化实现:从输入问题到生成响应,再到奖励分配和优势计算,最后更新策略,形成一个闭环。
6 训练后:对基础模型进行强化学习
在深度学习模型中,训练后的强化学习(RL)阶段通常用于进一步提升模型的性能,特别是在生成任务中。DeepSeek 模型在这一阶段采用了多种策略来优化其表现。
6.1 纯强化学习(Pure Reinforcement Learning)
纯强化学习是指在没有监督微调(SFT)数据的情况下,直接对基础模型进行强化学习。DeepSeek-R1-Zero 是通过这种方式训练的模型。
实现细节
- 基础模型 :DeepSeek-R1-Zero 基于 DeepSeek-V3-Base 模型进行训练。该模型没有使用任何 SFT 数据,完全通过强化学习进行优化。
- GRPO 算法 :DeepSeek-R1-Zero 使用 Group Relative Policy Optimization (GRPO) 算法进行训练。GRPO 通过直接估计优势函数来简化 PPO 的实现,从而提高训练效率。
- 奖励函数
:模型使用两种类型的奖励函数: •
准确性奖励
:评估模型响应的正确性。 •
格式奖励
:强制模型在其思考过程中使用特定的标签(如
<think>
和</think>
),以提高可读性和逻辑性。 - 训练模板 :设计了一个训练模板来指导模型遵循特定的格式,先生成推理过程,然后给出最终答案。
挑战:纯强化学习虽然能够提高模型的性能,但也面临一些挑战,如生成内容的可读性和语言一致性。这些问题通常需要通过进一步的训练和优化来解决。
6.2 强化学习与冷启动
DeepSeek-R1 采用了一种迭代训练方法,结合了监督微调和强化学习来优化模型性能。
实现细节
- 冷启动阶段 :为了缓解 RL 训练初期的不稳定性,DeepSeek-R1 收集了数千个长链推理(Chain-of-Thought, CoT)示例来微调 DeepSeek-V3-Base 模型。这为后续的强化学习提供了坚实的基础。
- 推理导向的 RL :在冷启动数据上微调后,模型进行与 DeepSeek-R1-Zero 相同的 RL 训练过程。为了提高语言一致性,引入了一个额外的奖励来衡量 CoT 中目标词的比例。
- 拒绝采样和 SFT :在这一阶段,模型的目标是提高其在写作、角色扮演等通用任务上的表现。通过拒绝采样从检查点收集约 600k 的推理相关训练样本,并保留正确的响应。此外,还收集了约 200k 的非推理训练样本。
- RL 对齐 :这一阶段的目的是更好地对齐模型与人类偏好,提高其有用性和无害性,同时改进推理能力。有用性基于响应的效用和相关性进行评估,而无害性则通过评估整个响应来减少潜在风险、偏见或有害内容。
通过这种迭代训练方法,DeepSeek-R1 能够在保持高准确性的同时,提高生成内容的质量和多样性。
关于作者:余俊晖,主要研究方向为自然语言处理、大语言模型、文档智能。曾获CCF、Kaggle、ICPR、CCL、CAIL等国内外近二十项AI算法竞赛/评测冠亚季军。发表SCI、顶会等文章多篇,专利数项。