做RLHF的工程同学,十个里有八个被KL系数β调参折磨过。设得太小,模型容易放飞自我,刷高奖励但输出变成胡言乱语;设得太大,模型缩在参考模型身边,人类偏好进步缓慢。这里的"参考模型",绝大多数情况下就是你最初那个SFT模型——一个锚点。但如果你手头有多个候选底座模型,比如一个擅长代码、一个擅长通用对话、还有一个蒸馏过的轻量版本,标准RLHF公式就失效了:KL到底跟谁算?各自设多少权重?多个参考模型的信息怎么融合?
我最近反复研究了一篇发表在AI领域顶级会议方向上的理论工作,标题大约是 KL-Regularized RLHF with Multiple Reference Models: Exact Solutions and Sample Complexity。它研究的就是多参考模型场景下的KL正则化RLHF,而且给出了两类硬核答案:第一,最优策略的精确解长什么样;第二,需要多少样本才能逼近这个最优策略。这篇博文不打算复述论文的每一页证明,而是把它翻译成从业者能直接用的语言:多参考模型的数学本质是什么、精确解为什么长这样、样本复杂度结论对数据配置有什么影响,以及我在实际对齐训练中踩过的相关坑。
这套内容适合正在做对齐训练、或者准备把RLHF引入业务场景的工程师读。如果你只是听说过DPO、PPO这些名词,也能从里面获得一个清晰的框架。我会尽量把数学讲人话,至少让你在下次聊多模型对齐时,能准确说出"几何平均"和"算术平均"的区别。
1. 这篇理论工作到底在解决什么问题
1.1 回头看一眼RLHF的"安全绳"机制
标准RLHF流程大家都熟:先用海量文本预训练一个底座模型,做一遍有监督微调得到初版对齐模型,再收集人类偏好数据训练奖励模型,最后用强化学习去优化策略,让输出得分越来越高。但如果你真跑过这类训练,一定知道"不加约束地优化奖励"会出大问题。模型很快会学会钻空子:在奖励模型的盲区输出违禁内容、疯狂堆砌套话、生成结构畸形但奖励反常地高的文本。所以所有实用RLHF流程都会在目标函数里加一项KL正则化:让更新后的策略不要离某个参考分布太远。
这个参考分布几乎总是那个SFT模型。它就像一根安全绳,模型允许往外探索,但弹性限度明确。绳子的松紧由β系数控制:β太小,绳子太长,模型容易飘;β太大,绳子太短,模型几乎不动,人类偏好信号等于被浪费。我在实际调参时经常要在一定范围内扫描β,观察KL散度与奖励均值怎么平衡。这算是工程手感,但理论上,给定参考模型和奖励函数,最优策略其实存在闭式解——这是RLHF以及后续一大批偏好优化算法的公共理论地基。
1.2 单参考模型假设在现实场景里越来越站不住
问题在于,标准理论推导默认只有一个参考模型,而现实工程项目中,团队手里往往不止一个候选底座。我就见过某公司的实际状态:同时维护着一个通用底座、一个代码专项模型和一个压缩后的移动端模型。做对齐时该以哪个为参考?只选通用底座,代码专项模型的独特经验就浪费了;只选代码专项模型,通用对话能力可能被带偏。有人会想"把它们做算术平均再当参考不就行了",但模型是定义在整个词表上的概率分布,算术平均只是把各token的预测概率做均匀软化,丢掉了大量结构信息。
多参考模型不是稀罕事,而是常态。论文标题里的"Multiple Reference Models",研究的就是在KL正则化RLHF中引入多个参考模型后,目标函数如何定义、最优策略能否写出精确解、学习它需要多少样本。这几年我一直在做对齐相关的训练工作,看到这个方向时最大的共鸣是:它终于把工程里"用哪个模型做锚点"的隐性纠结,变成了一个可以被严格分析的理论问题。
2. 多参考模型目标函数:KL到底往哪里约束
2.1 先理解单参考模型那个"闭式解"是什么
先摆数学结论。如果优化目标是:
max π E[ r(x,y) ] - β · KL( π || π_ref )那么最优策略满足:
π*(y|x) ∝ π_ref(y|x) · exp( r(x,y) / β )这里的∝表示"正比于",等号成立时还要做一次归一化,让所有词的概率加起来等于1。这个形式非常像softmax,区别在于底数不是零向量,而是把参考模型的对数概率当成先验logit,再把奖励除以β作为额外的logit加成。推广来说,最优策略是在参考模型的地盘上,按奖励高低重新分配概率。奖励高的token被放大,奖励低的被压制,但压制幅度受β控制,不会无限偏离参考模型。
这个解之所以叫"精确解",是因为它是目标函数在概率单纯形上的全局最优。β>0时目标函数严格凸,不存在局部最优来糊弄你。这是整个RLHF理论的基石,也是后面所有偏好的优化算法做简化的出发点。
2.2 多参考模型的目标函数:加权平均KL
当参考模型变成一组 π_ref¹、π_ref²、……、π_refᵏ,一个自然的目标函数是:
min π -E[ r(x,y) ] + β · Σ_{i=1..K} w_i · KL( π || π_ref^i )其中w_i是非负权重、合计为1,表示你有多信任第i个参考模型。每个下标i对应一个参考模型,KL散度仍然逐个计算,总惩罚是它们的加权平均。
这里有几个设计选择需要想清楚。权重全相等就是朴素平均;某个模型更权威就给更高权重。更进一步,每个参考模型可以配不同的β_i,对应不同信任程度的安全绳松紧。还有一个微妙点:多个参考模型可能来自不同分布,有的宽泛、有的集中、有的覆盖度窄。它们互相之间可能冲突也可能互补。
我最初看到这个目标函数,直觉是"惩罚总和"会把所有参考模型的特征都吸收进π。但关键问题是:加权平均KL并不等于"先对模型做算术平均再算一次KL"。这两种做法的数学性质差异极大。后者在概率分布空间做的是线性插值,前者实际上在做另一种插值——几何平均。理解了这一层,多参考模型的本质就清楚了。
2.3 精确解的形态:几何平均,不是混合平均
为了方便说明,先只看单个prompt下模型的输出分布。引入一个"未归一化的几何平均密度":
q_hat(y) = exp( Σ_i w_i · log π_ref^i(y) )利用对数恒等式:
Σ_i w_i · KL( π || π_ref^i ) = ∫ π(y) · log[ π(y) / q_hat(y) ] dy = KL( π || q_hat )这里KL散度扩展到了未归一化分布。把q_hat归一化为q之后,归一化常数与π无关,所以在优化中可以被忽略。于是多参考问题等价于:
min π -E[ r(x,y) ] + β · KL( π || q )精确解变成:
π*(y|x) ∝ exp( Σ_i w_i · log π_ref^i(y) + r(x,y) / β )这个公式的美感在于:多个参考模型作为一个整体,贡献给最终策略的是一个"对数值的加权和"。用大白话说,每个参考模型先把自己对每个token的对数概率摆出来,大家按权重加在一起,形成一个共享锚点,然后再用奖励logit去微调。这和"多个模型投票决定一个答案"完全不同。投票只在token级别做加法,模型多样性会被算术平均抹平;几何平均则保留了每个模型独特的尖锐特征——只要某个模型对某个token有较强确定性,它的对数概率就会很大,加权后依然显著。在实际训练中,这意味着代码专项模型对代码token的自信不会被通用模型的模糊预测稀释掉,这是多参考模型最大的价值。
3. 精确解推导:从凸优化到softmax的完整思路
3.1 拉格朗日乘子法:把约束优化变成无约束问题
要证明上面的精确解,标准做法是拉格朗日乘子法。目标函数是定义在概率单纯形上的凸泛函,约束只有一个:∫π(y)dy=1。写出拉格朗日函数:
L = ∫π(y)(-r(y))dy + β Σw_i ∫π(y)log(π(y)/π_ref^i(y))dy + λ(∫π(y)dy - 1)对π(y)做变分导数并令其为零,得到:
-r(y) + β Σ_i w_i [ log π(y) + 1 - log π_ref^i(y) ] + λ = 0整理后得到对数形式:
log π(y) = [ Σ_i w_i · log π_ref^i(y) + r(y)/β - 1 - λ/β ]指数化再归一化,就是前面那个softmax形式的精确解。整个过程没有近似、没有截断,也没有用到任何关于模型架构的具体假设。这也是为什么这类结果可以称为精确解:它不依赖神经网络的结构,只要策略定义在有限词表上,结论都成立。
3.2 三个关键数学技巧
第一个技巧是"对数和指数搬家"。把多个加权KL项合并成单个与几何平均分布之间的KL,这一步把"多个约束"化简为"一个约束",问题的复杂度立刻低了一个维度。第二是归一化常数无关性:在变分导数里,q_hat与归一化常数Z的差只体现在λ里,而λ最终被归一化步骤吸收,所以不需要真正计算q_hat的积分,只需要知道它正比于那个指数表达式。第三个是变分导数的交换:对π(y)求导时积分号与导数可以交换,因为被积函数足够光滑,初学者容易忽略,逐项展开时很容易漏掉λ和常数项。
这三个技巧都不难,合在一起却把"多参考模型"的复杂度消解掉了。我看到推导过程时不由感叹,这个问题的难度其实不在多参考,而在于大家默认了"参考模型只能有一个"的思维定式。一旦写出几何平均的锚点,后面所有分析都顺理成章。
3.3 为什么精确解在实际中有意义
精确解的价值不在于让你真去存储一个覆盖全词表的高维分布,而在于三点。
第一,理论分析有了抓手。后续关于样本复杂度的分析可以围绕这个闭式解展开,而不是依赖难以分析的迭代算法轨迹。第二,设计算法有了基准。现在很多实用算法,本质上就是把RLHF目标改造成分类或回归目标,这些算法在单参考模型下的有效性依赖闭式解;多参考模型也有了闭式解,那些简化算法就能顺理成章推广到多参考场景。第三,诊断模型异常更清楚。π*可以分解成两项:锚点对数先验加奖励logit除以β。训练中模型输出异常时,可以区分是锚点出了问题,还是奖励信号出了问题。这个分解能力在实际调参时极有价值。
4. 样本复杂度分析:需要多少偏好数据才够用
4.1 从工程角度看"样本复杂度"
样本复杂度在理论文献里的意思是:给定样本量n,算法学出来的策略与真正最优策略之间的差距能压到多小;或者反过来,要把差距压到ε以内,最少需要多少样本。从业者经常忽略这个概念,我一开始也觉得它是"发论文用的"。但实际上它直接回答一个工程问题:我只在某个prompt集上收集了1万条偏好标注,到底够不够?
这类结论通常有统一形式:最优策略差距 ≤ 与样本量相关的项 + 与模型类别相关的逼近误差项。样本量项最常见的形态是O(1/√n)或O(log n / n)级别。对所有偏好优化算法来说,数据规模决定了下限。换句话说,不管你的算法多精巧、框架多花哨,样本量不足时,学出来的策略与理论最优策略之间必然存在一个无法逾越的差距。这一点在做预算规划时必须心里有数。
4.2 多参考模型如何影响样本需求
多参考模型场景下,样本复杂度的分析结果会给出几个稳定直觉,这些是基于该方向一般性方法论的解读,具体数字需要看论文的详细设定。
β越大,正则化越强,策略被牢牢限制在锚点附近,对样本噪声越不敏感,达到同样误差所需的样本量通常更少。但代价是,如果锚点本身离最优偏好很远,正则化带来的偏差就会变大。参考模型越多,每个参考模型覆盖的分布范围可能越广,样本估计的方差未必会增大太多,因为几何平均天然取交集,真正共同的高置信区域会被保留;但如果参考模型差异极大,几何平均分布可能把概率质量分散到大量低置信区域,这反而会增加所需样本量。奖励信号质量比数量更关键,奖励噪声通过β放大或缩小,标注噪声大时可以适度提高β,牺牲一点上限换更快的收敛。
这些结论我在实际训练里都有对应体感。有一次做多模型对齐测试,各参考模型风格差异很大,β保持不变时KL曲线乱跳,样本效率极差;把β调大后曲线立刻平稳,最终评测时人类偏好得分虽然略低,但可控性强了很多。这不是什么高深的数学直觉,纯粹是被数据教育出来的经验。
4.3 实操启示:数据配置可以怎么做
基于上面的理解,如果准备在真实流程里引入多参考模型,这里给出一份默认配置建议,基于常见实践总结,具体请按自己场景调整:
| 配置项 | 建议值 | 说明 |
|---|---|---|
| 参考模型数量 | 1~3个 | 超过5个收益递减,管理成本上升 |
| 参考模型权重 | 按验证集单模型奖励准确率归一化 | 权重不是拍脑袋定的,用数据说话 |
| β初始值 | 单参考模型最优β的1.2~1.5倍 | 多参考锚点更"宽",需要更强正则拉住 |
| 数据量 | 每个prompt至少2~3个对比回答 | 偏好标注质量优先于总量 |
| 监控指标 | 逐参考模型KL分解、奖励方差、生成多样性 | 早期发现锚点冲突 |
这份配置不是某个实验室的固定方案,而是我在不同项目里反复试错后的通用起点。先按这个跑,再根据曲线调整,比从零摸索省时间得多。
5. 从论文到工程:多参考模型在真实对齐流程中怎么用
5.1 参考模型选择与权重分配经验
选择参考模型不是简单的"越多越好"。我的建议是先看任务分布。如果任务里代码和通用对话各占一半,就各放一个专项参考模型,权重按任务占比分配;如果任务非常垂直,其他参考模型反而会拖后腿。原因在于几何平均的惩罚机制:某个参考模型在无关token上出现极端低值,会在指数项里压制整个锚点。这是多参考模型与单参考模型最大的不同——一个糟糕的参考模型不仅贡献小,还会放大噪声。
权重不要一开始就固定。可以先按0.5/0.5跑一小批,看策略到每个参考模型的KL散度值。哪个散度涨得快,就说明哪个参考模型与奖励冲突更大,适当压低它的权重。这个做法类似多任务学习里的加权损失调整,本质上是把"模型与奖励的一致性"当成可观测信号。还有一个容易踩的坑:不要把多个参考模型和多个奖励模型集成混为一谈。奖励模型集成解决的是奖励估计方差问题,参考模型解决的是策略锚点偏差问题。两者可以同时用,但作用在目标函数的不同项上,混用会干扰诊断。
5.2 一个可复现的模拟配置示例
这里给一个模拟项目X的配置示例,用伪代码形式展示多参考模型RLHF的关键流程。
# 目标函数 L(π) = -E_{x,y~π}[ r(x,y) ] + β * Σ_{i=1..K} w_i * KL( π(·|x) || π_ref^i(·|x) ) # 超参(模拟项目X) 参考模型数量: 2 参考模型: ref_code(代码专项),ref_general(通用对话) 权重: w = [0.6, 0.4] β: 0.1(初始,后续按KL曲线调整) 学习率: 1e-6 优化器: AdamW 批大小: 128 prompts 训练步数: 2000步,每500步打印所有参考模型的KL和奖励均值 # 训练循环 for step in range(2000): batch = sample_batch(5k_prompts) reward = compute_reward(batch) # 来自奖励模型 kl_code = kl_divergence(π, ref_code) kl_general = kl_divergence(π, ref_general) loss = -reward.mean() + β * (w[0]*kl_code + w[1]*kl_general) loss.backward() update(π)这个示例最关键的观察点不是损失函数写法,而是三件事:KL要按参考模型分开统计,别只算加权总KL;β从一开始就要准备动态调整,不要锁死;权重w在训练初期可以滚动更新,不要一上来就固定。很多同学在复现这类配置时,都卡在第三个点上。
5.3 常见问题与排查思路速查
实际跑多参考模型RLHF时,典型问题就那么几类,整理成一个速查表方便对号入座:
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 训练刚起步KL暴增 | 参考模型与策略初始化分布差异过大 | 临时加大β,或先让策略在参考模型几何平均锚点附近热身 |
| 多个参考模型权重难收敛 | 权重固定太早,奖励冲突没暴露 | 改成"先更新权重、后更新策略"的交替方式,在验证集上滚动更新 |
| 策略在某参考模型的强项上退化 | 奖励模型对该特长领域区分度不足 | 核查奖励模型在该领域token上的梯度,补充对应偏好数据 |
| 样本需求远超预算 | β太小或参考模型差异过大 | 先调大β试两轮,再考虑减少参考模型数量,最后检查标注噪声 |
| 生成风格混乱,看不出锚点影响 | 几何平均被某个极端低值主导 | 逐个检查参考模型在采样token上的log概率,定位异常参考模型 |
这些坑我基本都踩过一遍。最典型的是"权重固定太早"那条:一开始图省事,把两个参考模型权重锁死0.5/0.5,结果训到1000步时KL曲线严重分化,回退重来浪费了整整两天。后来改成滚动更新权重,一个下午就稳住了。
6. 最后再分享一点个人体会
这篇理论工作我反复读了好几遍,最打动我的不是那个漂亮的softmax形式,而是它把"多模型锚点"这个工程直觉变成了可训练的数学对象。在真实对齐项目里,多参考模型从来不是选择难题,而是资源利用问题:你手头明明有多个好模型,却因为目标函数不清晰,被迫扔到一边,只能用单个参考模型,这本身就很可惜。
如果你想在自己的训练流程里尝试多参考模型,我建议从两个参考模型开始,权重先按任务分布定,不要拍脑袋。跑的过程中,把每个参考模型的KL散度分开打印出来,而不是只盯加权总和,这样你才能真正看到冲突在哪里。几何平均的锚点逻辑,本质上就是在告诉模型:"这几个参考模型的共识是什么,你就往共识方向走;它们分歧的地方,让奖励在β允许的范围内去裁决。"
我个人的经验是,多参考模型不是银弹,它只是把"模型怎么选"的纠结延伸到了"权重怎么调"的纠结。但至少在理论层面,我们现在知道最优策略长什么样,也大致知道需要多少数据,剩下的就交给工程调参的手感和足够的耐心。后续这个方向还可以往多阶段对齐、灾难遗忘抑制、动态权重调度等方向扩展,每一个都值得单独开一篇聊聊。