SimPO: Simple Preference Optimization with a Reference-Free Reward
https://github.com/princeton-nlp/SimPO
简单代码
class simpo(paddle.nn.Layer):
def __init__(self):
super(OrPoLoss, self).__init__()
self.loss = paddle.nn.CrossEntropyLoss()
def forward(self,neg_logit, neg_lab, pos_logit, pos_lab,beta,gamma):
neg_logit = paddle.nn.functional.log_softmax(neg_logit, -1)
pos_logit = paddle.nn.functional.log_softmax(pos_logit, -1)
batch_indices = paddle.arange(neg_lab.shape[0]).unsqueeze(1).tile([1, neg_lab.shape[1]])
seq_indices = paddle.arange(neg_lab.shape[1]).unsqueeze(0).tile([neg_lab.shape[0], 1])
indices = paddle.stack([batch_indices, seq_indices, neg_lab], axis=-1)
# 使用 gather_nd 来提取对应的 logit
neg_logit_selected = paddle.mean(paddle.gather_nd(neg_logit, indices),-1)
# 选择标签样本
batch_indices = paddle.arange(pos_lab.shape[0]).unsqueeze(1).tile([1, pos_lab.shape[1]])
seq_indices = paddle.arange(pos_lab.shape[1]).unsqueeze(0).tile([pos_lab.shape[0], 1])
indices = paddle.stack([batch_indices, seq_indices, pos_lab], axis=-1)
# 使用 gather_nd 来提取对应的 logit
pos_logit_selected = paddle.mean(paddle.gather_nd(pos_logit, indices),-1)
pi_logratios = pos_logit_selected - neg_logit_selected
gamma_logratios = gamma / beta
logits = pi_logratios - gamma_logratios
losses = (-paddle.nn.functional.log_sigmoid(beta * logits) * (1 - 0.3)
-paddle.nn.functional.log_sigmoid(-beta * logits) * 0.3)
# chosen_rewards = beta * pos_logit_selected
# rejected_rewards = beta *neg_logit_selected
return losses.mean()
这段代码创建了一个名为simpo的类,并使其继承自paddle.nn.Layer。在该类的构造函数中,初始化了一个交叉熵损失函数loss。
该函数负责执行前向传播过程。具体而言,在调用该函数时会传递六个参数:首先包括用于计算负样本与正样本之间差异程度的相关变量\texttt{neg\_logit}和\texttt{pos\_logit};接着则有用于表示这些实例真实归属变量\texttt{neg\_lab}和\texttt{pos\_lab};最后还包括两个调节网络间关系的关键参数\beta与\gamma。值得注意的是,在计算过程中\texttt{neg\_logit}与\texttt{pos\_logit}分别代表了模型对输入实例作为负类与正类时所给出的概率估计值(即置信度),而\texttt{neg\_lab}与\texttt{pos\_lab}则分别标记这些实例的真实类别标签信息。
在函数体内,在第一步中运用log_softmax函数处理neg_logit和pos_logit,并将预测分数转换为对应类别的概率值;接着生成相应的索引位置并利用gather_nd提取出标签样本对应的预测概率值;在此过程中求取平均值以获得负样本和正样本的选中概率
随后进行如下步骤:首先, 计算\pi_{\text{logratios}} , 即为正样本被选中的几率与负样本被选中的几率之差;接着, 计算\gamma_{\text{logratios}} , 即等于\gamma 与\beta 的商;最后用\pi_{\text{logratios}} 和\gamma_{\text{logratios}} 的差值来确定\text{logits}
通过计算logits值来确定损失。采用公式(-\log_{\text{sigmoid}}(\beta \cdot \text{logits}) \cdot (1 - 0.3) - \log_{\text{sigmoid}}(-\beta \cdot \text{logits}) \cdot 0.3)来具体执行这一过程,在其中\log_{\text{sigmoid}}(x)表示对x进行\text{log sigmoid}运算的基础上完成这一操作。最后利用\text{mean}()函数计算平均损失值并返回结果。
根据文档内容,我梳理了以下大纲:
一、引言
背景介绍:人类反馈的学习机制是核心问题之一,在强化学习领域中(Reinforcement Learning),人类反馈的方法(Human Feedback)逐渐被广泛采用;而离线优化算法(Offline Optimization)作为一种基础方法得到了快速发展;DPO作为一种简单的离线优化算法,在实际应用中表现出色。
问题提出:在现有算法中(existing approaches),训练阶段与推理阶段(Inference Stage)之间的性能差异(performance discrepancy)普遍存在;这种差异往往会导致模型(Model)在实际应用中的性能表现不佳。
本文贡献:本研究提出了一个新的偏好优化算法(Preference-based Optimization Algorithm)——SimPO;该算法通过一种创新的方式( innovative manner)将奖励机制与生成目标(target generation)直接关联,并且无需依赖参考模型(reference model),从而显著提升了优化效果。
SimPO: 简单偏好优化
该方法不仅具有良好的收敛性和稳定性(convergence and stability properties),而且能够有效平衡训练与推理阶段的目标一致性;
4. 介绍DPO算法的背景内容。\n
5. 采用平均对数似然作为奖励函数, 并与生成指标相一致, 不依赖于参考模型。\n
6. 针对SimPO方法, 进行理论推导, 并引入目标奖励间隔。\n
三\、实验设置
-
模型与训练设置方面,则采用Llama3与Mistral作为训练基底,并分别实施Base模式及Instruct模式。
-
在评估基准设定上,则采用了AlpacaEval 2版本、Arena-Hard级别以及MT-Bench作为评测标准。
-
用于比较的基准模型包括DPO、IPO、KTO、ORPO以及R-DPO等五种类型。
四、“四”、“五”、“六”、“七”、“八”、“九”、“十”、“十一”、“十二”、“十三”。 -
SimPO在其各项基准测试中持续地在各个基准测试中显著超越了其他方法。
-
Instruct设置带来了明显的性能增益。
-
SimPO的两个核心设计均具有重要意义。
-
长度标准化能够有效避免因长度差异导致的技术性问题。
-
目标奖励间距对模型性能的影响程度值得深入探究。
-
对比实验表明SimPO的优势源于其独特的设计理念。
五、相关研究 -
RLHF相关研究。
-
偏好优化相关研究。
六、讨论 -
结论。
-
限制与未来工作。
