# DeepSeek-V3

# Multi-Head Latent Attention

MLA 的核心是:将所有注意力头的 Key 和 Value 联合压缩为一个共享的低维潜在向量,并将用于 RoPE 的位置分量单独处理,从而减少推理时的 KV Cache。 各个头通过不同的投影矩阵使用这份共享表示。

以下以单层、单个 Token 为例,采用列向量表示:

符号含义维度
hth_t第 tt 个 Token 的输入隐藏表示dd
nhn_h注意力头数标量
dhd_h每个头的内容 Key、Query 和 Value 维度标量
dhRd_h^R每个头的 RoPE 分量维度标量

其中,dc,dc′≪nhdhd_c,d_c'\ll n_h d_h。上标 CC 表示内容分量,RR 表示应用 RoPE 的位置分量。

# KeyValue

首先,将输入压缩为一个共享的 KV 潜在向量:

ctKV=WDKVht,WDKV∈Rdc×d,ctKV∈Rdc.c_t^{KV}=W^{DKV}h_t, \qquad W^{DKV}\in\mathbb{R}^{d_c\times d}, \qquad c_t^{KV}\in\mathbb{R}^{d_c}.

对于第 ii 个头,分别通过上投影获得内容 Key 和 Value:

kt,iC=WiUKctKV,vt,iC=WiUVctKV,k_{t,i}^C=W_i^{UK}c_t^{KV}, \qquad v_{t,i}^C=W_i^{UV}c_t^{KV},

WiUK,WiUV∈Rdh×dc,kt,iC,vt,iC∈Rdh.W_i^{UK},W_i^{UV}\in\mathbb{R}^{d_h\times d_c}, \qquad k_{t,i}^C,v_{t,i}^C\in\mathbb{R}^{d_h}.

这里的 WiUKW_i^{UK} 和 WiUVW_i^{UV} 是完整上投影矩阵中对应第 ii 个头的行块。所有头读取同一个 ctKVc_t^{KV},但通过不同投影得到各自的 Key 和 Value。

与此同时,直接从原始输入生成独立的位置 Key:

ktR=RoPE⁡t(WKRht),WKR∈RdhR×d,ktR∈RdhR.k_t^R=\operatorname{RoPE}_t(W^{KR}h_t), \qquad W^{KR}\in\mathbb{R}^{d_h^R\times d}, \qquad k_t^R\in\mathbb{R}^{d_h^R}.

RoPE⁡t\operatorname{RoPE}_t 表示应用位置 tt 对应的旋转变换。这个位置 Key 在所有头之间共享。第 ii 个头的完整 Key 为:

kt,i=[kt,iC;ktR]∈Rdh+dhR.k_{t,i}=[k_{t,i}^C;k_t^R] \in\mathbb{R}^{d_h+d_h^R}.

因此,每个历史 Token 在每层只需要缓存:

(ctKV,ktR),缓存元素数=dc+dhR.(c_t^{KV},k_t^R), \qquad \text{缓存元素数}=d_c+d_h^R.

不需要持久缓存每个头展开后的 kt,iCk_{t,i}^C 和 vt,iCv_{t,i}^C。

# Query

Query 首先经过另一套下投影:

ctQ=WDQht,WDQ∈Rdc′×d,ctQ∈Rdc′.c_t^Q=W^{DQ}h_t, \qquad W^{DQ}\in\mathbb{R}^{d_c'\times d}, \qquad c_t^Q\in\mathbb{R}^{d_c'}.

随后,第 ii 个头从该潜在向量生成内容 Query 和位置 Query:

qt,iC=WiUQctQ,WiUQ∈Rdh×dc′,qt,iC∈Rdh,q_{t,i}^C=W_i^{UQ}c_t^Q, \qquad W_i^{UQ}\in\mathbb{R}^{d_h\times d_c'}, \qquad q_{t,i}^C\in\mathbb{R}^{d_h},

qt,iR=RoPE⁡t(WiQRctQ),WiQR∈RdhR×dc′,qt,iR∈RdhR.q_{t,i}^R=\operatorname{RoPE}_t(W_i^{QR}c_t^Q), \qquad W_i^{QR}\in\mathbb{R}^{d_h^R\times d_c'}, \qquad q_{t,i}^R\in\mathbb{R}^{d_h^R}.

拼接后得到:

qt,i=[qt,iC;qt,iR]∈Rdh+dhR.q_{t,i}=[q_{t,i}^C;q_{t,i}^R] \in\mathbb{R}^{d_h+d_h^R}.

注意:位置 Query 是各头不同的,位置 Key 则是各头共享的。 Query 的低秩压缩主要用于减少训练时的激活内存;自回归推理通常不需要保存历史 Query。

# 注意力计算

当前位置 tt 的 Query 与历史位置 jj 的 Key 进行匹配。由于内容与位置采用拼接形式,点积可以拆成两项:

st,j,i=(qt,iC)⊤kj,iC+(qt,iR)⊤kjRdh+dhR.s_{t,j,i} = \frac{ (q_{t,i}^C)^\top k_{j,i}^C + (q_{t,i}^R)^\top k_j^R }{ \sqrt{d_h+d_h^R} }.

第一项计算内容匹配,第二项通过 RoPE 引入相对位置信息。对所有可见位置统一归一化后,加权聚合 Value:

at,j,i=exp⁡(st,j,i)∑ℓ=1texp⁡(st,ℓ,i),ot,i=∑j=1tat,j,ivj,iC∈Rdh.a_{t,j,i} = \frac{\exp(s_{t,j,i})} {\sum_{\ell=1}^{t}\exp(s_{t,\ell,i})}, \qquad o_{t,i}=\sum_{j=1}^{t}a_{t,j,i}v_{j,i}^C \in\mathbb{R}^{d_h}.

最后拼接各头输出,投影回模型隐藏维度:

ut=WO[ot,1;…;ot,nh]∈Rd,WO∈Rd×nhdh.u_t=W^O[o_{t,1};\ldots;o_{t,n_h}] \in\mathbb{R}^{d}, \qquad W^O\in\mathbb{R}^{d\times n_h d_h}.

# 潜在向量的作用

在于内容分量不施加 RoPE,可以利用矩阵乘法的结合律,将 Key 上投影转移到当前 Query 一侧:

(qt,iC)⊤kj,iC=(qt,iC)⊤WiUKcjKV=((WiUK)⊤qt,iC)⊤cjKV.(q_{t,i}^C)^\top k_{j,i}^C = (q_{t,i}^C)^\top W_i^{UK}c_j^{KV} = \left((W_i^{UK})^\top q_{t,i}^C\right)^\top c_j^{KV}.

令:

q~t,i=(WiUK)⊤qt,iC∈Rdc.\widetilde q_{t,i}=(W_i^{UK})^\top q_{t,i}^C \in\mathbb{R}^{d_c}.

这样,当前 Query 经过一次变换,就能直接与缓存的 cjKVc_j^{KV} 计算内容分数,无须逐个展开历史 Key。

Value 同样可以先在潜在空间聚合,再上投影:

ot,i=WiUV(∑j=1tat,j,icjKV).o_{t,i} = W_i^{UV} \left( \sum_{j=1}^{t}a_{t,j,i}c_j^{KV} \right).

例如,处理历史 Token 时,每个头都使用同一组 KV 潜在向量,但各头的 Query 和注意力权重不同,因此得到的聚合结果也不同。

# RoPE 数据流

Key 的 RoPE 在一条绕过 KV Latent 的并行分支上。。两者的数据流分别是:

  • Query 位置分支:ht→ctQ→WiQRctQ→RoPE⁡th_t\rightarrow c_t^Q\rightarrow W_i^{QR}c_t^Q\rightarrow\operatorname{RoPE}_t。
  • Key 位置分支:ht→WKRht→RoPE⁡th_t\rightarrow W^{KR}h_t\rightarrow\operatorname{RoPE}_t。
  • KV 内容分支:ht→ctKV→h_t\rightarrow c_t^{KV}\rightarrow 各头的内容 Key 和 Value。

如果对上投影后的内容 Query 和 Key 直接施加 RoPE,令 RtR_t 表示位置 tt 的旋转矩阵,则其点积中会出现:

(qt,iC)⊤Rt⊤RjWiUKcjKV.(q_{t,i}^C)^\top R_t^\top R_j W_i^{UK}c_j^{KV}.

中间的 Rt⊤RjR_t^\top R_j 随历史位置 jj 改变,因而无法像前面那样,把 WiUKW_i^{UK} 简单转移成一个对所有历史位置通用的 Query 变换。将 RoPE 放到独立的小维度位置分支后,内容部分仍然能够直接在 KV 潜在空间计算,位置部分则通过单独缓存的 kjRk_j^R 计算。

# DeepSeekMoE

DeepSeekMoE 用多个专家 FFN 替代单个稠密 FFN,并将专家分成两类:共享专家处理每个 Token,学习通用知识;路由专家根据 Token 的内容选择性激活,学习不同的专业模式。其细粒度设计将专家划分得更小,在控制激活计算量的同时,提供更灵活的专家组合。

设当前 Token 的输入为 ut∈Rdu_t\in\mathbb{R}^d,共有 NsN_s 个共享专家、NrN_r 个路由专家,每个 Token 激活 KrK_r 个路由专家。每个专家均将 dd 维输入映射为 dd 维输出,包含残差连接的结果为:

ht′=ut+∑i=1NsFFNi(s)(ut)+∑i=1Nrgi,tFFNi(r)(ut)∈Rd.h_t' = u_t + \sum_{i=1}^{N_s}\mathrm{FFN}_i^{(s)}(u_t) + \sum_{i=1}^{N_r}g_{i,t}\mathrm{FFN}_i^{(r)}(u_t) \in\mathbb{R}^d.

其中,gi,tg_{i,t} 是路由专家的门控权重,未选中的专家权重为 0,实际不需要计算其输出。

# 可学习中心向量

每个路由专家都有一个可学习中心向量 ei∈Rde_i\in\mathbb{R}^d,通过与输入做点积计算匹配程度。DeepSeek-V2 在所有路由专家之间应用 Softmax:

si,t=exp⁡(ut⊤ei)∑j=1Nrexp⁡(ut⊤ej).s_{i,t} = \frac{\exp(u_t^\top e_i)} {\sum_{j=1}^{N_r}\exp(u_t^\top e_j)}.

DeepSeek-V3 则对每个专家独立应用 Sigmoid:

si,t=Sigmoid(ut⊤ei).s_{i,t}=\mathrm{Sigmoid}(u_t^\top e_i).

设选中的专家索引集合为 It\mathcal I_t,V3 对这些专家的原始亲和度归一化,得到门控权重:

gi,t={si,t∑j∈Itsj,t,i∈It,0,i∉It.g_{i,t} = \begin{cases} \displaystyle\frac{s_{i,t}}{\sum_{j\in\mathcal I_t}s_{j,t}}, & i\in\mathcal I_t,\\ 0,& i\notin\mathcal I_t. \end{cases}

训练时,预测损失通过端到端反向传播,更新 eie_i,让路由器逐渐学会 Token 与专家的匹配关系。Top-K 的离散选择本身通常不可导,但选中专家的门控权重可导。

# 无辅助损失的负载均衡

路由坍塌是指路由器长期将大多数 Token 分配给少数专家,其他专家几乎得不到训练,进一步强化这种集中现象。辅助损失是在预测损失之外加入的额外训练目标,例如用负载均衡损失鼓励专家被均衡使用。它通过反向传播影响路由器。

DeepSeek-V3 主要通过动态路由偏置控制负载:为每个路由专家设置偏置 bib_i,使用修正分数选择专家:

It=TopKIndicesi∈{1,…,Nr}(si,t+bi,Kr).\mathcal I_t = \underset{i\in\{1,\ldots,N_r\}}{\mathrm{TopKIndices}} (s_{i,t}+b_i,\ K_r).

这里 TopKIndices\mathrm{TopKIndices} 返回分数最高的 KrK_r 个专家索引。偏置只影响 “选谁”,门控权重仍由原始分数 si,ts_{i,t} 归一化得到。 每个训练步骤结束后,根据整个批次的专家负载更新偏置:

  • 专家负载过高:bi←bi−γb_i\leftarrow b_i-\gamma,降低后续被选中的机会。
  • 专家负载过低:bi←bi+γb_i\leftarrow b_i+\gamma,增加后续被选中的机会。

其中,γ\gamma 是偏置更新速度。

# 序列级均衡约束

为了避免单个序列内部出现极端不均衡,V3 仍保留一个权重极小的辅助损失:

LBal=α∑i=1NrfiPi.\mathcal L_{\mathrm{Bal}} = \alpha\sum_{i=1}^{N_r}f_iP_i.

其中,fif_i 是按原始亲和度 Top-K 统计并缩放的专家选择频率;PiP_i 是将原始亲和度在所有路由专家间归一化后,该专家在序列中的平均分数。系数 α\alpha 被设为极小值,使这一约束主要用于抑制序列内的极端不均衡。

为控制跨节点通信,每个 Token 最多被发送到 MM 个计算节点。系统对每个节点上最高的 Kr/MK_r/M 个专家亲和度求和,据此选择节点,再在节点约束下选择路由专家,从而促进计算与通信重叠。得益于训练阶段的负载均衡,以及推理阶段的专门部署策略,DeepSeek-V3 在训练和推理中均不丢弃 Token。

# Multi-Token Prediction

传统语言模型在每个位置预测下一个 Token;DeepSeek-V3 的多 Token 预测(Multi-Token Prediction,MTP)则增加额外的预测目标,使当前位置的表示也参与多个未来 Token 的预测。这样可以提供更密集的训练信号,并促使主模型学习有助于后续预测的表示。

DeepSeek-V3 使用 DD 个串联的 MTP 模块,额外预测 DD 个 Token。预测深度 kk 表示沿 MTP 模块额外向未来预测了几步。

# MTP 模块

第 kk 个模块包含与主模型共享的嵌入层和输出头,以及自身的投影矩阵 MkM_k 和 Transformer 块 TRMk\mathrm{TRM}_k。

首先,将上一深度的表示和补充 Token 的嵌入分别归一化、拼接,再投影:

hi′k=Mk[RMSNorm(hik−1);RMSNorm(Emb(ti+k))].h_i^{\prime k} = M_k \left[ \mathrm{RMSNorm}(h_i^{k-1}); \mathrm{RMSNorm}(\mathrm{Emb}(t_{i+k})) \right].

其中:

  • hik−1∈Rdh_i^{k-1}\in\mathbb{R}^d,Emb(ti+k)∈Rd\mathrm{Emb}(t_{i+k})\in\mathbb{R}^d。
  • 拼接后为 2d2d 维,Mk∈Rd×2dM_k\in\mathbb{R}^{d\times2d}。
  • 投影后 hi′k∈Rdh_i^{\prime k}\in\mathbb{R}^d。

随后,对当前深度的有效位置进行带因果掩码的 Transformer 计算:

h1:T−kk=TRMk(h1:T−k′k).h_{1:T-k}^{k} = \mathrm{TRM}_k(h_{1:T-k}^{\prime k}).

最后,通过共享输出头,将 dd 维表示映射为词表 logits,再经过 Softmax 得到预测分布。其中,TT 是输入序列长度。

# 训练目标

每个预测深度都使用真实未来 Token 计算交叉熵。按照原文的归一化方式:

LMTPk=−1T∑i=k+2T+1log⁡Pik[ti].\mathcal L_{\mathrm{MTP}}^k = -\frac{1}{T} \sum_{i=k+2}^{T+1} \log P_i^k[t_i].

这里,Pik[ti]P_i^k[t_i] 是第 kk 个 MTP 模块赋予真实 Token tit_i 的概率;tT+1t_{T+1} 是输入序列之后的下一 Token 标签。

对 DD 个深度的损失取平均,并乘以权重 λ\lambda:

LMTP=λD∑k=1DLMTPk.\mathcal L_{\mathrm{MTP}} = \frac{\lambda}{D} \sum_{k=1}^{D}\mathcal L_{\mathrm{MTP}}^k.

该损失作为主模型下一 Token 预测损失之外的附加目标。由于 MTP 使用主模型的隐藏表示,梯度可以传回主模型,使其表示同时接受多个未来预测任务的监督,而不只是训练额外的输出模块。

# 推理

MTP 主要用于改善训练,推理时可以直接移除 MTP 模块,主模型仍按普通自回归方式生成。也可以保留 MTP 模块用于推测解码:根据已有或生成的 Token 提出后续候选,再由主模型验证,从而降低生成延迟。

# Pretraining

# 数据构建

DeepSeek-V3 的预训练语料包含 14.8T(14.8 万亿)个 Token。相较于 DeepSeek-V2,它提高了数学和编程样本的比例,将多语言覆盖范围扩展到中英文之外,并改进数据处理流程,在减少冗余的同时保持多样性。

训练采用文档打包(Document Packing),将多个文档组织到训练序列中,提高序列空间的利用率,同时保持文档完整性。训练不使用跨样本注意力掩码,但仍使用因果掩码。 如将两个文档按顺序打包后,后者中的 Token 可以关注前面的文档;若使用跨样本掩码,则 两者之间的注意力也会被屏蔽。

# FIM 策略

FIM(Fill-in-Middle,中间填充)通过调整训练文本顺序,让模型学习根据前缀和后缀补全中间内容,适用于代码补全、文本插入等任务。

将原始文档拆成 “前缀 — 中间 — 后缀” 后,DeepSeek-V3 使用 PSM(Prefix-Suffix-Middle)格式重新排列:

<|fim_begin|> 前缀 <|fim_hole|> 后缀 <|fim_end|> 中间 <|eos_token|>

FIM 仍采用自回归的下一 Token 预测目标,只改变文本排列顺序。

# 字节级 BPE

DeepSeek-V3 使用字节级 BPE(Byte-level Byte Pair Encoding),词表大小为 128K。其基本思路是将文本编码为字节序列,再通过反复合并高频相邻单元,学习常见的 Token;因此,一个 Token 可以对应字符的一部分、一个字符或多个字符。字节级表示能够覆盖不同语言和罕见字符。

新的预分词器支持将标点与换行符组合为一个 Token。但当提示以标点结尾、没有换行时,其分词边界可能与训练中的常见模式不同,引入 Token 边界偏差。为缓解这一问题,训练时会随机拆分一定比例的此类组合形式 Token,如拆分成标点和换行符两个,让模型适应不同的边界情况。

# YaRN 扩展

YaRN 通过按频段调整 RoPE 的旋转频率、调整注意力尺度,并配合额外训练,帮助模型适应超出原训练长度的上下文。

RoPE 在位置 mm 对第 jj 组二维分量施加旋转角度:

ϕm,j=mθj,\phi_{m,j}=m\theta_j,

其中,θj\theta_j 是该组的旋转频率。若统一将频率除以扩展倍数 ss,虽然可以将更长的位置范围映射到原有角度范围,但也会缩小相邻 Token 的角度差,影响局部位置辨别。

YaRN 因此采用分频段调整:高频部分保留原频率,低频部分缩小频率,中间部分平滑过渡。其形式可概括为:

θj′=(1−γj)θjs+γjθj,\theta_j' = (1-\gamma_j)\frac{\theta_j}{s} + \gamma_j\theta_j,

其中,高频部分 γj=1\gamma_j=1,低频部分 γj=0\gamma_j=0。这一设计兼顾局部位置分辨能力和长距离位置适应能力;此外,还通过调整 Softmax 前的注意力分数尺度,调节长序列中的注意力分布。

DeepSeek-V3 在预训练后进行两个扩展阶段,分别从 4K 长度扩展至 32K,再从 32K 扩展至 128K。

按论文描述,YaRN 应用于 MLA 的解耦共享位置 Key ktRk_t^R。扩展后,模型可处理最高 128K 的上下文。

# PostTraining:后训练

DeepSeek-V3 的后训练主要包括监督微调(SFT)和强化学习(RL):先通过高质量示例学习指令遵循与回答方式,再利用奖励反馈提高回答质量,使模型更符合人类偏好。

# 数据构建

指令微调数据集包含约 150 万条样本,覆盖推理与非推理任务,不同领域采用不同的数据生成方式。

推理数据包括数学、编程竞赛题和逻辑谜题。先训练领域专家模型:

  1. 专家模型的 SFT:结合两类样本 —— <问题, 原始回答> 和 <系统提示, 问题, R1回答> 。系统提示引导模型采用反思和验证等推理方式。
  2. 专家模型的 RL:通过高温度采样增加探索,使模型融合原始回答的简洁性与 R1 的推理模式,并逐渐在没有显式系统提示时也能使用这些模式。
  3. 生成与筛选:使用训练后的专家模型生成回答,再通过拒绝采样筛选高质量结果,作为最终模型的 SFT 数据。

拒绝采样可理解为 “生成候选,再依据质量标准保留合格回答”。

非推理数据包括创意写作、角色扮演和简单问答,由 DeepSeek-V2.5 生成回答,再由人工核验。

# SFT

SFT 使用 “指令 — 高质量回答” 训练模型,使其在给定指令和已有回答前缀时,提高正确回答 Token 的生成概率。

DeepSeek-V3-Base 在 SFT 数据集上训练 2 个 epoch。训练时将多个样本打包到一条序列中,并使用跨样本注意力掩码,使不同样本互不可见,同时保留各样本内部的因果约束。这与预训练阶段不屏蔽跨样本注意力的设置不同。

# Reward Model

奖励系统接收问题和模型回答,给出质量反馈,供强化学习使用。DeepSeek-V3 同时采用基于规则和基于模型的奖励。

基于规则的奖励通过确定的程序或规则验证回答,不需要另外训练一个神经网络来评分。例如数学和编程题。

基于模型的奖励利用训练好的评价模型判断回答质量。有参考答案时,可以判断语义是否正确;没有唯一答案时,可以评价是否切题、表达是否清晰、语气是否合适等。

DeepSeek-V3 的奖励模型从其 SFT 检查点初始化,再使用偏好数据训练学习评价标准;这些数据包含最终奖励以及形成该评价的思维链。

一种常见的偏好学习方式是:对于同一问题 qq,标注回答 a+a^+ 优于 a−a^-,训练评分函数 rϕr_\phi:

LRM=−log⁡σ(rϕ(q,a+)−rϕ(q,a−)).\mathcal L_{\mathrm{RM}} = -\log\sigma\left( r_\phi(q,a^+)-r_\phi(q,a^-) \right).

# GRPO:组相对策略优化

GRPO(Group Relative Policy Optimization)对同一道题采样多个回答,比较组内奖励,提高优质回答的生成概率、降低较差回答的生成概率。它使用组内奖励估计基线,而不需要额外训练 critic 模型。

首先,区分三个策略模型:

模型含义更新方式
πθ\pi_\theta当前正在训练的策略通过梯度更新
πold\pi_{\mathrm{old}}生成当前这批回答的旧策略快照本批更新期间固定,后续采样轮次刷新
πref\pi_{\mathrm{ref}}通常由 RL 开始前的 SFT 模型初始化的参考策略通常在整个 RL 阶段固定

πold\pi_{\mathrm{old}} 用于衡量本次策略变化,πref\pi_{\mathrm{ref}} 用于限制长期偏离。参考模型提供生成概率,不是负责质量评分的奖励模型。

对于问题 qq,从旧策略采样 GG 个回答 o1,…,oGo_1,\ldots,o_G,获得奖励 r1,…,rGr_1,\ldots,r_G,计算组内相对优势:

Ai=ri−mean⁡(r1,…,rG)std⁡(r1,…,rG).A_i = \frac{r_i-\operatorname{mean}(r_1,\ldots,r_G)} {\operatorname{std}(r_1,\ldots,r_G)}.

高于组内平均奖励的回答具有正优势,低于平均的回答具有负优势。接着,定义当前策略与旧策略对同一回答的概率比值:

ρi(θ)=πθ(oi∣q)πold(oi∣q).\rho_i(\theta) = \frac{\pi_\theta(o_i\mid q)} {\pi_{\mathrm{old}}(o_i\mid q)}.

ρi>1\rho_i>1 表示当前模型更容易生成该回答,ρi<1\rho_i<1 表示更不容易生成。

GRPO 最大化以下目标:

JGRPO(θ)=E[1G∑i=1G(min⁡[ρiAi,clip⁡(ρi,1−ε,1+ε)Ai]−βD^i)].\mathcal J_{\mathrm{GRPO}}(\theta) = \mathbb E \left[ \frac{1}{G}\sum_{i=1}^{G} \left( \min\left[ \rho_i A_i,\, \operatorname{clip}(\rho_i,1-\varepsilon,1+\varepsilon)A_i \right] - \beta\widehat D_i \right) \right].

该目标包含两部分:

  • 裁剪的策略收益:鼓励正优势回答、抑制负优势回答;通过 clip 限制继续扩大更新所带来的收益,避免一次更新过猛。它不是对概率比值施加硬性边界。
  • KL 惩罚:限制当前策略偏离参考模型的程度,β\beta 控制约束强度。

原文使用的逐样本 KL 估计项为:

D^i=πref(oi∣q)πθ(oi∣q)−log⁡πref(oi∣q)πθ(oi∣q)−1.\widehat D_i = \frac{\pi_{\mathrm{ref}}(o_i\mid q)} {\pi_\theta(o_i\mid q)} - \log \frac{\pi_{\mathrm{ref}}(o_i\mid q)} {\pi_\theta(o_i\mid q)} -1.

当两者对该回答给出的概率相同时,该项为 0;概率比偏离 1 时,该项为正。clip 约束相对旧策略的本次变化,KL 惩罚约束相对固定参考模型的累计偏离。

与标准 PPO 模型不同的是,PPO 通过学习一个价值模型 VV 来估计优势,GRPO 则通过同一道题的多个回答之间的奖励比较来估计优势。