【模型后训练与深度推理】1 RLHF与偏好优化统一框架:从PPO到DPO、IPO、KTO的数学统一视角

FPGA实现PI控制 阅读详情

RLHF与偏好优化统一框架:从PPO到DPO、IPO、KTO的数学统一视角

快速掌握原理,拒绝泛泛而谈。全文采用对话式推导,先 toy example 再推广至真实规模。


1 总体定位与知识图谱

1.1 为什么需要统一视角

我们面对的不是四个孤立算法,而是一条连续的光谱。PPO 需要训练奖励模型再调策略,DPO 把奖励模型藏进了策略内部,IPO 质疑 Bradley-Terry 假设本身,KTO 则连配对数据都不再需要。它们共享同一套数学地基,只是对"偏好"这一概念做了不同层次的抽象。

如果我们把偏好优化比作盖楼,PPO 是"先打地基(奖励模型)再盖房(策略)",DPO 发现地基和房梁可以用同一根钢筋浇筑,IPO 换了一种水泥配方,KTO 则直接问住户"你喜欢这面墙吗"而不再比较两间房。这一章我们先搭一张地图,看清各座建筑的位置关系。

1.2 核心问题清单

在深入推导之前,我们先把悬念挂出来:

  • 为什么 DPO 可以省掉奖励模型?闭式解从何而来?
  • Bradley-Terry 模型中的配分函数 Z(x)Z(x)Z(x) 为什么在 DPO 损失中消失了?
  • IPO 说 DPO 会过拟合,它到底改了哪个数学假设?
  • KTO 只需要二元反馈,它的损失函数与 DPO 有何代数联系?
  • 奖励过度优化为什么表现为"驼峰曲线",KL 散度约束如何充当刹车片?

1.3 知识图谱

偏好数据

Bradley-Terry

奖励模型

最优策略

KL约束

PPO

DPO

IPO

KTO

Psi函数

前景理论

闭式解

梯度下降

过度优化

现在我们已经了解了知识的全景地图,接下来看看每一块砖是如何砌成的。我们先从一个 toy example 开始,把抽象的公式落地到可触摸的数值上。


2 基础构建:从 toy example 理解偏好建模

2.1 小词表里的偏好世界

2.1.1.1 一个四词表的故事

假设我们的语言模型只有四个词:{我, 喜欢, 猫, 狗}。输入提示 xxx 固定为"我"。模型需要生成后续词,形成完整句子。我们有两个候选响应:

  • 优序响应 ywy_wyw​:“我喜欢猫”
  • 劣序响应 yly_lyl​:“我喜欢狗”

人类标注者看了之后,觉得"猫"比"狗"更可爱,于是给出一个偏好判断。问题来了:我们如何用数学描述"猫比狗更受偏爱"这件事?

2.1.1.2 Bradley-Terry 模型的直觉

Bradley-Terry 模型把偏好看成一场赛马。每匹赛马(即每个响应)都有一个隐含的"实力值"。如果"我喜欢猫"的实力值是 r(x,yw)r(x, y_w)r(x,yw​),"我喜欢狗"的实力值是 r(x,yl)r(x, y_l)r(x,yl​),那么猫跑赢狗的概率为:

p(yw≻yl∣x)=exp⁡(r(x,yw))exp⁡(r(x,yw))+exp⁡(r(x,yl))=σ(r(x,yw)−r(x,yl)) p(y_w \succ y_l \mid x) = \frac{\exp(r(x, y_w))}{\exp(r(x, y_w)) + \exp(r(x, y_l))} = \sigma(r(x, y_w) - r(x, y_l)) p(yw​≻yl​∣x)=exp(r(x,yw​))+exp(r(x,yl​))exp(r(x,yw​))​=σ(r(x,yw​)−r(x,yl​))

其中 σ\sigmaσ 是 sigmoid 函数。这听起来抽象对吧?把它画成图,会是什么样子?想象两条高度不同的水平线,高度差就是奖励差,sigmoid 把高度差压扁成 0 到 1 之间的概率值。如果猫的实力比狗高 2 分,猫获胜的概率约为 σ(2)≈0.88\sigma(2) \approx 0.88σ(2)≈0.88。

2.1.1.3 从向量到概率

在真实模型中,r(x,y)r(x, y)r(x,y) 不是凭空出现的。我们先定义一个奖励模型 rϕ(x,y)r_\phi(x, y)rϕ​(x,y),它把提示和响应的拼接向量映射成一个标量。对于 toy example,假设响应"我喜欢猫"经过 Transformer 后得到二维向量 hw=[1.0,0.5]\mathbf{h}_w = [1.0, 0.5]hw​=[1.0,0.5],"我喜欢狗"得到 hl=[0.8,0.3]\mathbf{h}_l = [0.8, 0.3]hl​=[0.8,0.3]。奖励模型是一个简单的线性层:

rϕ(x,y)=w⊤h+b r_\phi(x, y) = \mathbf{w}^\top \mathbf{h} + b rϕ​(x,y)=w⊤h+b

设 w=[1,1]\mathbf{w} = [1, 1]w=[1,1],b=0b = 0b=0,则 r(x,yw)=1.5r(x, y_w) = 1.5r(x,yw​)=1.5,r(x,yl)=1.1r(x, y_l) = 1.1r(x,yl​)=1.1。代入 Bradley-Terry 公式,猫胜概率为 σ(0.4)≈0.60\sigma(0.4) \approx 0.60σ(0.4)≈0.60。这就是向量级计算。推广到真实规模时,h\mathbf{h}h 变成最后一层隐藏状态的高维向量,w\mathbf{w}w 变成可学习的投影矩阵,但数学骨架完全一致。

这在训练中使用意味着什么?意味着我们不需要人工指定"猫=10分、狗=5分",而是让人类标注的偏好数据自动教会模型调整 w\mathbf{w}w,使得优序响应的奖励值系统性地高于劣序响应。

2.2 KL 散度的几何直觉

2.2.1.1 两个分布的距离

现在我们已经了解了偏好如何用概率建模,接下来看看 KL 散度如何充当"安全带"。假设策略 πθ\pi_\thetaπθ​ 在生成下一个词时给出的概率分布是 [0.5,0.3,0.1,0.1][0.5, 0.3, 0.1, 0.1][0.5,0.3,0.1,0.1],参考策略 πref\pi_{\text{ref}}πref​(通常是 SFT 后的基础模型)给出的分布是 [0.4,0.4,0.1,0.1][0.4, 0.4, 0.1, 0.1][0.4,0.4,0.1,0.1]。KL 散度衡量这两个分布之间的"信息损耗":

DKL(πθ∥πref)=∑yπθ(y∣x)log⁡πθ(y∣x)πref(y∣x) D_{\text{KL}}(\pi_\theta \| \pi_{\text{ref}}) = \sum_y \pi_\theta(y \mid x) \log \frac{\pi_\theta(y \mid x)}{\pi_{\text{ref}}(y \mid x)} DKL​(πθ​∥πref​)=y∑​πθ​(y∣x)logπref​(y∣x)πθ​(y∣x)​

如果画成图会是什么样子?想象两个形状相似但峰值位置略有偏移的山丘,KL 散度计算的是从一个山丘变形到另一个山丘所需的"工作量"。当两座山完全重合时,KL 散度为零;当一座山的某个峰值在另一座山的谷底时,KL 散度趋向无穷。

2.2.1.2 约束优化的视角

KL 散度在 RLHF 中不是装饰,而是硬约束。我们可以把偏好优化写成带约束的优化问题:

max⁡πθEx∼D,y∼πθ[r(x,y)]s.t.DKL(πθ∥πref)≤ϵ \max_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta}[r(x, y)] \quad \text{s.t.} \quad D_{\text{KL}}(\pi_\theta \| \pi_{\text{ref}}) \le \epsilon πθ​max​Ex∼D,y∼πθ​​[r(x,y)]s.t.DKL​(πθ​∥πref​)≤ϵ

用拉格朗日乘子法,把它变成无约束形式:

max⁡πθE[r(x,y)]−βDKL(πθ∥πref) \max_{\pi_\theta} \mathbb{E}[r(x, y)] - \beta D_{\text{KL}}(\pi_\theta \| \pi_{\text{ref}}) πθ​max​E[r(x,y)]−βDKL​(πθ​∥πref​)

其中 β\betaβ 是温度系数,控制我们对参考模型的忠诚程度。β\betaβ 越大,策略越不敢偏离参考模型;β\betaβ 越小,策略越敢于追逐高奖励。这在训练中使用意味着什么?意味着 β\betaβ 是一个旋钮,拧得太松,模型会为了高分而胡说八道(奖励过度优化);拧得太紧,模型会原地踏步,拒绝学习新偏好。


3 RLHF 的完整推导:PPO 阶段

3.1 奖励建模

3.1.1.1 目标函数拆解

在继续之前,我们先回到 Bradley-Terry 模型,把它变成可训练的损失函数。给定数据集 D={(x,yw,yl)}\mathcal{D} = \{(x, y_w, y_l)\}D={(x,yw​,yl​)},我们希望奖励模型 rϕr_\phirϕ​ 能正确预测人类偏好。最大似然估计给出:

LR(rϕ,D)=−E(x,yw,yl)∼D[log⁡σ(rϕ(x,yw)−rϕ(x,yl))] \mathcal{L}_R(r_\phi, \mathcal{D}) = -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma(r_\phi(x, y_w) - r_\phi(x, y_l)) \right] LR​(rϕ​,D)=−E(x,yw​,yl​)∼D​[logσ(rϕ​(x,yw​)−rϕ​(x,yl​))]

这个损失在做什么?当 rϕ(x,yw)−rϕ(x,yl)r_\phi(x, y_w) - r_\phi(x, y_l)rϕ​(x,yw​)−rϕ​(x,yl​) 很大时,sigmoid 接近 1,对数接近 0,损失很小;当差值为负时,损失迅速膨胀。模型因此学会拉大优序与劣序响应之间的奖励差距。

3.1.1.2 最优策略的闭式解

奖励模型训练完毕后,我们进入策略优化阶段。核心问题是:在 KL 约束下,什么样的策略 πθ\pi_\thetaπθ​ 能最大化期望奖励?这是一个泛函极值问题,我们可以用变分法求解。构造目标:

J(π)=Ex∼D,y∼π(y∣x)[r(x,y)]−βDKL(π∥πref) J(\pi) = \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi(y|x)} \left[ r(x, y) \right] - \beta D_{\text{KL}}(\pi \| \pi_{\text{ref}}) J(π)=Ex∼D,y∼π(y∣x)​[r(x,y)]−βDKL​(π∥πref​)

对 π(y∣x)\pi(y|x)π(y∣x) 求导并令其为零。KL 散度展开后,导数涉及 log⁡π(y∣x)\log \pi(y|x)logπ(y∣x)。设 π∗\pi^*π∗ 为最优策略,经过整理(详见附录推导思路),我们得到惊人的闭式解:

π∗(y∣x)=1Z(x)πref(y∣x)exp⁡(1βr(x,y)) \pi^*(y \mid x) = \frac{1}{Z(x)} \pi_{\text{ref}}(y \mid x) \exp\left(\frac{1}{\beta} r(x, y)\right) π∗(y∣x)=Z(x)1​πref​(y∣x)exp(β1​r(x,y))

其中配分函数 Z(x)=∑yπref(y∣x)exp⁡(1βr(x,y))Z(x) = \sum_y \pi_{\text{ref}}(y \mid x) \exp(\frac{1}{\beta} r(x, y))Z(x)=∑y​πref​(y∣x)exp(β1​r(x,y)) 确保概率归一化。这个公式像什么?想象参考策略是一面平整的镜子,奖励函数是一束光,最优策略就是光在镜子上照射后的亮斑分布——高奖励区域被指数级放大,低奖励区域被指数级压缩,而 β\betaβ 控制光的强度。

3.2 PPO 的近似之路

3.2.1.1 策略梯度回顾

闭式解虽然优美,但配分函数 Z(x)Z(x)Z(x) 需要对全空间求和,对于语言模型而言,yyy 的空间是天文数字,无法精确计算。PPO 选择了一条近似之路。标准策略梯度定理告诉我们:

∇θJ≈E[∇θlog⁡πθ(y∣x)⋅A(x,y)] \nabla_\theta J \approx \mathbb{E} \left[ \nabla_\theta \log \pi_\theta(y|x) \cdot A(x, y) \right] ∇θ​J≈E[∇θ​logπθ​(y∣x)⋅A(x,y)]

其中 A(x,y)A(x, y)A(x,y) 是优势函数,衡量当前动作比平均水平好多少。在 RLHF 中,优势通常由奖励模型输出减去基线值得到。

3.2.1.2 重要性采样与裁剪

PPO 使用重要性采样比率 ρt=πθ(yt∣xt)πold(yt∣xt)\rho_t = \frac{\pi_\theta(y_t|x_t)}{\pi_{\text{old}}(y_t|x_t)}ρt​=πold​(yt​∣xt​)πθ​(yt​∣xt​)​ 来衡量新策略与旧策略的差异。为了防止一步迈得太大,PPO 引入裁剪目标:

LCLIP(θ)=E[min⁡(ρtAt,clip(ρt,1−ϵ,1+ϵ)At)] \mathcal{L}^{\text{CLIP}}(\theta) = \mathbb{E} \left[ \min(\rho_t A_t, \text{clip}(\rho_t, 1-\epsilon, 1+\epsilon) A_t) \right] LCLIP(θ)=E[min(ρt​At​,clip(ρt​,1−ϵ,1+ϵ)At​)]

如果画成图会是什么样子?想象一条轨道,比率 ρt\rho_tρt​ 在 [1−ϵ,1+ϵ][1-\epsilon, 1+\epsilon][1−ϵ,1+ϵ] 区间内自由滑动,一旦越界,就被天花板或地板截断。这确保了策略每次迭代的更新幅度可控,避免旧策略收集的样本失效。

3.2.1.3 KL 惩罚项的引入

PPO 在 RLHF 中的完整目标通常写作:

LPPO=E[min⁡(ρtAt,clip(ρt)At)]−βE[DKL(πθ∥πref)] \mathcal{L}_{\text{PPO}} = \mathbb{E} \left[ \min(\rho_t A_t, \text{clip}(\rho_t) A_t) \right] - \beta \mathbb{E} \left[ D_{\text{KL}}(\pi_\theta \| \pi_{\text{ref}}) \right] LPPO​=E[min(ρt​At​,clip(ρt​)At​)]−βE[DKL​(πθ​∥πref​)]

KL 惩罚项在这里以显式正则化形式出现,而非拉格朗日乘子。PPO 因此是一个双层架构:外层是 RL 优化器,内层是奖励模型打分器。这在训练中使用意味着什么?意味着我们需要维护至少三个独立模型(策略、参考、奖励),并且在训练循环中实时采样,计算成本高昂,超参数敏感。


4 DPO:绕过奖励模型的优雅重构

4.1 核心洞察:变量替换

4.1.1.1 从奖励到策略的映射

PPO 的痛点在于配分函数不可解。DPO 的突破口来自一个逆向思考:既然最优策略 π∗\pi^*π∗ 可以用奖励 rrr 表达,那么奖励 rrr 是否也可以用策略 π∗\pi^*π∗ 表达?

对闭式解取对数并整理:

r(x,y)=βlog⁡π∗(y∣x)πref(y∣x)+βlog⁡Z(x) r(x, y) = \beta \log \frac{\pi^*(y|x)}{\pi_{\text{ref}}(y|x)} + \beta \log Z(x) r(x,y)=βlogπref​(y∣x)π∗(y∣x)​+βlogZ(x)

这个等式把奖励函数重新参数化为策略与参考策略之间的对数比率,加上一个仅依赖 xxx 的常数项 βlog⁡Z(x)\beta \log Z(x)βlogZ(x)。这像什么?像温度计——我们不需要知道绝对零度在哪里,只需要知道两个物体之间的温差。配分函数 Z(x)Z(x)Z(x) 虽然未知,但它在后续步骤中会神奇地消失。

4.1.1.2 配分函数的消失

现在我们已经了解了从奖励到策略的映射,接下来看看 DPO 如何把这个映射注入 Bradley-Terry 模型。将重参数化后的奖励代入偏好概率:

p∗(yw≻yl∣x)=σ(βlog⁡π∗(yw∣x)πref(yw∣x)−βlog⁡π∗(yl∣x)πref(yl∣x)) p^*(y_w \succ y_l | x) = \sigma\left( \beta \log \frac{\pi^*(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi^*(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) p∗(yw​≻yl​∣x)=σ(βlogπref​(yw​∣x)π∗(yw​∣x)​−βlogπref​(yl​∣x)π∗(yl​∣x)​)

配分函数 Z(x)Z(x)Z(x) 在哪里?它被隐藏在两个奖励表达式的减法中:

βlog⁡Z(x)−βlog⁡Z(x)=0 \beta \log Z(x) - \beta \log Z(x) = 0 βlogZ(x)−βlogZ(x)=0

这就像两个人站在同一座山的海拔基准线上比较身高,基准线本身被消去了。DPO 因此完全摆脱了对 Z(x)Z(x)Z(x) 的依赖,这是它相比 PPO 的最大简化。

4.1.1.3 二元交叉熵的诞生

有了偏好概率的显式表达,我们可以直接写出最大似然损失。将 π∗\pi^*π∗ 替换为待训练的策略 πθ\pi_\thetaπθ​,得到 DPO 损失:

LDPO(πθ;πref)=−E(x,yw,yl)∼D[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))] \mathcal{L}_{\text{DPO}}(\pi_\theta; \pi_{\text{ref}}) = -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma\left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) \right] LDPO​(πθ​;πref​)=−E(x,yw​,yl​)∼D​[logσ(βlogπref​(yw​∣x)πθ​(yw​∣x)​−βlogπref​(yl​∣x)πθ​(yl​∣x)​)]

如果画成图会是什么样子?想象一个跷跷板,一端是优序响应的对数概率比,另一端是劣序响应的对数概率比。DPO 的损失函数不断调整 πθ\pi_\thetaπθ​,让跷跷板向优序端倾斜。温度系数 β\betaβ 决定杠杆的力臂长度——β\betaβ 越大,同样概率差带来的损失变化越剧烈。

4.2 梯度流的直观理解

4.2.1.1 动态权重机制

对 DPO 损失求梯度,我们得到:

∇θLDPO=−βE[w⋅(∇θlog⁡πθ(yw∣x)−∇θlog⁡πθ(yl∣x))] \nabla_\theta \mathcal{L}_{\text{DPO}} = -\beta \mathbb{E} \left[ w \cdot \left( \nabla_\theta \log \pi_\theta(y_w|x) - \nabla_\theta \log \pi_\theta(y_l|x) \right) \right] ∇θ​LDPO​=−βE[w⋅(∇θ​logπθ​(yw​∣x)−∇θ​logπθ​(yl​∣x))]

其中权重 w=σ(r^θ(x,yl)−r^θ(x,yw))w = \sigma(\hat{r}_\theta(x, y_l) - \hat{r}_\theta(x, y_w))w=σ(r^θ​(x,yl​)−r^θ​(x,yw​)),而 r^θ(x,y)=βlog⁡πθ(y∣x)πref(y∣x)\hat{r}_\theta(x, y) = \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)}r^θ​(x,y)=βlogπref​(y∣x)πθ​(y∣x)​ 是隐式奖励。这个权重有什么特点?当模型已经很好地分辨优劣时,r^θ(x,yw)≫r^θ(x,yl)\hat{r}_\theta(x, y_w) \gg \hat{r}_\theta(x, y_l)r^θ​(x,yw​)≫r^θ​(x,yl​),权重 www 接近 0,梯度自动衰减;当模型困惑时,权重接近 0.5,梯度保持强劲。这是一种自适应学习率机制,难样本获得更多关注,简单样本自动淡出。

4.2.1.2 与 PPO 的等价性

DPO 和 PPO 真的在优化同一个东西吗?答案是肯定的。DPO 损失等价于在 Bradley-Terry 假设下,对以下 RL 目标的精确优化:

max⁡πθE[r(x,y)]−βDKL(πθ∥πref) \max_{\pi_\theta} \mathbb{E}[r(x,y)] - \beta D_{\text{KL}}(\pi_\theta \| \pi_{\text{ref}}) πθ​max​E[r(x,y)]−βDKL​(πθ​∥πref​)

区别在于 PPO 用近似梯度(策略梯度 + 裁剪)逐步逼近,而 DPO 利用 Bradley-Terry 的结构特性,把问题转化为静态的二元分类损失,直接求解。这在训练中使用意味着什么?意味着 DPO 不需要在训练循环中采样、不需要维护价值函数、不需要处理重要性比率的方差,它把动态 RL 问题降级为静态监督学习问题,内存占用和代码复杂度大幅下降。


5 统一框架:Psi PO 与 IPO

5.1 从 DPO 到 Psi PO

5.1.1.1 广义偏好优化

DPO 的成功让我们追问:它的推导强依赖于 Bradley-Terry 模型和 sigmoid 函数,如果换一种偏好建模方式,闭式解是否仍然存在?IPO 的论文提出了 Ψ\PsiΨPO 框架,用一个广义函数 Ψ\PsiΨ 替代 sigmoid。

定义广义偏好概率:

p(yw≻yl∣x)=fΨ(Ψ(πθ,x,yw)−Ψ(πθ,x,yl)) p(y_w \succ y_l | x) = f_\Psi(\Psi(\pi_\theta, x, y_w) - \Psi(\pi_\theta, x, y_l)) p(yw​≻yl​∣x)=fΨ​(Ψ(πθ​,x,yw​)−Ψ(πθ​,x,yl​))

其中 Ψ\PsiΨ 是从策略到实数的映射,fΨf_\PsifΨ​ 是联系函数。当 Ψ(π,x,y)=βlog⁡π(y∣x)πref(y∣x)\Psi(\pi, x, y) = \beta \log \frac{\pi(y|x)}{\pi_{\text{ref}}(y|x)}Ψ(π,x,y)=βlogπref​(y∣x)π(y∣x)​ 且 fΨ=σf_\Psi = \sigmafΨ​=σ 时,我们回到 DPO;当 Ψ\PsiΨ 取其他形式时,我们得到不同算法。

5.1.1.2 IPO 的恒等映射

IPO 的核心改动是令 Ψ\PsiΨ 为恒等映射,并直接优化偏好分类的均方误差。IPO 损失定义为:

LIPO=E[(log⁡πθ(yw∣x)πref(yw∣x)−log⁡πθ(yl∣x)πref(yl∣x)−12β)2] \mathcal{L}_{\text{IPO}} = \mathbb{E} \left[ \left( \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} - \frac{1}{2\beta} \right)^2 \right] LIPO​=E[(logπref​(yw​∣x)πθ​(yw​∣x)​−logπref​(yl​∣x)πθ​(yl​∣x)​−2β1​)2]

这个公式像什么?像一根弹簧,两端分别拴住优序和劣序的对数概率比,弹簧的自然长度是 12β\frac{1}{2\beta}2β1​。DPO 用交叉熵把弹簧往无穷长拉,IPO 则用均方误差把弹簧拉到固定长度。这避免了 DPO 在多轮训练时,概率比无限制膨胀导致的过拟合问题。

如果画成图会是什么样子?想象 DPO 是一个没有尽头的跑道,模型可以一直加速;IPO 则在跑道尽头设置了一堵软墙,速度越快,撞墙反弹越狠。这在训练中使用意味着什么?意味着 IPO 对超参数 β\betaβ 的敏感度更低,训练曲线更稳定,但收敛速度可能略慢于 DPO。

5.2 无需配对数据的 KTO

5.2.1.1 前景理论的引入

DPO 和 IPO 都需要成对的 (yw,yl)(y_w, y_l)(yw​,yl​) 数据,标注成本较高。KTO 借鉴了经济学中的前景理论(Prospect Theory),把问题转化为二元反馈:对于单个响应 yyy,人类只回答"好"或"不好"。

前景理论的核心是人类对收益和损失的感知不对称。获得 100 元的快乐,远小于损失 100 元的痛苦。KTO 把这种不对称性编码进损失函数,定义两个阈值:

  • λy\lambda_yλy​:响应 yyy 是否被人类接受的指示变量
  • λref\lambda_{\text{ref}}λref​:参考模型生成响应的基准接受率
5.2.1.2 二元反馈的损失重构

KTO 损失对单个样本 (x,y,λy)(x, y, \lambda_y)(x,y,λy​) 定义为:

LKTO=λy⋅σ(βlog⁡πθ(y∣x)πref(y∣x)−Dref)+(1−λy)⋅σ(Dref−βlog⁡πθ(y∣x)πref(y∣x)) \mathcal{L}_{\text{KTO}} = \lambda_y \cdot \sigma(\beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)} - D_{\text{ref}}) + (1 - \lambda_y) \cdot \sigma(D_{\text{ref}} - \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)}) LKTO​=λy​⋅σ(βlogπref​(y∣x)πθ​(y∣x)​−Dref​)+(1−λy​)⋅σ(Dref​−βlogπref​(y∣x)πθ​(y∣x)​)

其中 DrefD_{\text{ref}}Dref​ 是与参考模型相关的常数。这个损失在做什么?当 λy=1\lambda_y = 1λy​=1(人类喜欢该响应),它鼓励 πθ\pi_\thetaπθ​ 的概率比参考模型高;当 λy=0\lambda_y = 0λy​=0(人类不喜欢),它惩罚概率比过高。更妙的是,KTO 不需要配对比较,只需要单个响应的二元标签,数据收集成本大幅降低。

这在训练中使用意味着什么?意味着我们可以把任何用户反馈(点赞、点踩)直接扔进训练,不需要为每个提示精心构造 A/B 测试。KTO 在 1B 到 30B 参数的模型上都表现出与 DPO 相当甚至更优的性能,证明了非配对数据的潜力。


6 奖励过度优化与 KL 约束机制

6.1 过度优化的现象

6.1.1.1 奖励模型的天花板

为什么需要 KL 约束?想象一个贪婪的学生,考试目标是"得分最大化"。如果试卷有漏洞,学生可能通过作弊获得高分,而非真正掌握知识。奖励模型就是那个"阅卷老师",它基于人类标注数据训练,本身存在偏差和上限。当策略 πθ\pi_\thetaπθ​ 为了迎合奖励模型而不断偏离参考模型时,它可能找到奖励模型的盲点——生成高奖励但低质量的文本。这就是 Goodhart 定律在 RLHF 中的体现:当一个指标成为目标时,它就不再是好指标。

6.1.1.2 策略坍缩的曲线

过度优化不是线性恶化,而是呈现"驼峰曲线"。横轴是 KL 散度(偏离参考模型的程度),纵轴是真实人类满意度。在 KL 散度较小时,满意度随优化上升;到达顶点后,继续增大 KL 散度反而导致满意度下降。DPO、IPO、PPO 都观测到这一现象。

如果画成图会是什么样子?想象一条抛物线开口向下,顶点对应最优策略。KL 约束的作用就是把策略的搜索范围限制在顶点左侧的上升段,防止它滑入右侧的下降深渊。

6.2 KL 散度的约束机制

6.2.1.1 拉格朗日视角

从数学上看,带 KL 约束的奖励最大化是一个约束优化问题。拉格朗日函数为:

L(π,β)=E[r(x,y)]−β(DKL(π∥πref)−ϵ) \mathcal{L}(\pi, \beta) = \mathbb{E}[r(x,y)] - \beta (D_{\text{KL}}(\pi \| \pi_{\text{ref}}) - \epsilon) L(π,β)=E[r(x,y)]−β(DKL​(π∥πref​)−ϵ)

β\betaβ 在这里是拉格朗日乘子,而非人为设定的超参数。最优解满足 KKT 条件:要么 KL 散度恰好等于 ϵ\epsilonϵ(约束紧),要么 β=0\beta = 0β=0(约束松)。在 RLHF 实践中,约束通常是紧的,这意味着策略会充分利用允许的偏离空间,直到触碰到 KL 天花板。

6.2.1.2 自适应温度系数

固定 β\betaβ 的问题在于不同样本的"难度"不同。有些偏好对非常明显(例如礼貌回复 vs 侮辱性回复),有些则非常微妙(两种都合理的写作风格)。β\betaβ-DPO 和 ϵ\epsilonϵ-DPO 提出自适应策略:根据每个样本的隐式奖励差距动态调整 β\betaβ。

具体地,对于每个偏好对,计算当前模型的困惑度:

Δ=r^θ(x,yw)−r^θ(x,yl) \Delta = \hat{r}_\theta(x, y_w) - \hat{r}_\theta(x, y_l) Δ=r^θ​(x,yw​)−r^θ​(x,yl​)

如果 Δ\DeltaΔ 很小(模型困惑),降低 β\betaβ 允许更大探索;如果 Δ\DeltaΔ 很大(模型自信),提高 β\betaβ 收紧约束。这在训练中使用意味着什么?意味着 KL 惩罚不再是全局固定的铁律,而是每个样本的弹性安全带,难样本松一点,简单样本紧一点,整体训练更平滑。


7 架构设计与实现

7.1 总体结构图

输出层

核心层

输入层

提示文本

偏好数据

参考模型

奖励建模

策略优化

偏好分类

对齐策略

隐式奖励

KL散度值

7.2 模块设计图

7.2.1.1 PPO 模块

策略模型

价值模型

奖励模型

参考模型

广义优势

裁剪目标

KL惩罚

PPO损失

7.2.1.2 DPO 模块

策略模型

参考模型

对数概率比

隐式奖励

Bradley-Terry

二元交叉熵

DPO损失

7.2.1.3 IPO 模块

策略模型

参考模型

概率比差值

均方误差

弹簧目标

IPO损失

7.2.1.4 KTO 模块

策略模型

参考模型

二元反馈

概率比

前景权重

不对称损失

KTO损失

7.3 协同设计图

计算流

模型流

数据流

偏好对

二元标签

提示集合

参考模型

策略模型

旧策略快照

前向传播

损失计算

反向传播

7.4 接口对接图

下游接口

核心引擎

上游接口

数据管道

模型仓库

配置中心

训练循环

损失工厂

梯度处理器

检查点存储

评估服务

日志系统

7.5 三层架构总览图

基础设施层

算法层

应用层

对话接口

评估面板

实验追踪

PPO引擎

DPO引擎

IPO引擎

KTO引擎

统一调度器

GPU集群

分布式存储

模型注册表

数据湖


8 算法伪代码

8.1 PPO 伪代码

procedure PPO_TRAIN(prompts, ref_model, init_policy, beta, epsilon, epochs)
    policy ← init_policy
    value_net ← INITIALIZE_VALUE_NETWORK()
    reward_model ← LOAD_REWARD_MODEL()

    for epoch = 1 to epochs do
        trajectories ← ∅
        for each x in prompts do
            y ← SAMPLE(policy, x)
            r ← reward_model(x, y)
            log_prob ← LOG_PROBABILITY(policy, x, y)
            log_prob_ref ← LOG_PROBABILITY(ref_model, x, y)
            trajectories ← trajectories ∪ {(x, y, r, log_prob, log_prob_ref)}
        end

        advantages ← COMPUTE_GAE(trajectories, value_net)

        for each batch in trajectories do
            ratio ← exp(LOG_PROBABILITY(policy, x, y) - log_prob_old)
            clipped ← CLIP(ratio, 1 - epsilon, 1 + epsilon)
            surrogate ← MIN(ratio * advantage, clipped * advantage)
            kl_penalty ← beta * KL_DIVERGENCE(policy, ref_model, x)
            loss ← -MEAN(surrogate) + MEAN(kl_penalty)

            GRADIENT_DESCENT(policy, loss)
            GRADIENT_DESCENT(value_net, VALUE_LOSS(trajectories))
        end
    end

    return policy
end

8.2 DPO 伪代码

procedure DPO_TRAIN(preference_data, ref_model, init_policy, beta, epochs)
    policy ← init_policy

    for epoch = 1 to epochs do
        for each (x, y_w, y_l) in preference_data do
            pi_w ← LOG_PROBABILITY(policy, x, y_w)
            pi_l ← LOG_PROBABILITY(policy, x, y_l)
            ref_w ← LOG_PROBABILITY(ref_model, x, y_w)
            ref_l ← LOG_PROBABILITY(ref_model, x, y_l)

            ratio_w ← pi_w - ref_w
            ratio_l ← pi_l - ref_l

            implicit_reward_w ← beta * ratio_w
            implicit_reward_l ← beta * ratio_l

            logits ← implicit_reward_w - implicit_reward_l
            loss ← -LOG(SIGMOID(logits))

            GRADIENT_DESCENT(policy, loss)
        end
    end

    return policy
end

8.3 IPO 伪代码

procedure IPO_TRAIN(preference_data, ref_model, init_policy, beta, epochs)
    policy ← init_policy
    target ← 1 / (2 * beta)

    for epoch = 1 to epochs do
        for each (x, y_w, y_l) in preference_data do
            ratio_w ← LOG_PROBABILITY(policy, x, y_w) - LOG_PROBABILITY(ref_model, x, y_w)
            ratio_l ← LOG_PROBABILITY(policy, x, y_l) - LOG_PROBABILITY(ref_model, x, y_l)

            gap ← ratio_w - ratio_l
            loss ← (gap - target)^2

            GRADIENT_DESCENT(policy, loss)
        end
    end

    return policy
end

8.4 KTO 伪代码

procedure KTO_TRAIN(binary_data, ref_model, init_policy, beta, D_ref, epochs)
    policy ← init_policy

    for epoch = 1 to epochs do
        for each (x, y, lambda_y) in binary_data do
            ratio ← LOG_PROBABILITY(policy, x, y) - LOG_PROBABILITY(ref_model, x, y)
            implicit_r ← beta * ratio

            if lambda_y = 1 then
                z ← implicit_r - D_ref
            else
                z ← D_ref - implicit_r
            end

            loss ← SIGMOID(z)

            GRADIENT_DESCENT(policy, loss)
        end
    end

    return policy
end

9 闭环总结

我们从 toy example 的四词表出发,一步步登上了偏好优化的统一理论高地。Bradley-Terry 模型提供了偏好的概率骨架,KL 散度约束提供了安全护栏,闭式解则架起了从奖励到策略的桥梁。PPO 在这条路上选择了近似迭代的策略梯度,DPO 发现了桥梁的精确坐标从而一步跨越,IPO 加固了桥梁的护栏防止过度摇摆,KTO 则把桥梁的设计图简化到只需单向通行。

奖励过度优化是所有方法的共同敌人,它表现为 KL 散度增大后的性能驼峰曲线。理解 KL 约束的拉格朗日本质,以及自适应温度系数的调节机制,是在生产环境中稳定训练的核心。在实际使用中,这意味着我们不再盲目迷信单一算法,而是根据数据形态(配对 vs 二元)、计算预算(多卡 vs 单卡)、稳定性需求(快速收敛 vs 稳健训练)在统一框架内灵活选型。

这条光谱还在继续延伸,但地基已经稳固。

从零开始开发AI Agent:基于大模型的智能体实战指南 ### 摘要 本文介绍了AI Agent的开发全流程,从基础概念到实际部署,涵盖大模型集成、工具调用和记忆系统构建等核心技术。通过电商客服案例展示实战应用,并提供调试优化与部署方案,最后展望了AI Agent的未来发展方向,帮助开发者快速掌握智能体开发技能。 阅读详情

相关推荐

ESP32 IDF开发 应用篇⑲ 空中升级OTA

在实际产品开发过程中,在线升级可以远程解决产品软件开发引入的问题,更好地满足用户需求。OTA(空中)更新是使用 Wi-Fi 连接而不是串行端口将固件加载到 ESP 模块的过程。(1)、ESP32 的 OTA 升级有三种方式:·Arduino IDE:主要用于软件开发阶段,实现不接线固件烧写·Web Browser:通过 Web 浏览器手动提供应用程序更新模块·HTTP Server:自动使用http服务器 - 针对产品应用在三种升级情况下,必须通过串行端口完成第一个固件上传。

lu330274924的博客 3326

国内首次!移动云自研量子计算测控系统率先实现海外项目商用

未来,移动云将持续深耕量子计算测控系统与量子计算操作系统:依托现有高精度、模块化架构底座,提前布局量子纠错与容错技术栈,为主流容错量子架构提供底层支撑,推动整套系统向千比特级容错量子计算平滑演进;本次国产量子软硬件联合出海,打破了原有市场格局,既为全球客户提供了自主可控、原生适配的一体化新选择,也探索出“自研核心软件+国产硬件整机”协同出海的产业新模式。在全球量子计算仍处于工程化早期的阶段,这种原生软硬协同的一体化交付模式,既保障了方案的落地效率与可用性,也为国产量子计算参与全球竞争提供了更稳健的路径。

云擎未来 智信天下 3467

SAP FICO - 外币交易实战:汇率类型配置与货币换算率管理

月底关账前的外币评估就像财务人的"期末考",OB59配置就是你的备考方案。最低值原则(Lowest value principle)最保守。它会比较原始汇率与评估日汇率,取不利方向确认损失。适合风险厌恶型企业,我在制造业客户中应用最多。重估法(Revalue only)更反映市场现状。无论盈亏都按最新汇率调整,适合交易性金融资产处理。有个基金公司客户就靠这个方法及时反映了外汇波动收益。最小差异金额(Minimum difference)是防骚扰设置。

weixin_42524708的博客 358

IBM 宣布,2027推出千比特量子系统,新处理器可执行 10,000 次量子操作

2026年11月11日,IBM在量子开发者大会(QDC)上,正式公布了其下一代量子处理器的规格与路线图。按照规划,这款拥有(物理比特总数为 2,034 个)的新处理器,设计目标是在维持高速与高运算质量的同时,精准执行。更具野心的是,IBM 计划在 2027 年通过模块化互联将两颗 Nighthawk r3 拼成一台拥有的计算系统,正式跨过千量子比特门槛。而在另一侧,今年 9 月刚刚投入使用的现役主力,已经在产业界伙伴手中跑了超过,部分场景下的运算速度直接拉到了前代处理器的 19 倍。

Qtumist的博客 185

微带线,带状线和接地共面波导的区别

微带线,带状线和接地共面波导的区别

sky_ying的博客 3万+

移远EC800M CAT1模块HTTP POST实战:从AT指令到数据上报的完整避坑指南

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报的完整开发流程,包括模块初始化、PDP上下文配置、HTTP POST实现及优化策略。针对实际开发中的常见问题如网络异常、低功耗需求等提供了经过验证的解决方案,帮助开发者快速实现稳定可靠的物联网数据传输功能。

weixin_42556197的博客 482

FodaOS统一场论系列 Ⅶ:可逆关联代数——全量子门目录、门群语义与量子化的经典用途

本文是 FodaOS 统一场论系列第七篇,回答一个必须回答的问题:当"量子门"被精确构造在经典机器上时,量子技术到底能用来干什么? 本系列第三篇已判决 GF 域精确模拟不享有量子加速;本文据此把问题从"量子计算"重写为"量子代数的经典价值分类学",并给出肯定回答。基底:费马素数 $p=65537$ 使 $\mathrm{GF}(p)^*\cong Z_{2^{16}}$——全域是二进制相位圆,物理万能门集 $\{H,T,\mathrm{CNOT}\}$ 逐位精确嵌入(VII1/VII2)。

两岁半 Code 仓库 681

Atlas 300I Duo - vllm部署Qwen3-VL-8B-Instruct

本文介绍了在Ascend NPU环境下部署Qwen3-VL-8B大语言模型的步骤。主要包括:1)安装驱动、docker和vllm镜像;2)创建特权容器并挂载设备与目录;3)进入容器安装指定版本的transformers;4)设置环境变量和NPU卡配置;5)启动vllm服务;6)测试API接口。部署过程涉及多块NPU卡的使用,需注意内存碎片化问题,最终通过vllm框架提供模型推理服务。

m0_50105717的博客 1563

量子光子计算:引爆算力

BBN 研究院立足于物理学、工程学与计算机科学的交叉地带,持续拓展量子技术、下一代计算与光子学的技术边界。研究院研发新型量子架构与量子算法,优化量子处理器,并开发新型集成光子系统,可应用于光计算、高级成像、现场实用设备以及生物光子学领域。材料科学方面,BBN 聚焦具备量子特性的二维材料,取得了诸多技术突破,例如首次实现利用单层石墨烯完成单光子探测。

雪兽软件 134

【Android 11】使用Android Studio调试系统应用之Settings移植(三):构建Settings、SettingsLib项目文件

基于android 11,本系列文章力争实用,讲解使用AS调试系统app的方法,并提供了配套源下载,供学习调试。上一篇文章[Android 11]使用Android Studio调试系统应用(二):依赖分析、android.bp、静态和动态依赖,讲解了如何搭建编译服务器,如何下载AOSP源码,如何切换到AOSP的指定分支(android-11-r39),以及如何编译、解决编译错误、运行模拟器,本文将开始讲解如何构建Settings的AS工程文件! 走过、路过,有用过的同学,记得给个赞O(∩_∩)O哈!

上周的博客 2687

白鲸优化算法(BWO)详解:从生物灵感 to 工程实践

白鲸优化算法(BWO)是一种新型的群体智能优化算法,模拟白鲸的游泳、捕食和鲸落行为。该算法通过平衡因子控制探索与开发阶段的转换:探索阶段采用正弦/余弦函数模拟白鲸的同步游泳,开发阶段引入莱维飞行增强局部搜索,鲸落阶段通过随机更新避免局部最优。BWO具有参数少、实现简单、收敛速度快等优点,已在多个优化问题上展现出优异性能。其数学模型将白鲸的三种核心行为抽象为位置更新公式,实现了全局搜索与局部开发的自然平衡。

qq_42212808的博客 291

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 352

【AUTOSAR-CanNM】-3.1-如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

「汽车电子助手」的博客 4724

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 312

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 333

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 606

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 148

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 24

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 440

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 426

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 174

算法64,字母异位词分组

代码核心思路是:互为字母异位词的字符串,在对其字符进行排序后,一定会得到相同的字符串。因此,可以将排序后的字符串作为哈希表的键(Key)来进行分组。

sheshibenniaodan的博客 203

【MPC 算法】Python 实战:模型预测控制(MPC)算法原理与代码实现

本文介绍模型预测控制(MPC)原理与Python实现。MPC通过滚动优化预测未来状态,结合系统模型、目标函数与约束条件,动态生成最优控制序列。以一阶温度系统为例,使用CVXPY构建凸优化问题,实现加热功率的智能调控。代码包含模型预测、目标函数设计(含温度跟踪与控制平滑惩罚)、输入约束及滚动更新机制。仿真结果表明,MPC能快速稳定温度至目标值60℃,且控制动作平滑合理,体现其在复杂系统中的优越性。

赖德发的博客 51

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 223

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 181

【前缀和+复合离散化】题解:双色矩形(two)_数据结构_算法优化_预处理_二维前缀和_STL_C++算法竞赛

给定一个 $n \times n$ 的黑白棋盘,初始按 $i+j$ 奇偶染色,经 $k$ 个格子颜色翻转后,求子矩形中黑白格子数差的绝对值最大值。由于 $n$ 可达 $10^9$,但 $k \leq 50$,可离散化关键点。枚举所有由修改点构成的矩形及其四边向外扩展(共 $16$ 种扩展方式),利用二维前缀和快速计算变化量,结合奇偶性判断多出的格子颜色,最终取最大绝对差。时间复杂度为 $O(k^4)$,在 $k \leq 50$ 下可行。

YLCHUP的博客 205
上一篇: 【量子力学原理】3 量子测量理论:从投影到QND的完整技术手册
下一篇: 【模型后训练与深度推理】2 过程奖励模型与步骤级监督
VectorShift
博客等级 码龄1年 1839粉丝 1109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VectorShift

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值