我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

贝叶斯非负奖励模型BNRM:稳定RLHF奖励建模的新思路

贝叶斯非负奖励模型BNRM:稳定RLHF奖励建模的新思路 做RLHF做到第三个月的时候我彻底对“奖励模型”这四个字失去了安全感。当时用的标准奖励模型在验证集上的偏好分类准确率已经刷到了很不错的水平可一旦接到策略优化里模型就开始疯狂输出那种“看起来很有道理、读起来全是空话”的内容——就是大家常说的reward hacking。后来我把奖励模型的输出分布打出来看了一眼发现评分尺度在一轮训练里能上下漂移好几个点而且它对给出的分数完全没有置信度可言。这也是我后来转向贝叶斯非负奖励模型BNRM的直接原因。BNRM这个方向很有意思它其实是对奖励模型做了两件事第一把奖励输出约束成非负值第二给奖励参数引入贝叶斯后验分布让模型在打分的同时告诉你怎么“不确定”。这两件事单拎出来都不算新但合在一起正好打在标准奖励模型的几个要害上。这篇文章我打算把BNRM的设计动机、数学推导、训练流程和踩坑经验完整过一遍适合已经被RLHF折磨过、想给奖励模型换一种更稳做法的朋友参考也适合刚入对齐方向、想把奖励建模理解透的初学者。1. 标准奖励模型为什么不够用1.1 RLHF流程中的奖励模型先对齐一下语境。RLHF到现在已经演出了很多变体但主流仍然可以拆成三步先用人工或规则数据做有监督微调SFT然后训练一个奖励模型Reward Model, RM最后用强化学习PPO这类算法去优化策略。奖励模型在这条流水线里承担的是“人类偏好的代理”这个角色——它需要在偏好数据上学会什么样输出更符合期望然后在策略优化阶段给每一条生成结果打分。标准做法是Bradley-Terry模型。给定同一个提示x下的两个回答y_a和y_b人工标注告诉我们y_a比y_b好那奖励模型就要让r(x,y_a)尽量大于r(x,y_b)。用公式写就是P(y_a y_b) σ(r(x,y_a) - r(x,y_b))其中σ是sigmoid。训练的时候最大化偏好对上的对数似然等价于让两个回答的奖励差值尽量拉开。这个思路简洁、稳定也被证明非常有效但它把“人类偏好可以建模成一个标量分数”这个假设贯彻得很彻底问题恰恰也出在这。1.2 标准奖励模型的三个“内伤”我实际跑过的标准RM几乎没有不踩下面三个坑的。第一点估计给不了置信度。训练收敛之后模型只输出一个固定分数它不会告诉你这个分数是“很有把握”还是“猜的”。但在真实偏好数据里很多pair本身就是模糊的、甚至是标注员随机翻牌的。标准RM面对这种样本时只能强行给一个分数分数背后的不确定性完全丢失。到了PPO阶段策略会去追高分哪怕这个高分只是模型瞎猜出来的策略也会把它当成真实信号去学习。第二输出尺度不受约束漂移严重。标准RM最后一层是线性层输出可以落在任意实数区间。同一个RM训练1个epoch和训练2个epoch分数分布可能完全不同。那PPO里的reward clip阈值、KL系数就都要跟着调。我试过最夸张的一次模型在300步内平均奖励从0.8涨到2.4策略其实没有变好只是RM自己在漂移。第三对奖励语义没有约束。标准RM既可以给正分也可以给负分但“负分”在某些场景下很难解释。比如推荐场景里用户没点击只是“不感兴趣”并不等于“反感”安全对齐里我们经常希望模型对违规请求给一个“拒绝”动作但这个动作可能没有明确的负向程度。将奖励约束为非负相当于给打分一个语义下界0分意味着“没提供任何正向价值”所有分数都朝“有用、安全、符合偏好”的方向度量。这在实践里能减少很多奖励解释上的麻烦。1.3 BNRM想解决的到底是什么BNRM的设计目标是把上面三个问题一次性做进模型架构里而不是靠后处理去修。非负约束负责解决语义和尺度漂移的一部分问题贝叶斯化负责解决不确定性和鲁棒性的问题。二者结合带来的直接好处是在PPO阶段我们可以根据后验分布对每个奖励信号做“减不确定性惩罚”或“采样”处理让策略在低置信度区域不再盲目追高从根本上缓解reward hacking。理解这一层很重要因为BNRM不是一个“更准的打分器”它是一套更完整的奖励建模方案。它牺牲了一部分训练便利性换来了对奖励不确定性的显式建模和更强的安全边界。后面所有数学和代码都围绕这个核心思想展开。2. BNRM的核心设计思路与数学骨架2.1 非负是约束更是语义BNRM最常见的参数化方式是把奖励模型最后一层的输出接一个softplus激活r(x,y) softplus(f_θ(x,y)) ln(1 exp(f_θ(x,y)))softplus形状像一个平滑的ReLU输出永远大于0而且没有尖角梯度可以正常回传。有些实现会用softplus(x)再乘一个缩放因子保证奖励上限不至于过小。其实用平方输出或者exp输出也能保证非负但softplus在逻辑回归式的训练里数值稳定性更好——它的导数有自然的上界不会像exp那样指数爆炸。为什么非负这么重要从数学上看非负约束改变了奖励空间的拓扑结构。标准RM的奖励空间是R整个实数域两个样本的分数差可以无限大模型训练时天然的倾向就是把正负样本使劲拉开而BNRM的奖励空间是R0是一个硬性下界这限制了过大的奖励差值模型必须用更“经济”的方式去表达偏好。尤其在样本噪声大的时候标准RM会把噪声当成信号去拉分BNRM因为下界的存在天然对异常偏好没那么敏感。从PPO实操来看非负奖励还有另一个隐性好处KL惩罚项和奖励项在做权衡时reward clip边界可以设置得更有物理意义。比如把奖励clip在[0, 5]区间0就对应“无价值”5对应“优秀”设置参数时心理有个谱。标准RM的负分区间到底怎么处理很多时候真的只能靠猜。2.2 贝叶斯化奖励的不确定性表达非负约束解决的是语义和尺度问题贝叶斯化解决的则是置信度问题。标准RM把参数θ当成一个固定值训练一次得到点估计。BNRM换了一个思路参数θ是一个随机变量我们对它先验p(θ)有一个判断看到数据D之后更新的后验分布p(θ|D)才真正用于预测。用贝叶斯公式写清楚就是p(θ|D) ∝ p(D|θ) · p(θ)数据似然p(D|θ)和标准RM一样来自Bradley-Terry偏好模型。而预测奖励时不再用一个固定参数前向计算而是对后验做积分p(r|x,y,D) ∫ p(r|x,y,θ) · p(θ|D) dθ这个积分在神经网络里没法精确算所以实际会用两种近似一是变分推断用一个简单的分布去近似后验二是MCMC采样用HMC或NUTS从真实后验里采样。后面实操环节我会展开说这两种选择的取舍。核心是要理解BNRM的最终输出不是一个标量而是一个奖励分布。这个分布的均值就是点估计方差就是不确定性。举个具体例子。某段生成内容在训练集里出现了100次偏好都是一边倒的那么后验分布会很尖方差很小另一段内容只出现过两次而且标注员之间还有分歧后验分布就会很胖方差很大。这个方差信息在标准RM里完全看不到但它在PPO里太重要了——策略在不确定的区域应该谨慎而不是冒险。2.3 BNRM与标准BT模型的数学关系看公式会发现BNRM其实没有抛弃Bradley-Terry而是把它做了三层扩展。第一层奖励函数r(x,y)被参数化为非负函数而标准RM没有这个约束。第二层模型训练目标从“最大化一个固定的log-likelihood”变成“最大化后验分布的证据下界ELBO”。第三层推理时从“前向一次得到分数”变成“采样多个参数前向多次得到分数分布”。标准RM可以看成BNRM的一个退化特例如果我们把先验分布设成方差无穷大即惩罚项消失参数约束也取消同时后验推断只用最大后验MAP点估计BNRM就完整退化成标准的Bradley-Terry奖励模型。这个退化关系很重要它说明我们做的一切改动都是兼容性扩展而不是另起炉灶。在工程实现上先用标准RM的权重做BNRM初始化几乎可以无缝衔接。3. 从数学到训练BNRM落地全过程3.1 先验设计把先验知识“写”进模型BNRM里先验不是摆设它决定了不确定性估计的质量。我尝试过的先验大致分三类。第一类是球面高斯先验也是推荐拿来当默认的p(θ) N(0, σ0² · I)σ0取0.1到1.0之间。这个先验唯一的作用是防止参数飞太远相当于一个可调节的正则化强度。好处是简单稳定几乎不需要调参。第二类是分层先验给参数分组设置不同的先验方差例如把embedding层和分类头的先验尺度分开。它能表达“embedding比分类头更可压缩”这类知识但实现复杂度高收益往往不明显。第三类是稀疏先验类似Lasso的思路鼓励奖励模型只依赖少数关键特征。这个在特征维度很高时才推荐尝试否则容易引入额外偏差。实操建议是第一版先做球面高斯先验把σ0调到在验证集准确率不下降的前提下尽量大。这个值的意义很直观——先验方差越大数据对后验的塑造能力越强先验方差越小后验越保守不确定性估计越大。如果你发现BNRM的不确定性整体偏高策略优化得畏畏缩缩第一反应不应该是改学习率而是把先验方差调大。3.2 后验推断变分还是MCMC后验推断是BNRM工程实现里最重要的一个岔路口两种主流路线各有个的适用场景。变分推断VI的思路是选一个简单的变分分布族比如对角高斯q_ψ(θ) N(μ, diag(σ_ψ²))然后优化ELBOL(ψ) E_{θ~q_ψ}[log p(D|θ)] - KL(q_ψ(θ) || p(θ))第一项让模型拟合偏好数据第二项让变分分布别偏离先验太远。优化这个目标用重新参数化技巧就能搞和训练普通网络几乎一样。对于LLM规模的奖励模型我用下来感觉变分推断几乎是唯一现实的选择——推理速度和标准RM一样不确定性通过多次前向采样获得代价是后验可能被对角高斯限制住相关性参数学不出来。MCMC路线里HMC/NUTS在小模型上能采出高质量后验样本但放到现代规模的大语言模型上采样成本劝退。NUTS需要计算Hessian或至少高阶梯度信息一次采样几十步显存和时间都撑不住。我的看法是科研验证阶段用MCMC做“黄金标尺”对比VI的近似质量工程落地阶段直接上VI没必要纠结。3.3 后验奖励如何接到策略优化里拿到奖励分布之后怎么用是关键。我试过三种方式分别对应不同的优化心态。第一种是后验均值不确定性惩罚也是推荐做安全对齐时优先尝试的r_ppo(x,y) μ_r(x,y) - λ · σ_r(x,y)其中μ_r和σ_r分别是从后验采样计算出的奖励均值和标准差λ是一个正的超参数。这背后的想法是悲观主义当一个样本的奖励不确定时我们向下修正它的分数策略就不会去过度追逐这些模糊的高分区域。和标准RM相比这个方案等于给奖励信号加了一道“护栏”rewards less likely to be gamed。第二种是Thompson采样也叫后验采样式。每个PPO batch随机从后验分布里采一个奖励函数参数用它给整个batch打分。这样策略在训练中会自然倾向于在“大多数后验样本都给高分”的区域前进而偶尔的随机性也变相起到了探索作用。这种方式实现最简单但方差会比上一种大。第三种是乐观探索版把r_ppo设成μ_r λ·σ_r。它鼓励策略去试那些不确定性高的区域适合探索型任务。除非你的任务真的是鼓励探索否则我一般不建议用——在安全对齐场景里乐观探索等于主动去撞模糊地带出问题概率偏高。3.4 关键训练伪代码与超参数下面给一段核心逻辑的伪代码展示BNRM训练和PPO接入的完整链路。框架无关看逻辑就行。# BNRM 训练阶段 # 模型: f_theta backbone head # 非负层: reward softplus(f_theta(x)) def bnrm_train_step(batch_x, batch_y_a, batch_y_b, pref, prior_scale0.5): # 变分参数: mu, log_var eps gaussian_sample(mu.shape) theta_sample mu exp(0.5 * log_var) * eps r_a softplus(f_theta(x, y_a, theta_sample)) r_b softplus(f_theta(x, y_b, theta_sample)) r_diff r_a - r_b log_p -softplus(-r_diff) # 等价于 log sigmoid(r_diff) nll -mean(log_p) kl gaussian_kl(mu, log_var, prior_scale) loss nll kl / batch_size update(mu, log_var, loss) return loss.item() # 得到奖励分布 def predict_reward_distribution(x, y, n_samples16): rewards [] for _ in range(n_samples): theta_sample posterior_sample() rewards.append(softplus(f_theta(x, y, theta_sample))) rewards stack(rewards) # [n_samples, batch] return mean(rewards, dim0), std(rewards, dim0) # PPO 阶段 def ppo_batch_inference(x, responses, lambd0.5, modepessimistic): mu, sigma predict_reward_distribution(x, responses) if mode pessimistic: r mu - lambd * sigma elif mode thompson: idx random_index() r posterior_samples[idx] elif mode optimistic: r mu lambd * sigma return r有几个超参数值得单独说。KL项前面的系数官方常规做法是让KL项在总loss里占比在0.1到1之间太小后验会坍缩到点估计太大模型会欠拟合偏好数据。变分采样数n_samples训练时可以取1推理时建议至少8到16。λ的取值我没有一个普适默认方案和奖励数值范围强相关通常从0开始逐步往上试0先确认基线的reward hacking程度再以0.25的幅度递增。4. 实验配置与效果评估细节4.1 数据准备与预处理习惯BNRM对数据质量的要求比标准RM更高原因是不确定性建模会把“数据覆盖不足”这件事暴露出来。偏好数据构造上我一直用的思路是这样的。提示词覆盖要广确保不同难度、不同话题的prompt都有足够的数量。如果提示词分布偏斜BNRM会在高频区域学得“胸有成竹”低频区域学得“满腹狐疑”这个特征本身是准确的但如果你在策略优化时用了统一的不确定性阈值就得留意低频区域会不会普遍被低估。标注一致性处理也容易踩坑。同一对样本请三个标注员标结果2比1这算偏好还是算噪声我建议把这个信息编码进训练目标而不是简单地把多数派当成硬标签。具体做法是给每个pair一个置信度权重完全一致标注的样本权重1.0有分歧的样本权重0.5让BNRM在分歧样本上不要过度自信。这个改动虽然朴素但实测能明显改善后验校准质量。4.2 超参设置参考表下面这份参数表是我在7B级基座模型上跑出的相对稳定配置不同规模模型可以在此基础上缩放。参数参考值说明先验尺度 σ00.3 ~ 1.0先验方差决定不确定性估计的保守程度变分分布对角高斯简单稳定支持重参数化训练KL系数0.1 ~ 1.0按总loss比例调节过小会后验坍缩训练采样数1训练阶段减少计算量推理采样数8 ~ 16计算奖励均值与标准差悲观系数 λ0 ~ 1.0从0开始递增观察reward hacking程度偏好温度 T0.1 ~ 1.0缩放r_diff温度越低偏好区分越尖锐学习率1e-5 ~ 5e-5与标准RM一致即可这里特别提一下温度T。标准RM公式里sigmoid的输入是r_a - r_b有时训练会发现模型过于自信logits差动辄10以上这时候在差值上除一个温度T可以压住尖锐度。BNRM是由高斯后验采样的r_diff天然带有不确定性抖动温度的作用相对被削弱了一些但仍建议保留一个可调的温度参数观察后验不确定度与校准误差的关系。4.3 怎么评估BNRM真的变好了评估BNRM不能只看偏好分类准确率。准确率能证明它“判别力不差”但证明不了不确定性估计是否有效。我自己常用的评估角度有五项。奖励分布校准度是核心指标。把预测样本按不确定性分桶方差最小的桶、中间桶、方差最大的桶检查桶内预测奖励均值和实际偏好标签一致的比例。如果低不确定性的桶内准确率高于高不确定性的桶说明方差确实携带了有效信息。这个做法和分类器校准里的ECE异曲同工。PPO稳定性指标也要看同样优化步数下使用BNRM后KL和reward的比值曲线是否能更稳定收敛。前面提到的reward改写率也很有说服力统计PPO训练中超出clip边界的reward占比和reward尺度漂移方向BNRM应该明显更稳。生成质量和安全指标不能省最终要回到策略输出的自动评估和人工抽评上。计算效率也要记录VI只比标准RM多了一倍推理时间如果优化的好差值可以压在30%以内。5. 常见问题与排查实录5.1 非负激活导致的梯度饱和softplus在输入向负数方向拉得很大时输出趋近于0梯度趋近于0。训练初期如果模型权重初始化不合适f_θ(x,y)普遍都是很大负数softplus输出基本为0r_a和r_b都是0r_diff永远约等于0loss不下降。排查时我习惯先打印奖励分布。如果你发现大量样本的奖励都压在0.01以下说明softplus饱和了。解决方案有三个第一重新初始化最后一层让输出大致落在[-3, 3]区间softplus会平滑过渡第二先让模型用MSE目标在SFT输出上学一个粗糙的打分回归作为冷启动第三给softplus加一个偏移量r(x,y) softplus(f_θ(x,y)) epsilonepsilon取1e-4到0.01保证奖励永远不会完全归零也就不会出现全零梯度。这个偏移量很小不影响语义但能救训练一命。5.2 后验坍缩与不确定性失真变分推断最经典的问题就是后验坍缩q_ψ(θ)的方差被优化到接近0模型重新退化成点估计。表现是预测奖励分布极度尖锐所有样本的不确定性几乎一样方差失去了指示意义。原因通常是KL项权重太低或者数据量太大、模型容量和KL项之间失衡。调整方向我刚才说过先把KL系数往上抬观察后验方差是否恢复到有区分度的状态。另一个我试过有效的做法是对变分分布做“预热”训练前500步只优化均值μ冻结log_var让模型先在偏好数据上找到一个好的参数区域再放开方差优化。这能避免训练初期高loss区域里模型图省事直接把方差压到0来拟合偏好的坏结果。如果还坍缩可以考虑用低秩高斯或块对角高斯来替代对角高斯让相关性信息有表达空间。5.3 奖励尺度漂移与KL预算失衡即使加了非负约束奖励尺度漂移也只能缓解不能根治。softplus输出理论上界是无限的模型如果非常确信某样本优秀可以给一个很大的正分。这会间接推高策略的奖励预期导致KL预算失控。我踩过的坑是BNRM的reward均值调到很高的阶段策略模型仍然开始输出重复率极高的低质量内容说明模型还是没有逃脱“追高分”的陷阱。解决尺度漂移参考两个做法。第一在PPO阶段对奖励做标准化把mean和std约束到预先设定的区间这能直接阻止尺度漂移带来的波动。第二给BNRM的最终输出加一个显式上界比如用sigmoid乘以固定上限R_max上限设在4到5。这样奖励被严格约束在[0, R_max]区间。代价是模型表达极端偏好时会损失一些精度换来的是整个训练过程的稳定权衡下来通常值得。5.4 联合训练时的显存与时间问题BNRM的时间开销主要来自后验采样。预测阶段如果每个样本采样16次相当于做了16次前向这个成本在PPO训练中会被放大因为每个batch都需要为全部经验计算奖励分布。我现在的做法是分两步走。PPO外推阶段每一条经验样本只奖励采样一次。因为策略当前批次的经验和上一步的经验在分布上相差不大奖励不确定性可以复用旧统计量。然后在PPO更新阶段挑选一部分成功候选或高不确定性样本做16次重采样再用更精确的均值和方差去更新策略。这个“尝鲜版本”策略能省掉接近60%的奖励计算开销同时保留不确定性估计的核心价值。显存上变分参数比标准模型多保存一份均值和方差整体增量在5%以内基本可忽略。唯一要注意的是保存检查点时要把mu、log_var、优化器状态一起保存否则恢复训练后就无法继续变分更新了。6. 我的一线实操体会贝叶斯非负奖励模型在我自己的实践里最惊艳的不是偏好准确率提升而是训练稳定性的变化。用标准RM时PPO阶段的reward曲线像心电图换到BNRM后即使不调λ那条曲线也平滑了很多。这背后的原因我现在理解得更透彻了——策略优化不需要一个“聪明但偶尔发疯”的评判员它需要的是一个“判断稳定、敢于说不知道”的评判员。不确定性惩罚本质上是在阻止策略利用奖励模型的知识盲区。最后再分享一个小技巧。BNRM版本的奖励模型在打过几次PPO之后不要把后验参数扔了。它积累的不确定性信息可以反哺偏好数据挑选把方差最高的那批样本抽出来重新标注或做一致性检查对标噪声数据的清洗效率非常高。这个用法当初是纯属误打误撞后来成了我每次都用的一招。奖励建模这个方向与其纠结怎么加更多约束不如先让模型学会承认自己不知道什么。BNRM在这条路上的探索值得一试。
返回列表