LLM:DeepSeek 系列(三)
原文链接
4、DeepSeek-V3
DeepSeek-V3 发布于 2024 年 12 月,采用了 DeepSeek-V2 中的多头潜在注意力(MLA)和 DeepSeekMoE 架构,此外,DeepSeek-V3 开创了一种无辅助损失的负载均衡策略,并设定了多词元预测训练目标以获得更强的性能。
DeepSeek-V3 总参数量达 6710 亿个,每个词元激活 370 亿个参数,DeepSeek-V3 在 14.8 万亿个多样化且高质量标记上对 DeepSeek-V3 进行了预训练,随后通过监督微调和强化学习阶段来充分发挥其能力。
4.1、架构
DeepSeek-V3 的基本架构仍在 Transformer 框架内,为了实现高效的推理和经济的训练,DeepSeek-V3 采用了 MLA(多级注意力) 和 DeepSeekMoE(深度可微分的多任务学习),并引入了一个无辅助损失的负载均衡机制。
4.1.1、多头潜在注意力
DeepSeek-V3 采用 MLA(Multi-Head Latent Attention) 架构。设 d d d 表示嵌入维度, n h n_{h} nh 表示注意力头的数量, d h d_{h} dh 表示每个头的维度, h t ∈ R d h_{t} \in R^{d} ht∈Rd 表示在给定注意力层的第 t t t 个词元的注意力输入。MLA 的核心是对注意力键(key)和值(value)进行低秩联合压缩以减少推理过程中的键值(KV)缓存:
c t K V = W D K V h t , [ k t , 1 C ; k t , 2 C ; … ; k t , n h C ] = k t C = W U K c t K V , k t R = RoPE ( W K R h t ) , k t , i = [ k t , i C ; k t R ] , [ v t , 1 C ; v t , 2 C ; … ; v t , n h C ] = v t C = W U V c t K V , \begin{align*} c_{t}^{K V} &= W^{D K V} h_{t}, \\ {\left[k_{t, 1}^C; k_{t, 2}^C;\ldots; k_{t, n_h}^C\right]} = k_t^C &= W^{U K} c_t^{K V}, \\ k_{t}^{R} &= \operatorname{RoPE}\left(W^{K R} h_{t}\right), \\ k_{t, i} &= \left[k_{t, i}^{C}; k_{t}^{R}\right], \\ {\left[v_{t, 1}^C; v_{t, 2}^C;\ldots; v_{t, n_h}^C\right]} = v_t^C &= W^{U V} c_t^{K V}, \end{align*} ctKV[kt,1C;kt,2C;…;kt,nhC]=ktCktRkt,i[vt,1C;vt,2C;…;vt,nhC]=vtC=WDKVht,=WUKctKV,=RoPE(WKRht),=[kt,iC;ktR],=WUVctKV,
其中:
-
c
t
K
V
∈
R
d
c
c_{t}^{K V} \in \mathbb{R}^{d_{c}}
ctKV∈Rdc 是用于
key
和value
的压缩潜在向量, d c ( ≪ d h n h ) d_{c} \left( \ll d_{h} n_{h} \right) dc(≪dhnh) 表示 KV 压缩维度; - W D K V ∈ R d c × d W^{D K V} \in \mathbb{R}^{d_{c} \times d} WDKV∈Rdc×d 表示下投影矩阵;
-
W
U
K
,
W
U
V
∈
R
d
h
n
h
×
d
c
W^{U K}, W^{U V} \in \mathbb{R}^{d_{h} n_{h} \times d_{c}}
WUK,WUV∈Rdhnh×dc 分别是用于
key
和value
的上升投影矩阵; - W K R ∈ R d h R × d W^{K R} \in \mathbb{R}^{d_{h}^{R} \times d} WKR∈RdhR×d 是用于生成携带旋转位置嵌入(RoPE)的解耦键的矩阵;
- RoPE ( ⋅ ) \operatorname{RoPE}(\cdot) RoPE(⋅) 表示应用 RoPE 矩阵的操作;
- [ ⋅ ; ⋅ ] [\cdot; \cdot] [⋅;⋅] 表示连接。
对于 MLA,只有 c t K V c_{t}^{K V} ctKV 和 k t R k_{t}^{R} ktR 向量需要在生成过程中缓存,如此显著减少了 KV 缓存,同时保持与标准多头注意力(MHA)相当的性能。
对于注意力 query
执行低秩压缩以减少训练期间的激活内存:
c t Q = W D Q h t , [ q t , 1 C ; q t , 2 C ; … ; q t , n h C ] = q t C = W U Q c t Q , [ q t , 1 R ; q t , 2 R ; … ; q t , n h R ] = q t R = RoPE ( W Q R c t Q ) , q t , i = [ q t , i C ; q t , i R ] \begin{align*} c_{t}^{Q} &= W^{D Q} h_{t}, \\ {\left[q_{t, 1}^C; q_{t, 2}^C;\ldots; q_{t, n_h}^C\right]} = q_t^C &= W^{U Q} c_t^Q, \\ {\left[q_{t, 1}^R; q_{t, 2}^R;\ldots; q_{t, n_h}^R\right]} = q_t^R &= \operatorname{RoPE}\left(W^{Q R} c_t^Q\right), \\ q_{t, i} &= \left[q_{t, i}^{C}; q_{t, i}^{R}\right] \end{align*} ctQ[qt,1C;qt,2C;…;qt,nhC]=qtC[qt,1R;qt,2R;…;qt,nhR]=qtRqt,i=WDQht,=WUQctQ,=RoPE(WQRctQ),=[qt,iC;qt,iR]
其中:
-
c
t
Q
∈
R
d
c
′
c_{t}^{Q} \in \mathbb{R}^{d_{c}^{\prime}}
ctQ∈Rdc′ 是用于
query
的压缩潜在向量; -
d
c
′
(
≪
d
h
n
h
)
d_{c}^{\prime} \left( \ll d_{h} n_{h} \right)
dc′(≪dhnh) 表示
query
压缩维度; -
W
D
Q
∈
R
d
c
′
×
d
,
W
U
Q
∈
R
d
h
n
h
×
d
c
′
W^{D Q} \in \mathbb{R}^{d_{c}^{\prime} \times d}, W^{U Q} \in \mathbb{R}^{d_{h} n_{h} \times d_{c}^{\prime}}
WDQ∈Rdc′×d,WUQ∈Rdhnh×dc′ 分别是用于
query
的下投影和上升投影矩阵; -
W
Q
R
∈
R
d
h
R
n
h
×
d
c
′
W^{Q R} \in \mathbb{R}^{d_{h}^{R} n_{h} \times d_{c}^{\prime}}
WQR∈RdhRnh×dc′ 是用于生成携带 RoPE 的解耦
query
的矩阵。
最终,将注意力 query
(
q
t
,
i
)
\left(q_{t, i}\right)
(qt,i)、key
(
k
j
,
i
)
\left(k_{j, i}\right)
(kj,i) 和 value
(
v
j
,
i
C
)
\left(v_{j, i}^{C}\right)
(vj,iC) 结合起来,得到最终的注意力输出
u
t
u_{t}
ut:
o t , i = ∑ j = 1 t Softmax j ( q t , i T k j , i d h + d h R ) v j , i C u t = W O [ o t , 1 ; o t , 2 ; … ; o t , n h ] , \begin{align*} & o_{t, i} = \sum_{j=1}^t \operatorname{Softmax}_j \left( \frac{q_{t, i}^T k_{j, i}}{\sqrt{d_h + d_h^R}} \right) v_{j, i}^C \\ & u_t = W^O \left[ o_{t, 1}; o_{t, 2}; \ldots; o_{t, n_h} \right], \end{align*} ot,i=j=1∑tSoftmaxj dh+dhRqt,iTkj,i vj,iCut=WO[ot,1;ot,2;…;ot,nh],
其中 W O ∈ R d × d h n h W^{O} \in R^{d \times d_{h} n_{h}} WO∈Rd×dhnh 表示输出投影矩阵。
4.1.2、采用辅助无损失负载均衡的 DeepSeekMoE
4.1.2.1、DeepSeekMoE 基本架构
对于前馈网络(FFN),DeepSeek-V3 采用了 DeepSeekMoE 架构。与 GShard 等传统的混合专家(MoE)架构相比,DeepSeekMoE 使用了更细粒度的专家,并将一些专家隔离为共享专家。
设 u t \mathbf{u}_t ut 表示第 t t t 个 token 的 FFN 输入,按如下方式计算 FFN 输出 h t ′ \mathbf{h}_t' ht′:
h t ′ = u t + ∑ i = 1 N s FFN i ( s ) ( u t ) + ∑ i = 1 N r g i , t FFN i ( r ) ( u t ) , g i , t = g i , t ′ ∑ j = 1 N r g j , t ′ , g i , t ′ = { s i , t , s i , t ∈ Topk ( { s j , t ∣ 1 ≤ j ≤ N r } , K r ) 0 , otherwise , s i , t = Sigmoid ( u t T e i ) , \begin{align*} \mathbf{h}_t' &= \mathbf{u}_t+\sum_{i = 1}^{N_s}\text{FFN}_i^{(s)}(\mathbf{u}_t)+\sum_{i = 1}^{N_r}g_{i,t}\text{FFN}_i^{(r)}(\mathbf{u}_t), \\ g_{i,t} &= \frac{g_{i,t}'}{\sum_{j = 1}^{N_r}g_{j,t}'}, \\ g_{i,t}' &= \begin{cases} s_{i,t}, & s_{i,t}\in\text{Topk}(\{s_{j,t}|1\leq j\leq N_r\},K_r)\\ 0, & \text{otherwise} \end{cases}, \\ s_{i,t} &= \text{Sigmoid}(\mathbf{u}_t^T\mathbf{e}_i), \end{align*} ht′gi,tgi,t′si,t=ut+i=1∑NsFFNi(s)(ut)+i=1∑Nrgi,tFFNi(r)(ut),=∑j=1Nrgj,t′gi,t′,={si,t,0,si,t∈Topk({sj,t∣1≤j≤Nr},Kr)otherwise,=Sigmoid(utTei),
其中:
- N s N_s Ns 和 N r N_r Nr 分别表示共享专家和路由专家的数量;
- FFN i ( s ) ( ⋅ ) \text{FFN}_i^{(s)}(\cdot) FFNi(s)(⋅) 和 FFN i ( r ) ( ⋅ ) \text{FFN}_i^{(r)}(\cdot) FFNi(r)(⋅) 分别表示第 i i i 个共享专家和第 i i i 个路由专家;
- K r K_r Kr 表示被激活的路由专家的数量; g i , t g_{i,t} gi,t 是第 i i i 个专家的门控值; s i , t s_{i,t} si,t 是标记与专家的亲和度; e i \mathbf{e}_i ei 是第 i i i 个路由专家的质心向量;
- Top k ( ⋅ , K ) \text{Top}k(\cdot,K) Topk(⋅,K) 表示在为第 t t t 个标记和所有路由专家计算的亲和度得分中,由 K K K 个最高分组成的集合
与 DeepSeek-V2 略有不同,DeepSeek-V3 使用 Sigmoid 函数来计算亲和度得分,并在所有选定的亲和度得分上应用归一化来生成门控值。
4.1.2.2、无辅助损失的负载均衡
对于混合专家(MoE)模型而言,专家负载不均衡会导致路由崩溃,并且在专家并行的场景下会降低计算效率。传统的解决方案通常依靠辅助损失来避免负载不均衡。然而,过大的辅助损失会损害模型性能。为了在负载均衡和模型性能之间实现更好的权衡,DeepSeek-V3 首创了一种无辅助损失的负载均衡策略来确保负载均衡。具体来说,DeepSeek-V3 为每个专家引入一个偏置项 b i b_i bi,并将其添加到相应的亲和度得分 s i , t s_{i,t} si,t 中,以确定前 K K K 路由:
g i , t ′ = { s i , t , s i , t + b i ∈ Top k ( { s j , t + b j ∣ 1 ≤ j ≤ N r } , K r ) 0 , otherwise g_{i,t}' = \begin{cases} s_{i,t}, & s_{i,t}+b_i\in\text{Top}k(\{s_{j,t}+b_j|1\leq j\leq N_r\},K_r)\\ 0, & \text{otherwise} \end{cases} gi,t′={si,t,0,si,t+bi∈Topk({sj,t+bj∣1≤j≤Nr},Kr)otherwise
需要注意的是,偏置项仅用于路由。将与前馈网络(FFN)输出相乘的门控值仍然由原始的亲和度得分 s i , t s_{i,t} si,t 得出。在训练过程中每个步骤结束时,如果某个专家的负载过重,将其对应的偏置项减小 γ \gamma γ;如果某个专家的负载过轻,将其对应的偏置项增加 γ \gamma γ,其中 γ \gamma γ 是一个被称为偏置更新速度的超参数。通过这种动态调整,DeepSeek-V3 在训练过程中保持了专家负载的均衡,并且比单纯依靠辅助损失来促进负载均衡的模型取得了更好的性能。
4.1.2.3、互补的序列级辅助损失
尽管 DeepSeek-V3 主要依靠无辅助损失策略来实现负载均衡,但为了防止任何单个序列内出现极端的不均衡情况,还采用了一种互补的序列级均衡损失:
L Bal = α ∑ i = 1 N r f i P i , f i = N r K r T ∑ t = 1 T 1 ( s i , t ∈ Top k ( { s j , t ∣ 1 ≤ j ≤ N r } , K r ) ) , s i , t ′ = s i , t ∑ j = 1 N r s j , t , P i = 1 T ∑ t = 1 T s i , t ′ , \begin{align*} \mathcal{L}_{\text{Bal}} &= \alpha \sum_{i = 1}^{N_r} f_i P_i, \\ f_i &= \frac{N_r}{K_r T} \sum_{t = 1}^{T} \mathbb{1} \left( s_{i,t} \in \text{Top}k \left( \{ s_{j,t} | 1 \leq j \leq N_r \}, K_r \right) \right), \\ s_{i,t}' &= \frac{s_{i,t}}{\sum_{j = 1}^{N_r} s_{j,t}}, \\ P_i &= \frac{1}{T} \sum_{t = 1}^{T} s_{i,t}', \end{align*} LBalfisi,t′Pi=αi=1∑NrfiPi,=KrTNrt=1∑T1(si,t∈Topk({sj,t∣1≤j≤Nr},Kr)),=∑j=1Nrsj,tsi,t,=T1t=1∑Tsi,t′,
其中,均衡因子 α \alpha α 是一个超参数,在 DeepSeek-V3 中会被赋予一个极小的值; 1 ( ⋅ ) \mathbb{1}(\cdot) 1(⋅) 表示指示函数; T T T 表示一个序列中的 token 数量。这种序列级均衡损失促使每个序列上的专家负载达到均衡。
4.1.2.4、节点受限路由
与 DeepSeek-V2 采用的设备受限路由类似,DeepSeek-V3 同样使用了一种受限路由机制,以限制训练过程中的通信成本。简而言之,确保每个 token 最多被发送到 M M M 个节点,这些节点根据分布在每个节点上的专家的最高 K r M K_r^M KrM 个亲和度得分之和来选择的。在这一约束条件下,混合专家(MoE)训练框架几乎可以实现计算与通信的完全重叠。
4.1.2.5、无词元丢弃
由于采用了有效的负载均衡策略,DeepSeek-V3 在整个训练过程中都能保持良好的负载均衡。因此,DeepSeek-V3 在训练期间不会丢弃任何 token。此外,DeepSeek-V3 还实施了特定的部署策略,以确保推理阶段的负载均衡,所以在推理过程中同样不会丢弃 token。
4.1.2.6、多词元预测
DeepSeek-V3 设定了多词元预测(Multi-Token Prediction,MTP)目标,该目标将每个位置的预测范围扩展到多个未来 token。一方面,MTP 目标使训练信号更加密集,从而提高数据效率。另一方面,MTP 使模型能够预先规划其表示,以便更好地预测未来 token。与其他使用独立输出头并行预测 D D D 个额外 token 不同,DeepSeek-V3 按顺序预测额外标记,并在每个预测深度保持完整的因果链。
MTP 模块
MTP 实现使用 D D D 个顺序模块来预测 D D D 个额外 token。第 k k k 个 MTP 模块由一个共享嵌入层 Emb ( ⋅ ) \text{Emb}(\cdot) Emb(⋅)、一个共享输出头 OutHead ( ⋅ ) \text{OutHead}(\cdot) OutHead(⋅)、一个 Transformer 块 TRM k ( ⋅ ) \text{TRM}_k(\cdot) TRMk(⋅) 和一个投影矩阵 M k ∈ R d × 2 d M_k \in \mathbb{R}^{d\times2d} Mk∈Rd×2d 组成。
对于第 i i i 个输入 token t i t_i ti,在第 k k k 个预测深度首先通过线性投影将第 ( k − 1 ) (k - 1) (k−1) 层深度下第 i i i 个 token 的表示 h i k − 1 ∈ R d \mathbf{h}_i^{k - 1} \in \mathbb{R}^{d} hik−1∈Rd 与第 ( i + k ) (i + k) (i+k) 个 token 的嵌入 Emb ( t i + k ) ∈ R d \text{Emb}(t_{i + k}) \in \mathbb{R}^{d} Emb(ti+k)∈Rd 相结合:
h i ′ k = M k [ RMSNorm ( h i k − 1 ) ; RMSNorm ( Emb ( t i + k ) ) ] \mathbf{h}_{i}^{'k} = M_k [\text{RMSNorm}(\mathbf{h}_{i}^{k - 1}); \text{RMSNorm}(\text{Emb}(t_{i + k}))] hi′k=Mk[RMSNorm(hik−1);RMSNorm(Emb(ti+k))]
其中, [ ⋅ ; ⋅ ] [\cdot; \cdot] [⋅;⋅] 表示拼接操作。特别地,当 k = 1 k = 1 k=1 时, h i k − 1 \mathbf{h}_{i}^{k - 1} hik−1 指的是主模型给出的表示。
需要注意的是,对于每个 MTP 模块,其嵌入层与主模型共享。组合后的 h i ′ k \mathbf{h}_{i}^{'k} hi′k 作为第 k k k 层深度的 Transformer 块的输入,以生成当前深度的输出表示 h i k \mathbf{h}_{i}^{k} hik:
h 1 : T − k k = TRM k ( h 1 : T − k ′ k ) \mathbf{h}_{1:T - k}^{k} = \text{TRM}_k(\mathbf{h}_{1:T - k}^{'k}) h1:T−kk=TRMk(h1:T−k′k)
其中, T T T 表示输入序列的长度, i : j i:j i:j 表示切片操作(包含左右边界)。最后,以 h i k \mathbf{h}_{i}^{k} hik 作为输入,共享输出头将计算第 k k k 个额外预测标记 P i + 1 + k k ∈ R V \mathbf{P}_{i + 1 + k}^{k} \in \mathbb{R}^{V} Pi+1+kk∈RV 的概率分布,其中 V V V 是词汇表大小:
P i + k + 1 k = OutHead ( h i k ) \mathbf{P}_{i + k + 1}^{k} = \text{OutHead}(\mathbf{h}_{i}^{k}) Pi+k+1k=OutHead(hik)
输出头 OutHead ( ⋅ ) \text{OutHead}(\cdot) OutHead(⋅) 将表示线性映射为对数几率,然后应用 Softmax ( ⋅ ) \text{Softmax}(\cdot) Softmax(⋅) 函数来计算第 k k k 个额外标记的预测概率。同样,对于每个 MTP 模块,其输出头与主模型共享。保持预测因果链的原则与 EAGLE 类似,但其主要目标是推测性解码,而 DeepSeek-V3 利用 MTP 来改进训练。
4.3、训练框架
DeepSeek-V3 的训练由 HAI-LLM 框架提供支持,采用了 16 路流水线并行(PP)、跨越 8 个节点的 64 路专家并行(EP)以及 ZeRO-1 数据并行(DP)。
4.3.1、双管道与计算-通信重叠
DeepSeek-V3 的跨节点专家并行引入的通信开销导致了约 1:1 的低效计算与通信比率。为此设计了一种创新的管道并行算法,称为双管道(DualPipe)。该算法不仅通过有效重叠前向和后向计算-通信阶段来加速模型训练,还能减少管道气泡。
双管道的核心思想是在一对单独的前向和后向块内重叠计算与通信。具体而言,将每个块划分为四个组件:注意力(attention)、全对全分发(all-to-all dispatch)、多层感知器(MLP)以及全对全合并(all-to-all combine)。特别地,对于后向块,注意力和多层感知器进一步细分为输入的反向计算和权重的反向计算两部分。
此外,DeepSeek-V3 还有一个管道并行(PP)通信组件。如下图所示,对于一对前向和后向块,重新排列这些组件,并手动调整专用于通信与计算的 GPU 流式多处理器(SM)的比例。在这种重叠策略下,可以确保在执行过程中全对全通信和管道并行通信都能被完全隐藏。
鉴于这种高效的重叠策略,完整的双管道调度如下图所示。其采用双向管道调度,从管道的两端同时输入微批次数据,并且很大一部分通信可以完全重叠。这种重叠还确保了,随着模型进一步扩展,只要保持恒定的计算与通信比率,仍然可以在跨节点使用细粒度的专家,同时实现近乎零的全对全通信开销。
4.3.2、跨节点全对全通信的高效实现
为确保双管道(DualPipe)有足够的计算性能,DeepSeek-V3 定制了高效的跨节点全对全通信内核(包括分发和合并),以节省用于通信的流式多处理器(SM)数量。这些内核的实现与混合专家(MoE)选通算法以及集群的网络拓扑共同设计。
在集群中,跨节点的图形处理器(GPU)通过无限带宽(IB)网络完全互连,而节点内的通信则通过英伟达高速互连(NVLink)处理。NVLink 提供 160GB/s 的带宽,约为 IB 带宽(50GB/s)的 3.2 倍。为有效利用 IB 和 NVLink 不同的带宽,将每个 token 最多分发到 4 个节点,从而减少 IB 流量。对于每个 token,在做出路由决策后,首先会通过 IB 传输到目标节点上具有相同节点内索引的 GPU。一旦到达目标节点,会确保它能通过 NVLink 立即转发到承载目标专家的特定 GPU,而不会被随后到达的 token 阻塞。通过这种方式,IB 和 NVLink 的通信得以完全重叠,并且每个 token 在每个节点上平均能高效选择 3.2 个专家,而不会产生 NVLink 带来的额外开销。这意味着,尽管 DeepSeek-V3 在实际中仅选择 8 个路由专家,但在保持相同通信成本的情况下,可将该数量最多扩展到 13 个专家(4 个节点 × 每个节点 3.2 个专家)。总体而言,在这样的通信策略下,仅需 20 个 SM 就足以充分利用 IB 和 NVLink 的带宽。
详细来说,DeepSeek-V3 采用线程束专用化技术,并将 20 个 SM 划分为 10 个通信通道。在分发过程中,(1)IB 发送、(2)从 IB 到 NVLink 的转发以及(3)NVLink 接收分别由各自的线程束处理。分配给每个通信任务的线程束数量会根据所有 SM 的实际工作负载动态调整。类似地,在合并过程中,(1)NVLink 发送、(2)从 NVLink 到 IB 的转发与累加以及(3)IB 接收与累加也由动态调整的线程束处理。
此外,分发和合并内核都与计算流重叠,因此也考虑了它们对其他 SM 计算内核的影响。具体来说,DeepSeek-V3 采用定制的并行线程执行(PTX)指令,并自动调整通信块大小,这显著减少了二级缓存(L2 cache)的使用以及对其他 SM 的干扰。
4.3.3、以极小开销实现极致内存节省
为减少训练过程中的内存占用,DeepSeek-V3 采用了以下技术:
- RMSNorm 和 MLA 上采样投影的重计算
- 在反向传播过程中,对所有 RMSNorm 操作和 MLA 上采样投影进行重计算,从而无需持续存储它们的输出激活值。通过这种略微增加开销的策略,显著降低了存储激活值所需的内存
- 在 CPU 中进行指数移动平均
- 在训练期间保存模型参数的指数移动平均(EMA),以便在学习率衰减后尽早评估模型性能。EMA 参数存储在 CPU 内存中,并在每个训练步骤后异步更新。这种方法能够维护 EMA 参数,而不会产生额外的内存或时间开销
- 多令牌预测的共享嵌入层和输出头
- 借助双管道(DualPipe)策略,将模型的最浅层(包括嵌入层)和最深层(包括输出头)部署在相同的管道并行(PP)等级上。这种安排使得多令牌预测(MTP)模块与主模型之间能够在物理上共享嵌入层和输出头的参数与梯度。这种物理共享机制进一步提高了内存使用效率
4.4、FP8训练
DeepSeek-V3 提出了一种细粒度混合精度框架,采用 FP8 数据格式来训练 DeepSeek-V3。尽管低精度训练前景广阔,但它常常受到激活值、权重和梯度中异常值的限制。虽然推理量化方面已取得显著进展,但相对较少有研究表明低精度技术能成功应用于大规模语言模型的预训练。
为应对这一挑战并有效扩展 FP8 格式的动态范围,DeepSeek-V3 引入了一种细粒度量化策略:按 1 × N c 1 \times N_{c} 1×Nc 元素的瓦片式分组(tile-wise grouping),或按 N c × N c N_{c} \times N_{c} Nc×Nc 元素的块式分组(block-wise grouping)。在提高精度的累加过程中,相关的反量化开销得到了大幅缓解,这是实现精确的 FP8 通用矩阵乘法(GEMM)的关键因素。
此外,为进一步降低混合专家(MoE)训练中的内存和通信开销,DeepSeek-V3 以 FP8 格式缓存和分发激活值,同时以 BF16 格式存储低精度优化器状态。在与 DeepSeek-V2-Lite 和 DeepSeek-V2 规模相近的两种模型上验证了所提出的 FP8 混合精度框架,训练数据量约为 1万亿 个词元。值得注意的是,与 BF16 基准相比,采用 FP8 训练的模型相对损失误差始终保持在 0.25% 以下,这一水平完全处于训练随机性可接受的范围内。
4.4.1、混合精度框架
DeepSeek-V3 提出了一种用于 FP8 训练的混合精度框架。在这个框架中,大多数计算密集型操作以 FP8 进行,而一些关键操作则策略性地保持其原始数据格式,以平衡训练效率和数值稳定性。
首先,为了加速模型训练,大多数核心计算内核,即通用矩阵乘法(GEMM)操作,以 FP8 精度实现。这些 GEMM 操作接受 FP8 张量作为输入,并生成 BF16 或 FP32 格式的输出。如上图所示,与线性算子相关的所有三个GEMM操作,即前向传播(Fprop)、激活反向传播(Dgrad)和权重反向传播(Wgrad),均以 FP8 执行。与原始的 BF16 方法相比,这种设计在理论上可将计算速度提高一倍。此外,FP8 格式的权重反向传播(Wgrad)GEMM 操作允许激活值以 FP8 格式存储,以便在反向传播中使用。这显著降低了内存消耗。
尽管 FP8 格式具有效率优势,但某些算子由于对低精度计算较为敏感,仍需要更高的精度。此外,一些低成本算子也可以使用更高的精度,且对整体训练成本的影响可忽略不计。基于这些原因,对以下组件保持原始精度(如 BF16 或 FP32):嵌入模块、输出头、混合专家(MoE)选通模块、归一化算子和注意力算子。这些有针对性地保留高精度的做法,确保了 DeepSeek-V3 训练过程的稳定性。
为进一步保证数值稳定性,DeepSeek-V3 以更高精度存储主权重、权重梯度和优化器状态。虽然这些高精度组件会带来一些内存开销,但通过在的分布式训练系统中跨多个数据并行(DP)等级进行高效分片,其影响可降至最低。
4.4.2、通过量化和乘法提高精度
基于混合精度 FP8 框架,DeepSeek-V3 引入了几种策略来提高低精度训练的准确性,主要聚焦于量化方法和乘法过程:
4.4.2.1、细粒度量化
在低精度训练框架中,由于 FP8 格式的动态范围有限(受其减少的指数位限制),上溢和下溢是常见问题。作为一种标准做法,通过将输入张量的最大绝对值缩放到 FP8 的最大可表示值,使输入分布与 FP8 格式的可表示范围对齐。这种方法使得低精度训练对激活异常值高度敏感,严重降低量化精度。
为解决此问题,DeepSeek-V3 提出一种细粒度量化方法,在更细的粒度上应用缩放。如下图中(a)所示,(1)对于激活值,以 1 × 128 1 \times 128 1×128 的瓦片为基础对元素进行分组和缩放(即每个词元每 128 个通道);(2)对于权重,以 128 × 128 128 \times 128 128×128 的块为基础对元素进行分组和缩放(即每 128 个输入通道对应每 128 个输出通道)。这种方法确保量化过程能够通过根据较小的元素组调整缩放比例,更好地处理异常值。
DeepSeek-V3 方法的一个关键改进是在 GEMM 操作的内维度引入每组缩放因子。标准的 FP8 GEMM 并不直接支持此功能。然而,结合 DeepSeek-V3 精确的 FP32 累加策略,则可以高效实现。
值得注意的是,DeepSeek-V3 的细粒度量化策略与微缩放格式的理念高度一致,而英伟达下一代 GPU(Blackwell 系列)的张量核心已宣布支持具有更细量化粒度的微缩放格式。
4.4.2.2、提高累加精度
低精度 GEMM 操作经常面临下溢问题,其准确性在很大程度上依赖于高精度累加,通常这一过程以 FP32 精度执行。然而,在英伟达 H800 GPU 上,FP8 GEMM 的累加精度仅限于保留约 14 位,这明显低于 FP32 的累加精度。当内维度 K 较大时,这个问题会更加突出,这是大规模模型训练中增加批量大小和模型宽度时的典型场景。以两个随机矩阵的 GEMM 操作(K = 4096)为例,在初步测试中,张量核心有限的累加精度导致最大相对误差接近 2%。尽管存在这些问题,有限的累加精度在一些 FP8 框架中仍是默认选项,严重限制了训练精度。
为解决此问题,DeepSeek-V3 采用提升到 CUDA 核心以获得更高精度的策略。过程如上图 7(b)所示。具体来说,在张量核心执行矩阵乘加(MMA)操作时,中间结果使用有限的位宽进行累加。一旦达到间隔 N C NC NC,这些部分结果将被复制到 CUDA 核心的 FP32 寄存器中,在那里进行全精度的 FP32 累加。如前所述,DeepSeek-V3 的细粒度量化沿内维度 K 应用每组缩放因子。这些缩放因子可以在 CUDA 核心上作为反量化过程高效相乘,且额外计算成本最小。
值得注意的是,此修改降低了单个线程束组的线程束组级矩阵乘加(WGMMA)指令发布率。然而,在 H800 架构中,典型情况是两个 WGMMA 可以同时持续执行:当一个线程束组执行提升操作时,另一个能够执行 MMA 操作。这种设计使两个操作可以重叠,保持张量核心的高利用率。基于实验,设置 N C = 128 NC = 128 NC=128 个元素,相当于 4 个 WGMMAs,是能够显著提高精度且不引入大量开销的最小累加间隔。
4.4.2.3、尾数优先于指数
与先前工作采用的混合 FP8 格式不同,他们在前向传播(Fprop)中使用 E4M3(4 位指数和 3 位尾数),在激活反向传播(Dgrad)和权重反向传播(Wgrad)中使用 E5M2(5 位指数和 2 位尾数),DeepSeek-V3 对所有张量采用 E4M3 格式以获得更高精度。将这种方法的可行性归因于 DeepSeek-V3 的细粒度量化策略,即瓦片式和块式缩放。通过对较小的元素组进行操作,DeepSeek-V3 的方法有效地在这些分组元素之间共享指数位,减轻了有限动态范围的影响。
4.4.2.4、在线量化
张量级量化框架采用延迟量化,它维护先前迭代中的最大绝对值历史以推断当前值。为确保准确的缩放并简化框架,DeepSeek-V3 为每个 1 × 128 1 \times 128 1×128 的激活瓦片或 128 × 128 128 \times 128 128×128 的权重块在线计算最大绝对值。基于此导出缩放因子,然后将激活值或权重在线量化为 FP8 格式。
4.4.3、低精度存储和通信
结合 FP8 训练框架,DeepSeek-V3 通过将缓存的激活值和优化器状态压缩为低精度格式,进一步降低内存消耗和通信开销。
4.4.3.1、低精度优化器状态
DeepSeek-V3 采用 BF16 数据格式而非 FP32 来跟踪 AdamW 优化器中的一阶矩和二阶矩,且不会导致可察觉的性能下降。不过,主权重(由优化器存储)和梯度(用于批量大小累积)仍保留为 FP32 格式,以确保整个训练过程中的数值稳定性。
4.4.3.2、低精度激活
Wgrad 操作以 FP8 格式执行,为降低内存消耗,在 Linear 算子的反向传播中,将激活值缓存为 FP8 格式是很自然的选择。然而,对于一些算子,为实现低成本的高精度训练,需进行特殊考量:
- 注意力算子之后的Linear的输入:这些激活值也用于注意力算子的反向传播,这使得它们对精度很敏感。DeepSeek-V3 专门为这些激活值采用定制的 E5M6 数据格式。此外,在反向传播中,这些激活值将从 1 × 128 1 \times 128 1×128 的量化块转换为 128 × 1 128 \times 1 128×1 的量化块。为避免引入额外的量化误差,所有缩放因子均进行舍入缩放,即 2 的整数次幂
- 混合专家(MoE)中SwiGLU算子的输入:为进一步降低内存成本,缓存 SwiGLU 算子的输入,并在反向传播中重新计算其输出。这些激活值也使用 DeepSeek-V3 的细粒度量化方法存储为 FP8 格式,在内存效率和计算精度之间取得平衡
4.4.3.3、低精度通信
通信带宽是 MoE 模型训练中的关键瓶颈。为应对这一挑战,在 MoE 上投影之前将激活值量化为 FP8,然后应用调度组件,这与 MoE 上投影中的 FP8 正向传播兼容。与注意力算子之后的 Linear 的输入类似,此激活值的缩放因子为 2 的整数次幂。类似的策略也应用于 MoE 下投影之前的激活梯度。对于前向和反向组合组件,将它们保留为 BF16 格式,以在训练流程的关键部分保持训练精度。
4.4、推理和部署
DeepSeek-V3 部署在 H800 集群上,集群内每个节点中的 GPU 通过 NVLink 互连,而整个集群中的所有 GPU 通过 IB 实现全互连。为了同时确保在线服务的服务水平目标(SLO)和高吞吐量,采用以下将预填充和解码阶段分开的部署策略。
4.4.1、预填充
预填充阶段的最小部署单元由 4 个节点共 32 个 GPU 组成。注意力部分采用结合序列并行(SP)的 4 路张量并行(TP4),以及 8 路数据并行(DP8)。其较小的 TP 规模(大小为 4)限制了张量并行通信的开销。对于混合专家(MoE)部分,DeepSeek-V3 使用 32 路专家并行(EP32),这确保每个专家处理足够大的批量大小,从而提高计算效率。
对于 MoE 的全对全通信,DeepSeek-V3 使用与训练中相同的方法:首先通过 IB 在节点间传输令牌,然后通过 NVLink 在节点内的 GPU 之间转发。特别地,对于浅层的密集多层感知器(MLP),使用 1 路张量并行以节省张量并行通信开销。
为了在 MoE 部分的不同专家之间实现负载均衡,需要确保每个 GPU 处理的 token 数量大致相同。为此引入冗余专家的部署策略,即复制高负载专家并进行冗余部署。高负载专家是根据在线部署期间收集的统计信息检测出来的,并定期进行调整(例如每 10 分钟一次)。在确定冗余专家集合后,根据观察到的负载在节点内的 GPU 之间仔细重新安排专家,力求在不增加跨节点全对全通信开销的情况下,尽可能平衡各 GPU 之间的负载。DeepSeek-V3 在预填充阶段设置 32 个冗余专家。对于每个 GPU,除了其原本承载的 8 个专家外,还将额外承载一个冗余专家。
此外,在预填充阶段,为了提高吞吐量并隐藏全对全通信和张量并行通信的开销,同时处理两个计算工作量相似的微批次,将一个微批次的注意力和 MoE 操作与另一个微批次的分发和合并操作重叠。
最后,DeepSeek-V3 正在探索一种专家动态冗余策略,即每个 GPU 承载更多的专家(例如 16 个专家),但在每次推理步骤中仅激活 9 个。在每一层的全对全操作开始之前,DeepSeek-V3 实时计算全局最优路由方案。鉴于预填充阶段涉及大量计算,计算此路由方案的开销几乎可以忽略不计。
4.4.2、解码
在解码过程中,将共享专家视为被路由的专家。从这个角度看,每个令牌在路由过程中会选择 9 个专家,其中共享专家被视为高负载专家,总会被选中。解码阶段的最小部署单元由 40 个节点共 320 个 GPU 组成。注意力部分采用结合序列并行(SP)的4路张量并行(TP4),以及 80 路数据并行(DP80),而混合专家(MoE)部分则使用 320 路专家并行(EP320)。在 MoE 部分,每个 GPU 仅承载一个专家,64 个 GPU 负责承载冗余专家和共享专家。分发和合并部分的全对全通信通过 IB 上的直接点对点传输来实现,以达到低延迟。此外,DeepSeek-V3 利用 IBGDA 技术进一步降低延迟并提高通信效率。
与预填充类似,根据在线服务中专家负载的统计数据,在特定间隔内定期确定冗余专家集合。不过,由于每个 GPU 仅承载一个专家,因此无需重新安排专家。此外,为了提高吞吐量并隐藏全对全通信的开销,DeepSeek-V3 还在探索在解码阶段同时处理两个计算工作量相似的微批次。与预填充不同,在解码阶段注意力部分消耗的时间占比更大。因此,将一个微批次的注意力操作与另一个微批次的分发 + MoE + 合并操作重叠。在解码阶段,每个专家的批次大小相对较小(通常在256个令牌以内),瓶颈在于内存访问而非计算。由于 MoE 部分只需要加载一个专家的参数,内存访问开销极小,所以使用较少的流式多处理器(SM)不会显著影响整体性能。因此,为避免影响注意力部分的计算速度,可以仅分配一小部分 SM 给分发 + MoE + 合并操作。
4.5、预训练
4.5.1、数据构建
与 DeepSeek-V2 相比,DeepSeek-V3 通过提高数学和编程样本的比例对预训练语料库进行了优化,同时将多语言覆盖范围扩展到英语和中文之外。此外,DeepSeek-V3 对数据处理流程进行了优化,在保持语料库多样性的同时尽量减少冗余。DeepSeek-V3 采用文档打包方法以保证数据完整性,但在训练过程中不采用跨样本注意力掩码。最终,DeepSeek-V3 的训练语料库在分词器中有 14.8T 高质量且多样的词元。
在 DeepSeekCoder-V2 的训练过程中,“填中间”(Fill-in-Middle,FIM)策略在不损害下一词元预测能力的同时,能使模型基于上下文线索准确预测中间文本。与 DeepSeekCoder-V2 一致,在 DeepSeek-V3 的预训练中也采用了 FIM 策略。具体来说,使用 “前缀-后缀-中间”(Prefix-Suffix-Middle,PSM)框架按如下方式构建数据:
KaTeX parse error: Expected 'EOF', got '_' at position 13: \text{<|fim_̲begin|>} f_{\te…
这种结构在文档层面作为预打包过程的一部分应用。FIM 策略以 0.1 的比例应用,与 PSM 框架一致。
DeepSeek-V3 的分词器采用字节级字节对编码(Byte-level BPE),词汇表扩展到 12.8万 个词元。DeepSeek-V3 对分词器的预分词器和训练数据进行了修改,以优化多语言压缩效率。此外,与DeepSeek-V2 相比,新的预分词器引入了将标点符号和换行符组合在一起的词元。然而,当模型处理无末尾换行符的多行提示时,尤其是在少样本评估提示中,这种方法可能会引入词元边界偏差。为解决这一问题,DeepSeek-V3 在训练过程中随机拆分一定比例的此类组合词元,这使模型接触到更广泛的特殊情况,从而减轻这种偏差。
4.5.2、超参数
4.5.2.1、模型超参数
DeepSeek-V3 将 Transformer 层数设置为 61 层,隐藏维度设置为 7168。所有可学习参数均以 0.006 的标准差进行随机初始化。在多尺度局部注意力(MLA)中,DeepSeek-V3 将注意力头的数量
n
h
n_h
nh 设置为 128,每个头的维度
d
h
d_h
dh 设置为 128。键值(KV)压缩维度
d
c
d_c
dc 设置为 512,查询压缩维度
d
c
′
d'_c
dc′ 设置为 1536。对于解耦的 query
和 key
,将每个头的维度
d
h
R
d^R_h
dhR 设置为 64。除了前三层,DeepSeek-V3 将所有前馈神经网络(FFN)替换为混合专家(MoE)层。每个 MoE 层由 1 个共享专家和 256 个路由专家组成,每个专家的中间隐藏维度为 2048。在路由专家中,每个词元会激活 8 个专家,并且确保每个词元最多被发送到 4 个节点。多词元预测深度
D
D
D 设置为 1,即除了预测紧邻的下一个词元外,每个词元还会额外预测一个词元。与 DeepSeek-V2 一样,DeepSeek-V3 也在压缩后的潜在向量之后采用额外的 RMSNorm 层,并在宽度瓶颈处乘以额外的缩放因子。在此配置下,DeepSeek-V3 总共有 6710亿 个参数,每个词元会激活 37亿 个参数。
4.5.2.2、训练超参数
DeepSeek-V3 采用 AdamW 优化器,超参数设置为 β 1 = 0.9 \beta_1 = 0.9 β1=0.9, β 2 = 0.95 \beta_2 = 0.95 β2=0.95,权重衰减为 0.1。在预训练期间,将最大序列长度设置为 4K,并在 14.8T 词元上对 DeepSeek-V3 进行预训练。关于学习率调度,在前 2000 步中,先将学习率从 0 线性增加到 2.2 × 1 0 − 4 2.2×10^{−4} 2.2×10−4。然后,在模型处理 10T 训练词元之前,保持 2.2 × 1 0 − 4 2.2×10^{−4} 2.2×10−4 的恒定学习率。随后,在接下来的 4.3T 词元训练过程中,按照余弦退火曲线将学习率逐渐衰减至 2.2 × 1 0 − 5 2.2×10^{−5} 2.2×10−5。在最后 5000亿 词元的训练中,前 3330亿 词元保持 2.2 × 1 0 − 5 2.2×10^{−5} 2.2×10−5 的恒定学习率,在剩余的 1670亿 词元中切换到 7.3 × 1 0 − 6 7.3×10^{−6} 7.3×10−6 的恒定学习率。梯度裁剪范数设置为 1.0。DeepSeek-V3 采用批量大小调度策略,在训练前 4690亿 词元时,批量大小从 3072 逐渐增加到 15360,在剩余的训练过程中保持 15360。DeepSeek-V3 利用流水线并行技术将模型的不同层部署在不同的 GPU 上,对于每一层,路由专家将均匀部署在属于 8 个节点的 64 个 GPU 上。对于节点限制路由,每个词元最多被发送到 4 个节点(即 M = 4 M = 4 M=4)。为实现无辅助损失的负载均衡,在前 14.3T 词元的训练中,将偏差更新速度 γ \gamma γ 设置为 0.001,在剩余的 5000亿 词元训练中设置为 0.0。对于平衡损失,将 α \alpha α 设置为 0.0001,只是为了避免任何单个序列内出现极端不平衡。多词元预测(MTP)损失权重 λ \lambda λ 在前 10T 词元设置为 0.3,在剩余的 4.8T 词元设置为 0.1。
4.5.3、长上下文扩展
DeepSeek-V3 采用了与 DeepSeek-V2 类似的方法来实现长上下文处理能力。在预训练阶段之后,应用 YaRN 进行上下文扩展,并执行两个额外的训练阶段,每个阶段包含 1000 步,以逐步将上下文窗口从 4K 扩展到 32K,然后再扩展到 128K。YaRN 的配置与 DeepSeek-V2 中使用的配置一致,仅应用于解耦的共享键 k t R k^R_t ktR 。两个阶段的超参数保持相同,缩放比例 s = 40 s = 40 s=40, α = 1 \alpha = 1 α=1, β = 32 \beta = 32 β=32,缩放因子 t = 0.1 ln s + 1 \sqrt{t} = 0.1 \ln s + 1 t=0.1lns+1。在第一阶段,序列长度设置为32K,批量大小为 1920。在第二阶段,序列长度增加到 128K,批量大小减小到 480。两个阶段的学习率均设置为 7.3 × 1 0 − 6 7.3×10^{−6} 7.3×10−6,与预训练阶段的最终学习率相匹配。
通过这两个阶段的扩展训练,DeepSeek-V3 能够处理长度高达 128K 的输入,同时保持强大的性能。
4.6、后训练
4.6.1、监督式微调
DeepSeek-V3 指令调整数据集包含 150 万个跨越多个领域的实例,每个领域都根据其特定需求采用不同的数据创建方法。
4.6.1.1、推理数据
对于与推理相关的数据集,包括专注于数学、代码竞赛问题和逻辑谜题的数据集,借助 DeepSeek-R1 模型生成数据。具体而言,虽然 R1 生成的数据准确率很高,但存在诸如过度思考、格式不佳以及篇幅过长等问题。DeepSeek-V3 目标是在 R1 生成的推理数据的高准确率与常规格式推理数据的清晰简洁之间找到平衡。
DeepSeek-V3 首先针对特定领域(如代码、数学或通用推理),使用监督微调(SFT)和强化学习(RL)相结合的训练流程开发一个专家模型。这个专家模型将作为最终模型的数据生成器。训练过程涉及为每个实例生成两种不同类型的 SFT 样本:第一种是以 <问题, 原始回答>
的格式将问题与其原始回答配对,而第二种则是在问题和 R1 回答的基础上加入系统提示,格式为 <系统提示, 问题, R1回答>
。
系统提示经过精心设计,包含引导模型生成富含反思与验证机制的回答的指令。在强化学习阶段,即使没有明确的系统提示,模型也会利用高温采样生成融合了 R1 生成数据和原始数据模式的回答。经过数百步强化学习后,中间的强化学习模型学会融入 R1 模式,从而从策略上提升整体性能。
在完成强化学习训练阶段后,DeepSeek-V3 采用拒绝采样为最终模型精心挑选高质量的 SFT 数据,此时专家模型被用作数据生成源。这种方法确保最终的训练数据既保留了 DeepSeek-R1 的优势,又能生成简洁有效的回答。
4.6.1.2、非推理数据
对于非推理数据,如创意写作、角色扮演和简单问答,DeepSeek-V3 利用 DeepSeek-V2.5 生成回答,并聘请人工标注员来验证数据的准确性和正确性。
4.6.1.3、SFT设置
DeepSeek-V3 使用 SFT 数据集对 DeepSeek-V3-Base 进行两个轮次的微调,采用余弦退火学习率调度,起始学习率为 5 × 1 0 − 6 5×10^{-6} 5×10−6,并逐渐降至 1 × 1 0 − 6 1×10^{-6} 1×10−6。在训练过程中,每个单一序列由多个样本打包而成。DeepSeek-V3 采用样本掩码策略,以确保这些示例相互隔离且不可见。
4.6.2、强化学习
4.6.2.1、奖励模型
在强化学习(RL)过程中,DeepSeek-V3 采用了基于规则的奖励模型(RM)和基于模型的奖励模型。
a、基于规则的奖励模型
对于那些可以用特定规则验证的问题,DeepSeek-V3 采用基于规则的奖励系统来确定反馈。例如,某些数学问题有确切的答案,要求模型按照指定格式(如放在方框内)给出最终答案,以便运用规则来验证其正确性。同样,对于力扣(LeetCode)上的题目,可以利用编译器根据测试用例生成反馈。只要有可能,DeepSeek-V3 就利用基于规则的验证,以确保更高的可靠性,因为这种方法不易被操纵或利用。
b、基于模型的奖励模型
对于那些参考答案形式自由的问题,DeepSeek-V3 依靠奖励模型来判断回答是否符合预期的参考答案。相反,对于没有明确参考答案的问题,比如创意写作类的问题,奖励模型则根据问题及相应的回答作为输入来提供反馈。该奖励模型是从 DeepSeek-V3 的有监督微调(SFT)检查点训练得到的。为了提高其可靠性,DeepSeek-V3 构建了偏好数据,这些数据不仅给出最终奖励,还包含得出该奖励的推理过程。这种方法有助于降低在特定任务中出现奖励操控行为的风险。
4.6.2.2、群组相对策略优化
与 DeepSeek-V2 类似,DeepSeek-V3 采用群组相对策略优化(Group Relative Policy Optimization,GRPO),该方法摒弃了通常与策略模型规模相同的价值评判模型,而是从组分数中估计基线。具体而言,对于每个问题 q q q,GRPO 从旧策略模型 π θ o l d \pi_{\theta_{old}} πθold 中采样一组输出 o 1 , o 2 , ⋯ , o G \\{o_1, o_2, \cdots, o_G\\} o1,o2,⋯,oG,然后通过最大化以下目标来优化策略模型 π θ \pi_{\theta} πθ:
J G R P O ( θ ) = E [ q ∼ P ( Q ) , { o i } i = 1 G ∼ π θ old ( O ∣ q ) ] 1 G ∑ i = 1 G ( min ( π θ ( o i ∣ q ) π θ old ( o i ∣ q ) A i , clip ( π θ ( o i ∣ q ) π θ old ( o i ∣ q ) , 1 − ε , 1 + ε ) A i ) − β D K L ( π θ ∣ ∣ π r e f ) ) , \begin{align*} \mathcal{J}_{G R P O}(\theta)=& \mathbb{E}\left[q\sim P(Q),\left\{o_i\right\}_{i=1}^G\sim\pi_{\theta_{\text{old}}}(O\mid q)\right]\\ &\frac{1}{G}\sum_{i=1}^G\left(\min\left(\frac{\pi_\theta\left(o_i\mid q\right)}{\pi_{\theta_{\text{old}}}\left(o_i\mid q\right)} A_i,\operatorname{clip}\left(\frac{\pi_\theta\left(o_i\mid q\right)}{\pi_{\theta_{\text{old}}}\left(o_i\mid q\right)}, 1-\varepsilon, 1+\varepsilon\right) A_i\right)-\beta \mathbb{D}_{K L}\left(\pi_\theta || \pi_{r e f}\right)\right), \end{align*} JGRPO(θ)=E[q∼P(Q),{oi}i=1G∼πθold(O∣q)]G1i=1∑G(min(πθold(oi∣q)πθ(oi∣q)Ai,clip(πθold(oi∣q)πθ(oi∣q),1−ε,1+ε)Ai)−βDKL(πθ∣∣πref)),
D K L ( π θ ∣ ∣ π r e f ) = π r e f ( o i ∣ q ) π θ ( o i ∣ q ) − log π r e f ( o i ∣ q ) π θ ( o i ∣ q ) − 1 \mathbb{D}_{KL} \left( \pi_{\theta} || \pi_{ref} \right) = \frac{\pi_{ref}(o_i|q)}{\pi_{\theta}(o_i|q)} - \log \frac{\pi_{ref}(o_i|q)}{\pi_{\theta}(o_i|q)} - 1 DKL(πθ∣∣πref)=πθ(oi∣q)πref(oi∣q)−logπθ(oi∣q)πref(oi∣q)−1
其中, ε \varepsilon ε 和 β \beta β 是超参数; π r e f \pi_{ref} πref 是参考模型; A i A_i Ai 是优势值,由每组输出对应的奖励 r 1 , r 2 , ⋯ , r G \\{r_1, r_2, \cdots, r_G\\} r1,r2,⋯,rG 得出:
A i = r i − mean ( { r 1 , r 2 , ⋯ , r G } ) std ( { r 1 , r 2 , ⋯ , r G } ) A_i = \frac{r_i - \text{mean}(\{r_1, r_2, \cdots, r_G\})}{\text{std}(\{r_1, r_2, \cdots, r_G\})} Ai=std({r1,r2,⋯,rG})ri−mean({r1,r2,⋯,rG})
在强化学习过程中纳入了来自不同领域的提示,如编码、数学、写作、角色扮演和问答等。这种方法不仅使模型更符合人类偏好,还提升了在基准测试中的性能,特别是在可用的有监督微调(SFT)数据有限的场景下。
5、DeepSeek-R1
DeepSeek-R1-Zero 和 DeepSeek-R1 发布于 2025 年 1 月。DeepSeek-R1-Zero 通过大规模强化学习训练而成,该模型在不使用任何 SFT 数据的情况下,直接将强化学习应用于基础模型。DeepSeek-R1 则在强化学习之前结合了多阶段训练和冷启动数据。
DeepSeek-R1-Zero 直接将强化学习应用于基础模型,而不依赖于监督微调作为初步步骤。其展现了自我验证、反思以及生成长思维链等能力,证实了大型语言模型(LLM)通过大规模强化学习(RL)可以显著提高推理能力,甚至无需以监督微调(SFT)作为冷启动方式。此外,加入少量冷启动数据,性能还能进一步提升。
此外,DeepSeek-R1 发现较大模型的推理模式可以被蒸馏到较小模型中,从而在推理性能上超越通过在小模型上进行强化学习发现的推理模式。
5.1、DeepSeek-R1-Zero:在基础模型上进行强化学习
5.1.1、强化学习算法
群组相对策略优化
为降低强化学习的训练成本,DeepSeek-R1-Zero 采用群组相对策略优化(Group Relative Policy Optimization,GRPO)。该方法舍弃了通常与策略模型规模相同的价值评估模型,而是从组得分中估计基线。具体而言,对于每个问题 q q q,GRPO 从旧策略 π θ o l d \pi_{\theta_{old}} πθold 中采样一组输出 o 1 , o 2 , ⋯ , o G \\{o_1, o_2, \cdots, o_G\\} o1,o2,⋯,oG,然后通过最大化以下目标来优化策略模型 π θ \pi_{\theta} πθ:
J G R P O ( θ ) = E [ q ∼ P ( Q ) , { o i } i = 1 G ∼ π θ o l d ( O ∣ q ) ] 1 G ∑ i = 1 G ( min ( π θ ( o i ∣ q ) π θ o l d ( o i ∣ q ) A i , clip ( π θ ( o i ∣ q ) π θ o l d ( o i ∣ q ) , 1 − ε , 1 + ε ) A i ) − β D K L ( π θ ∥ π r e f ) ) , \begin{align*} \mathcal{J}_{G R P O}(\theta)=& \mathbb{E}\left[q\sim P(Q),\left\{o_{i}\right\}_{i=1}^{G}\sim\pi_{\theta_{o l d}}(O\mid q)\right] \\ &\frac{1}{G}\sum_{i=1}^{G}\left(\min\left(\frac{\pi_{\theta}\left(o_{i}\mid q\right)}{\pi_{\theta_{o l d}}\left(o_{i}\mid q\right)} A_{i},\operatorname{clip}\left(\frac{\pi_{\theta}\left(o_{i}\mid q\right)}{\pi_{\theta_{o l d}}\left(o_{i}\mid q\right)}, 1-\varepsilon, 1+\varepsilon\right) A_{i}\right)-\beta \mathbb{D}_{K L}\left(\pi_{\theta}\|\pi_{r e f}\right)\right), \end{align*} JGRPO(θ)=E[q∼P(Q),{oi}i=1G∼πθold(O∣q)]G1i=1∑G(min(πθold(oi∣q)πθ(oi∣q)Ai,clip(πθold(oi∣q)πθ(oi∣q),1−ε,1+ε)Ai)−βDKL(πθ∥πref)),
D K L ( π θ ∣ ∣ π r e f ) = π r e f ( o i ∣ q ) π θ ( o i ∣ q ) − log π r e f ( o i ∣ q ) π θ ( o i ∣ q ) − 1 \mathbb{D}_{KL} \left( \pi_{\theta} || \pi_{ref} \right) = \frac{\pi_{ref}(o_i|q)}{\pi_{\theta}(o_i|q)} - \log \frac{\pi_{ref}(o_i|q)}{\pi_{\theta}(o_i|q)} - 1 DKL(πθ∣∣πref)=πθ(oi∣q)πref(oi∣q)−logπθ(oi∣q)πref(oi∣q)−1
其中, ε \varepsilon ε 和 β \beta β 是超参数, A i A_i Ai 是优势值,使用与每组输出对应的一组奖励 r 1 , r 2 , ⋯ , r G \\{r_1, r_2, \cdots, r_G\\} r1,r2,⋯,rG 计算得出:
A i = r i − mean ( { r 1 , r 2 , ⋯ , r G } ) std ( { r 1 , r 2 , ⋯ , r G } ) A_i = \frac{r_i - \text{mean}(\{r_1, r_2, \cdots, r_G\})}{\text{std}(\{r_1, r_2, \cdots, r_G\})} Ai=std({r1,r2,⋯,rG})ri−mean({r1,r2,⋯,rG})
5.1.2、奖励建模
奖励是训练信号的来源,决定了强化学习的优化方向。DeepSeek-R1-Zero 采用了一种基于规则的奖励系统,该系统主要包含两种奖励类型:
- 准确率奖励:准确率奖励模型用于评估回复是否正确。例如,对于有确定答案的数学问题,要求模型以指定格式(例如,在框内)给出最终答案,以便基于规则可靠地验证其正确性。同样,对于力扣(LeetCode)问题,可以使用编译器根据预定义的测试用例生成反馈
- 格式奖励:除了准确率奖励模型,还采用了格式奖励模型,该模型强制模型将其思考过程置于
<think>
和</think>
标签之间。
在开发 DeepSeek-R1-Zero 时,没有应用结果或过程神经奖励模型,因为神经奖励模型在大规模强化学习过程中可能会遭遇奖励作弊问题,而且重新训练奖励模型需要额外的训练资源,这会使整个训练流程变得复杂。
5.1.3、训练模板
为了训练 DeepSeek-R1-Zero,首先设计一个简单的模板,引导基础模型遵循指定的指令。如表所示,该模板要求 DeepSeek-R1-Zero 首先生成一个推理过程,然后给出最终答案。DeepSeek-R1-Zero 特意将约束限定在这种结构格式上,避免任何特定于内容的偏向,比如强制进行反思性推理或推崇特定的解题策略,以确保能够准确观察模型在强化学习过程中的自然进展。
5.1.4、DeepSeek-R1-Zero 的性能、自我进化过程以及顿悟时刻
5.1.4.1、DeepSeek-R1-Zero 的性能
如图展示了 DeepSeek-R1-Zero 在 2024 年美国数学邀请赛(AIME)基准测试中,整个强化学习训练过程的性能轨迹。随着强化学习训练的推进,DeepSeek-R1-Zero 的性能呈现出稳定且持续的提升。
下表对 DeepSeek-R1-Zero 和 OpenAI 的 o1-0912 模型在各种推理相关基准测试上进行了对比分析。结果表明,强化学习使 DeepSeek-R1-Zero 无需任何监督微调数据就能获得强大的推理能力。此外,通过应用多数投票法,DeepSeek-R1-Zero 的性能还能进一步提升。例如,在 AIME 基准测试中采用多数投票法时,DeepSeek-R1-Zero 的性能从 71.0% 提升至 86.7%,从而超过了 OpenAI-o1-0912 的性能。
5.1.4.2、DeepSeek-R1-Zero 的自我进化过程
DeepSeek-R1-Zero 的自我进化过程生动地展示了强化学习如何驱动模型自主提升其推理能力。通过直接从基础模型启动强化学习,能够在不受监督微调阶段影响的情况下,密切监测模型的进展。这种方法清晰地呈现了模型随时间的演变,尤其是在处理复杂推理任务的能力方面。
如图所示,DeepSeek-R1-Zero 的思考时间在整个训练过程中持续改善。这种改善并非外部调整的结果,而是模型内部的固有发展。DeepSeek-R1-Zero 通过利用更长的测试时间计算,自然地获得了解决日益复杂推理任务的能力。这种计算范围从生成数百到数千个推理标记不等,使模型能够更深入地探索和完善其思考过程。
自我演化的最显著特点之一是随着测试时计算的增加,出现了复杂的行为。比如反思行为——模型回顾并重新评估其先前步骤——以及探索解决问题的替代方法,这些行为都自发产生。这些行为并非明确编程设定,而是模型与强化学习环境相互作用的结果。这种自发发展显著增强了 DeepSeek-R1-Zero 的推理能力,使其能够以更高的效率和准确性应对更具挑战性的任务。
5.1.4.3、DeepSeek-R1-Zero 的顿悟时刻
在 DeepSeek-R1-Zero 的训练过程中观察到一个特别有趣的现象,即 “顿悟时刻(aha moment)” 的出现。如表所示,这一时刻出现在模型的一个中间版本中。在此阶段,DeepSeek-R1-Zero 学会了通过重新评估其初始方法,为一个问题分配更多思考时间。这种行为不仅证明了模型推理能力的不断增强,也是强化学习如何能带来意想不到且复杂结果的一个引人入胜的例子。
这个时刻不仅对模型来说是一个 “顿悟时刻”,对观察其行为的研究人员来说也是如此。它突显了强化学习的力量与美妙之处:我们并非明确教导模型如何解决问题,而只是为其提供正确的激励,它就能自主开发出先进的问题解决策略。“顿悟时刻” 有力地提醒我们,强化学习有潜力在人工系统中解锁新的智能水平,为未来更自主、自适应的模型发展铺平道路。
5.1.44、DeepSeek-R1-Zero 的缺点
尽管 DeepSeek-R1-Zero 展现出强大的推理能力,并自主发展出意想不到且强大的推理行为,但它面临一些问题。例如,DeepSeek-R1-Zero 在可读性差和语言混用等挑战上存在困难。为了使推理过程更具可读性并与开放社区分享,从而探索了 DeepSeek-R1,这是一种结合人类友好型冷启动数据使用强化学习的方法。
5.2、DeepSeek-R1:带有冷启动的强化学习
受 DeepSeek-R1-Zero 取得的出色成果启发,两个很自然的问题出现了:
- 通过引入少量高质量数据作为冷启动,能否进一步提升推理性能或加快收敛速度?
- 如何训练一个既能够生成清晰连贯的思维链(CoT),又具备强大通用能力的用户友好型模型?
为解决这些问题,设计一个用于训练 DeepSeek-R1 的流程。该流程包含四个阶段,具体如下。
5.2.1、冷启动
与 DeepSeek-R1-Zero 不同,为避免从基础模型进行强化学习训练时早期冷启动阶段的不稳定,对于 DeepSeek-R1 构建并收集了少量长思维链(CoT)数据,对模型进行微调,以此作为初始的强化学习行动者。为收集此类数据探索了多种方法:以长思维链作为示例进行少样本提示,直接促使模型生成带有反思与验证的详细答案,收集格式可读的 DeepSeek-R1-Zero 输出结果,并由人工注释者通过后处理优化这些结果。
在这项工作中收集了数千条冷启动数据,对 DeepSeek-V3-Base 进行微调,将其作为强化学习的起点。与 DeepSeek-R1-Zero 相比,冷启动数据的优势包括:
- 可读性:DeepSeek-R1-Zero 的一个关键局限在于其内容往往不适合阅读。回复可能夹杂多种语言,或者缺少用于为用户突出答案的 Markdown 格式。相比之下,在为 DeepSeek-R1 创建冷启动数据时设计了一种可读模式,在每个回复的结尾处添加总结,并过滤掉不便于阅读的回复。在此,将输出格式定义为
|特殊标记|<推理过程>|特殊标记|<总结>
,其中推理过程是针对查询的思维链,总结则用于概括推理结果 - 潜力:通过借助人类先验知识精心设计冷启动数据的模式,观察到其性能优于 DeepSeek-R1-Zero。迭代训练对于推理模型而言是一种更优的方式
5.2.2、以推理为导向的强化学习
DeepSeek-R1 训练数据的收集方式如下:
在冷启动数据上对 DeepSeek-V3-Base 进行微调后,采用与 DeepSeek-R1-Zero 相同的大规模强化学习训练流程。此阶段着重提升模型的推理能力,尤其是在诸如编码、数学、科学及逻辑推理等推理密集型任务上,这些任务涉及定义明确且有清晰解法的问题。
在训练过程中注意到思维链(CoT)经常出现语言混用的情况,特别是当强化学习提示涉及多种语言时。为缓解语言混用问题,在强化学习训练中引入语言一致性奖励,该奖励按思维链中目标语言词汇的比例来计算。尽管消融实验表明,这种调整会使模型性能略有下降,但该奖励符合人类偏好,使输出更具可读性。最后,通过直接将推理任务的准确率与语言一致性奖励相加,形成最终奖励。然后,对微调后的模型进行强化学习训练,直至其在推理任务上达到收敛。
5.2.3、拒绝采样和监督式微调
当面向推理的强化学习收敛后,利用得到的检查点为下一轮收集监督微调(SFT)数据。与最初主要聚焦于推理的冷启动数据不同,此阶段纳入了来自其他领域的数据,以提升模型在写作、角色扮演及其他通用任务方面的能力。具体而言,按如下方式生成数据并微调模型。
5.2.3.1、推理数据
DeepSeek-R1 精心整理推理提示,并通过对上述强化学习训练得到的检查点进行拒绝采样来生成推理轨迹。在前一阶段,仅纳入了能够使用基于规则的奖励进行评估的数据。然而在本阶段,通过纳入更多数据来扩充数据集,其中一些数据借助生成式奖励模型,将真实值与模型预测结果输入 DeepSeek-V3 进行判断。此外,由于模型输出有时杂乱且难以阅读,过滤掉了语言混杂的思维链、冗长段落以及代码块。对于每个提示,采样多个回复,仅保留正确的回复。总体而言,收集了约 60万 个与推理相关的训练样本。
5.2.3.2、非推理数据
对于非推理数据,如写作、事实性问答、自我认知以及翻译等,采用 DeepSeek-V3 流程,并复用 DeepSeek-V3 的部分监督微调数据集。对于某些非推理任务,在通过提示回答问题之前,调用 DeepSeek-V3 生成一个潜在的思维链。不过,对于诸如 “你好” 这类简单查询,回复中不提供思维链。最终,总共收集了约 20万 个与推理无关的训练样本。
使用上述精心整理的约 80万 个样本的数据集,对 DeepSeek-V3-Base 进行两个轮次的微调。
5.2.4、所有场景下的强化学习
为了让模型更贴合人类偏好,DeepSeek-V3 实施了第二阶段强化学习,旨在提升模型的有用性与无害性,同时优化其推理能力。具体来说,DeepSeek-V3 结合奖励信号和多样化的提示分布来训练模型。
对于推理数据,遵循 DeepSeek-R1-Zero 中概述的方法,利用基于规则的奖励,在数学、代码和逻辑推理领域引导学习过程。
对于通用数据,借助奖励模型,捕捉人类在复杂微妙场景中的偏好。基于 DeepSeek-V3 流程进行构建,并采用类似的偏好对分布和训练提示。
在有用性方面,只关注最终总结,确保评估着重于回复对用户的实用性和相关性,同时尽量减少对底层推理过程的干扰。
在无害性方面,评估模型的整个回复,包括推理过程和总结,以识别并减轻生成过程中可能出现的任何潜在风险、偏差或有害内容。
最终,奖励信号与多样化数据分布的整合,训练出一个在优先确保有用性和无害性的同时,推理能力出色的模型。
5.3、蒸馏:赋予小型模型推理能力
为了让更高效的小模型具备类似 DeepSeek-R1 的推理能力,直接使用为 DeepSeek-R1 精心整理的 80万 个样本,对如 Qwen 和 LLaMa 这样的开源模型进行微调。结果表明,这种简单直接的提炼方法显著提升了小模型的推理能力。
对于提炼后的模型仅应用监督微调(SFT),不纳入强化学习(RL)阶段,尽管加入强化学习能大幅提升模型性能。在此的主要目的是展示提炼技术的有效性,将强化学习阶段的探索留给更广泛的研究群体。
参考文献
- DeepSeek LLM Scaling Open-Source Language Models with Longtermism
- DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models
- DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model
- YaRN: Efficient Context Window Extension of Large Language Models
- DeepSeek-V3 Technical Report
- DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning