Advertisement

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
三\、实验设置

  1. 模型与训练设置方面,则采用Llama3与Mistral作为训练基底,并分别实施Base模式及Instruct模式。

  2. 在评估基准设定上,则采用了AlpacaEval 2版本、Arena-Hard级别以及MT-Bench作为评测标准。

  3. 用于比较的基准模型包括DPO、IPO、KTO、ORPO以及R-DPO等五种类型。
    四、“四”、“五”、“六”、“七”、“八”、“九”、“十”、“十一”、“十二”、“十三”。

  4. SimPO在其各项基准测试中持续地在各个基准测试中显著超越了其他方法。

  5. Instruct设置带来了明显的性能增益。

  6. SimPO的两个核心设计均具有重要意义。

  7. 长度标准化能够有效避免因长度差异导致的技术性问题。

  8. 目标奖励间距对模型性能的影响程度值得深入探究。

  9. 对比实验表明SimPO的优势源于其独特的设计理念。
    五、相关研究

  10. RLHF相关研究。

  11. 偏好优化相关研究。
    六、讨论

  12. 结论。

  13. 限制与未来工作。

全部评论 (0)

还没有任何评论哟~