©作者 | 刘杰
单位 | 香港中文大学MMLab
研究方向 | 大语言模型、强化学习
论文链接:
https://arxiv.org/pdf/2310.03708.pdf
代码链接: 
https://github.com/ZHZisZZ/modp

TL;DR

我们提出 MODPO(多目标直接偏好优化),它以最小的代价改进 DPO(直接偏好优化),以完成多目标对齐。
  • 在实现上,MODPO 只需要在 DPO 的基础上修改 ~2 行代码,即在 DPO 损失函数的基础上额外增加一个 margin;
  • 在理论上,MODPO 可以被证明和 MORLHF(多目标强化学习)等价;
  • 在实验上,MODPO 在安全对齐和长篇回答任务中显示出远超 MORLHF 的性能效率

介绍

尽管单一语言模型可以通过 RLHF(基于人类反馈的强化学习)[1] 实现与群体平均偏好的对齐,但这样的语言模型无法满足多样化的个人偏好:每个人对于不同对齐维度(有用性,无害性,诚实性,等等)有着不同的偏重。
为了实现多目标对齐,一些同期工作依赖 MORLHF(多目标强化学习),通过对多个奖励函数的加权来表示不同人的偏好,但是 MORLHF 也继承了 RLHF 的所有缺点,例如训练不稳定以及流程的复杂性。 
▲ MODPO(多目标直接偏好优化)以最小的代价改进 DPO(直接偏好优化),以完成多目标对齐
在这次的工作中,我们提出 MODPO,致力于以最小的代价改进 DPO(直接偏好优化)[2] 以实现多目标对齐。这种方法将目标的加权组合以及语言模型的训练,折叠进奖励函数的训练过程中,用最简单的监督学习来实现语言模型的多目标对齐
在实现上,MODPO 仅仅只是在 DPO 的基础上修改了 ~2 行代码,即在 DPO 的损失函数的基础上额外增加一个 margin;在理论上,MODPO 可以被证明和 MORLHF 等价;在实验上,MODPO 在安全对齐和长篇回答中显示出远超 MORLHF 的性能和效率。

背景:从单目标对齐到多目标对齐

统的单目标对齐通过最大化偏好奖励函数 来得到一个符合大众价值观的语言模型 。具体而言,偏好奖励函数 通常蕴含在给定的偏好数据集中

其中 代表人类的提问, 代表被偏好的回答, 代表不被偏好的回答。在这个偏好奖励函数下的最优的语言模型通常满足以下目标函数:

其中 代表对齐前的模型,通常是个监督微调后的基础模型。

虽然这个最优的语言模型,完美符合大众价值观,但未必能符合多样的个人偏好;为了满足定制化需求,一个常见的做法是在训练的时候引入多个目标,例如在偏好奖励 之外,再额外引入一个奖励函数 去鼓励一些定制化的需求(例如惩罚回复中的冗余信息);在多个奖励函数的线性组合之下,语言模型的优化目标变成了如下的形式:

其中 代表一个偏好向量;不同的偏好向量会训练出不同的语言模型 ,从而实现对齐目标的定制化。

为了优化公式(3),最常见的做法使用多目标强化学习(MORLH)[3,4],但是它继承了强化学习的不稳定性以及流程的复杂性;与此同时 DPO 虽然解决了强化学习的缺点,但是 DPO 通常只能完成单目标的偏好奖励的最大化,如何将 DPO 拓展到多目标优化中并不显然;而 MODPO 的目的则是在 DPO 的基础上,做最小的改动来实现多目标的优化

MODPO(多目标直接偏好优化)

我们提出的 MODPO 的想法其实非常简单,根据 DPO 中语言模型和奖励函数的二象性,公式(3)下的最优语言模型 其实有个 closed-form 表达式:

经过一些基本的变换,我们可以把上述公式改写成:
只要我们将公式(5)代入公式(1)所代表的损失函数,并用参数化的形式来表示语言模型 ()和提前训练好的定制化奖励函数(),那么就可以得到一个针对语言模型的损失函数
与常见的 DPO 损失函数相比,MODPO 损失函数相当于在 DPO 的基础上增加了一个 margin;通过这个 margin,MODPO 将目标的加权组合和语言模型的训练同时折叠进偏好奖励函数的训练管线中,使得语言模型被人类偏好驱动的同时,也能被其他定制化目标所驱动

MODPO 管线总览:

  1. 提前训练得到定制化奖励函函数 ,其包括的范围很广,包括但不限于,
  • hugginface上已有的奖励函数模型;
  • 人类标的回答的得分(likert score);
  • 类似 DPO 中使用两个语言模型得到的奖励函数 
2. 遍历所需要的所有偏好向,对于每一个 ,优化此 下的损失函数(公式(6))来得到一系列满足不同偏好的语言模型。

MODPO 的更通用形式:

管我们在目前的叙述中,将多目标对齐问题简化成两个目标,但在多个(>2)个目标的情况下,MODPO的损失函数有个更通用的表达方式
其中 s.t. 。公式(7)将公式(6)拓展到更多目标的对齐场景中,具体细节欢迎查阅论文。

只需要改动两行代码便可以实现从DPO到MODPO拓展

从代码上来看 dpo 和 modpo 的区别可能更加清晰。
dpo loss:
https://github.com/ZHZisZZ/modpo/blob/main/src/trainer/dpo_trainer.py#L415
defdpo_loss
(

self
,

    policy_chosen_logps,

    policy_rejected_logps,

    reference_chosen_logps,

    reference_rejected_logps,

)
:

    chosen_rewards   = 
self
.beta * (policy_chosen_logps   - reference_chosen_logps)

    rejected_rewards = 
self
.beta * (policy_rejected_logps - reference_rejected_logps)


    logits = chosen_rewards - rejected_rewards

    losses = -F.logsigmoid(logits)

return
 losses, chosen_rewards.detach(), rejected_rewards.detach()

modpo loss:
https://github.com/ZHZisZZ/modpo/blob/main/src/trainer/modpo_trainer.py#L132
defmodpo_loss
(

self
,

    policy_chosen_logps,

    policy_rejected_logps,

    reference_chosen_logps,

    reference_rejected_logps,

    chosen_margin_reward,

    rejected_margin_reward,

)
:

    chosen_rewards   = (
1
/
self
.w[
0
])*(
self
.beta * (policy_chosen_logps   - reference_chosen_logps)   - chosen_margin_reward   @ 
self
.w[
1:
])

    rejected_rewards = (
1
/
self
.w[
0
])*(
self
.beta * (policy_rejected_logps - reference_rejected_logps) - rejected_margin_reward @ 
self
.w[
1:
])


    logits = chosen_rewards - rejected_rewards

    losses = -F.logsigmoid(logits)

return
 losses, chosen_rewards.detach(), rejected_rewards.detach()

相比 dpo,modpo 只引入了一个 margin_reward,所以如果你对 dpo 熟悉,那么 modpo 将很容易上手。
上面代码中变量解释如下:
policy_chosen_logps: Log probabilities 
of
 the policy model 
for
 the chosen responses. Shape: (batch_size,)

policy_rejected_logps: Log probabilities 
of
 the policy model 
for
 the rejected responses. Shape: (batch_size,)

reference_chosen_logps: Log probabilities 
of
 the reference model 
for
 the chosen responses. Shape: (batch_size,)

reference_rejected_logps: Log probabilities 
of
 the reference model 
for
 the rejected responses. Shape: (batch_size,)

beta: Temperature parameter 
for
 the DPO loss, typically something 
in
 the range 
of0.1to0.5
. We ignore the reference model 
as
 beta -> 
0
.

实验

我们采用了安全对齐和长篇回答任务来检验 MODPO 的有效性。在安全对齐任务中,模型的目标是在模型的有用性和无害性之间取得平衡;在长篇回答任务中,给定一篇长文章和针对该文章的问题,语言模型需要阅读文章后给出答案。在这个任务中,语言模型需要在尽可能符合特定要求的同时,给出更被人类偏好的回答。对于 3 个目标的对齐实验,欢迎查阅论文附录。
对于安全对齐任务,如图 1 所示,MODPO 和 MORLHF 性能相当(但 MODPO 更高效);对于长篇回答任务,如图 2 所示,MODPO 远好于MORLHF且更高效。如表 1 所示,相比 MORLHF, MODPO 节省了 ~3 倍的 GPU 时间。
▲ 图1:不同方法在安全对齐(左)和长篇回答(右)任务上的帕累托曲线
▲ 表1:MODPO 和 MORLHF 的 GPU hours 对比
参考文献
[1] Ouyang L, Wu J, Jiang X, et al. Training language models to follow instructions with human feedback[J]. Advances in neural information processing systems, 2022, 35: 27730-27744.
[2] Rafailov R, Sharma A, Mitchell E, et al. Direct preference optimization: Your language model is secretly a reward model[J]. Advances in Neural Information Processing Systems, 2024, 36.
[3] Wu Z, Hu Y, Shi W, et al. Fine-grained human feedback gives better rewards for language model training[J]. Advances in Neural Information Processing Systems, 2024, 36.
[4] Rame A, Couairon G, Dancette C, et al. Rewarded soups: towards pareto-optimal alignment by interpolating weights fine-tuned on diverse rewards[J]. Advances in Neural Information Processing Systems, 2024, 36.
更多阅读
#投 稿 通 道#
 让你的文字被更多人看到 
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱:[email protected] 
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
·
·
·
继续阅读
阅读原文