想象你是一家餐厅的主厨。传统做法是:第一步先在后厨练基本功(SFT阶段),把菜本身做得色香味俱全;第二步再琢磨摆盘和顾客反馈(偏好对齐阶段),确保端上桌的菜客人愿意点赞、愿意写好评。两件事分开做,耗时费力,而且第一阶段的火候很容易在第二阶段被改过头——本来口味不错,一调整卖相反而把味道弄差了。 ORPO(Odds Ratio Preference Optimization)是一位打通任督二脉的新派主厨:它让一道菜在出锅的瞬间,同时兼顾“本味扎实”和“卖相讨喜”。模型在模仿训练的同时,直接学会偏向更好的回答,把两步炼丹缩成一步。省时间、省算力,还避免了传统两阶段在交接过程中产生的偏好偏移。这种“一边练基本功、一边练招人喜欢”的思路,正在成为大模型对齐训练的新宠。

岗位关联

对齐训练是让大模型“既听话又有能力”的关键环节,掌握ORPO能帮你把昂贵的两阶段训练压缩成一步,省下真金白银的GPU时间和调度成本。

目录
  1. 可视化演示
  2. 传统对齐痛点
  3. Odds Ratio概念
  4. ORPO损失函数
  5. 与DPO对比
  6. 超参与稳定性
  7. 效果与评测
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示责任链设计模式中请求沿处理者链传递、动态分配处理职责与解耦发送者接收者的核心机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

责任链结构 多个处理者通过next指针串联成链,每个处理者决定处理请求或传递给下一个 发送者无需知道哪个处理者最终处理请求,实现发送者与接收者解耦 handler.handle(req) → process or next.handle(req)

传统对齐痛点

想象你开了一家餐厅,要对新来的厨师进行培训。传统方法是“两步走”:前三个月只练基本功——切菜、颠勺、掌握火候,这叫SFT阶段,相当于让大模型通过模仿海量文本学会“说人话”;后三个月才研究摆盘、研究顾客口味偏好,这叫偏好对齐阶段,相当于RLHF或DPO。听起来合理,但问题来了——第一个阶段的“好菜”标准,和第二个阶段的“顾客好评”标准,根本是两套体系。

这两套标准之间的切换,就像厨房换了主厨。SFT阶段模型学会了“流畅地模仿通用文本”,但模仿的对象并不分好坏;到了对齐阶段,又要让它学会“偏向人类偏好的回答”。问题是,模型在SFT阶段学到的一些“话痨式表达”或“模板腔”,在对齐阶段要花很大力气才能掰回来,甚至掰过头了,把SFT阶段学到的真实能力也给掰没了,这就是论文里说的“偏好偏移”。

再加上两个阶段要用不同的损失函数、不同的数据管道、不同的训练脚本,工程上要维护两套流程。GPU时间翻倍、调试工作量翻倍、出问题的环节也翻倍——就像雇了两个主厨,中间还要反复交接,谁都说不清菜的味道最后算谁的。

ORPO出场了。它的思路很朴素:为什么不能让厨师在练基本功的同时,顺手就把招牌菜的口味研究透了呢?如果训练信号同一套,模型在学习模仿的同时,也在学习“什么样的回答更好”,两者共用一套梯度,就不会出现前后标准打架的问题。

Odds Ratio概念

既然要让模型“一边练基本功一边学偏好”,总得有一个标准来判断“什么算好”。ORPO选了一个很聪明的尺子——Odds Ratio,中文叫“胜率比”或“优劣比”。你可以把它理解为“优等回答的胜算”:假设模型对同一个问题生成了两种回答,一种被人类标注为“好的”,一种被标注为“差的”,我们要衡量模型有多大把握把好的回答排在前面。

这就像餐厅试菜:同一道菜的两个版本摆在评委面前,我们要度量的是“评委选A版的概率 vs 评委不选A版的概率”。如果评委选A版的概率是0.75,不选的概率是0.25,那胜率就是3倍。这个3,就是Odds——好的回答相对差的回答的“胜率优势”。

形式化来说,给定一个问题的输入序列和模型的回答,模型生成该回答的概率可以算出来。对于“好回答”和“差回答”各有一个生成概率,Odds Ratio就是这两个生成概率的比值,再经过适当的归一化处理。关键是——这个比值完全由模型自身产生,不需要另外准备一个参考模型来对比。

这就像用同一把秤去称两份菜,而不是把菜寄到第三方检测机构去测。DPO这类方法需要冻结一个参考模型,随时跟正在训练的模型对比;ORPO连这个“裁判”都省了,完全靠模型自己“照镜子”来分辨好坏。

有了这把尺子,ORPO的损失函数就可以同时做两件事:拉高好回答的胜率、压低差回答的胜率。就像一道菜同时让评委更想选它、又让对手菜显得更不值得选——一个动作,双向用力。

odds(y∣x)=pθ(y∣x)1−pθ(y∣x)\displaystyle \text{odds}(y \mid x) = \frac{p_{\theta}(y \mid x)}{1 - p_{\theta}(y \mid x)}
odds是一个介于0到正无穷的数:回答越被模型“偏爱”,生成概率越高,odds越大;生成概率接近1时,odds趋向无穷大。
  1. 生成概率模型在读入输入x后,生成回答y的每个token的概率乘积,记作 pθ(y|x)。这个值越大,说明模型越倾向于输出这个回答。
    pθ(y∣x)p_{\theta}(y \mid x)
  2. 胜算变换把生成概率转化为“胜算”——赢得几率。概率0.8意味着odds为4,即“被选中”的几率是“不被选中”的4倍。
    pθ(y∣x)1−pθ(y∣x)\displaystyle \frac{p_{\theta}(y \mid x)}{1 - p_{\theta}(y \mid x)}
  3. 理想情况训练后我们希望好的回答odds远大于差的回答odds,两者的比值就是后面ORPO损失里要用的核心信号。
    odds(yw∣x)odds(yl∣x)\displaystyle \frac{\text{odds}(y_w \mid x)}{\text{odds}(y_l \mid x)}

ORPO损失函数

现在到了这道“融合菜”的配方环节。ORPO的损失函数由一个SFT项和一个Odds惩罚项组成,公式长这样:

其中SFT项负责“模仿能力”——让模型继续学会流畅地生成自然文本;OR项(Odds Ratio惩罚项)负责“偏好能力”——让好回答的胜率压过差回答。λ是两者的配比权重,就像做菜时“盐放多少”——太小没味道,太大齁嗓子。

Odds惩罚项的具体形式是:

这里的σ是sigmoid函数,它把“好回答与差回答的胜率比”压到0到1之间,变成一个概率。损失要做的事情很直白:让胜率比尽量大,这样括号里的值就大,经过sigmoid后接近1,再取负对数就接近0——损失减小,皆大欢喜。

你可以把它想象成一道“阴阳菜”:厨师同时做两份同样的菜,一份用心做、一份随便做,然后请评委打分。训练过程就是在不断调整火候和配料,让“用心版”的胜算越来越大,“随便版”的胜算越来越小,而做菜的基本功(SFT项)一点没落下。

整个ORPO损失的巧妙之处在于,它不需要任何参考模型。传统DPO要准备一个冻结的参考模型来约束训练偏差,ORPO用“模型自己的生成概率”就能算出胜率比——它把参考模型的那一半工作,内化成了“自己跟自己比”。就像学做菜时不需要旁边站一个“标准主厨”时刻盯着你纠正,你自己尝一口就知道哪个版本更好吃。

LORPO=E(x,yw,yl)[LSFT+λ⋅LOR]\displaystyle \mathcal{L}_{\text{ORPO}} = \mathbb{E}_{(x, y_w, y_l)}\left[ \mathcal{L}_{\text{SFT}} + \lambda \cdot \mathcal{L}_{\text{OR}} \right]
LOR=−log⁡σ(log⁡odds(yw∣x)odds(yl∣x))\displaystyle \mathcal{L}_{\text{OR}} = -\log \sigma\left( \log \frac{\text{odds}(y_w \mid x)}{\text{odds}(y_l \mid x)} \right)
  1. SFT项这是传统的负对数似然损失,让模型最大化生成“标准答案”的概率。在这里是让模型保持基本的语言能力。
    LSFT=−1∣yw∣∑t=1∣yw∣log⁡pθ(yw(t)∣x,yw<t)\displaystyle \mathcal{L}_{\text{SFT}} = -\frac{1}{|y_w|}\sum_{t=1}^{|y_w|} \log p_{\theta}(y_w^{(t)} \mid x, y_w^{<t})
  2. 胜率比的对数计算好回答与差回答胜率之比,再取对数。取对数的好处是把比值从0到无穷映射到负无穷到正无穷,方便后面的sigmoid处理。
    log⁡odds(yw∣x)odds(yl∣x)\displaystyle \log \frac{\text{odds}(y_w \mid x)}{\text{odds}(y_l \mid x)}
  3. sigmoid概率化把上述对数值压到0到1的区间,代表“好回答胜出”的概率。
    σ(log⁡odds(yw∣x)odds(yl∣x))\displaystyle \sigma\left( \log \frac{\text{odds}(y_w \mid x)}{\text{odds}(y_l \mid x)} \right)
  4. 负对数合并取负对数后,最大化胜率比就等价于最小化这个损失。当胜率比很大时,损失趋近于0。
    −log⁡σ(log⁡odds(yw∣x)odds(yl∣x))\displaystyle -\log \sigma\left( \log \frac{\text{odds}(y_w \mid x)}{\text{odds}(y_l \mid x)} \right)

与DPO对比

DPO(Direct Preference Optimization)是当前非常流行的偏好对齐方法,但它的做法和ORPO有本质差异:DPO仍然假设模型已经完成了SFT阶段,然后在这一基础上用偏好数据做二次训练。它需要一个冻结的参考模型,用来防止训练过程偏离原始模型太远——就像主厨练摆盘的时候,旁边总站着一个老主厨监工,随时提醒“你原来的手感别丢了”。

ORPO对此的回应是:我不需要监工。因为Odds Ratio本身就是拿模型自己的生成概率来算的,模型的“原始手感”已经被内化在损失函数里了。这意味着训练时少跑一个参考模型的前向和反向传播,显存占用更小、每一步的耗时更短,整个训练管线也简化了一大截。

从梯度信号的角度看,DPO的梯度包含着“当前模型与参考模型的KL散度约束”,而ORPO的梯度纯粹来自好回答胜率对差回答胜率的相对压力。这个梯度信号更直接、更锐利——就像教练直接指出“你这道菜的要点是把糖换成蜂蜜”,而不是说“你离标准做法偏离了3个标准差”。

不过有得必有失。因为没有参考模型的“安全带”,ORPO在训练时的稳定性更依赖超参选择——λ不能太大,学习率也要控制得更谨慎,否则容易像脱缰的野马一样跑偏。这也是文章下一节要聊的工程权衡。

超参与稳定性

ORPO里最关键的旋钮是λ——那个控制偏好惩罚强度的系数。λ调得好,模型既能保持语言流畅度又能明显偏向优质回答;λ调得太大,模型可能会牺牲通用能力,变得过度迎合某种偏好,甚至出现重复、空洞的套话——就像盐放多了,菜咸到没法入口。

论文给出的经验法则包括:训练早期用较小的学习率,让SFT项先稳定地“练好基本功”,偏好信号再逐步叠加进来;λ的选择需要结合偏好数据集的规模和差异度来定,偏好信号弱的场景加大λ,偏好信号已经很鲜明的场景适当减小λ。这就像调味:食材本身品质高,少放盐都好吃;食材寡淡,才需要重口味来撑场子。

另一个值得关注的稳定性指标是模型在验证集上的loss曲线。如果训练loss持续下降但验证loss开始回升,说明过拟合风险在积累——模型开始死记硬背偏好数据,而不是学到通用的“偏好规律”。这时候应该提前停止、减小λ或增补数据,就像厨师发现同一道菜连做十遍口味反而退步了,应该停下来重新审视配方而不是继续加料。

工程上还有一个实用技巧:混入一定比例的纯SFT数据。这样做的逻辑是给模型一个“锚点”,防止偏好优化把模型带得离人类通用语言太远,就像在重口味菜品里留一点清淡的配菜,让整桌菜不至于全都一个味儿。

效果与评测

论文在多个开源模型上验证了ORPO的效果,包括Llama-3-8B-Instruct和Mistral-8x7B等。实验结果表明,在相同的偏好数据集和训练预算下,ORPO训练出来的模型在AlpacaEval 2.0、MT-Bench等主流评测基准上的得分,能够比肩甚至超过"SFT + DPO"的两阶段方案,而训练成本大约只有后者的一半。

这个结果的意义在于:ORPO证明了一件事——“模仿好”和“知道什么是好”不一定要分成两个阶段。当训练信号同时施加这两个压力时,模型完全可以在单次梯度更新中同时消化它们,就像一个新厨师直接学习“照着招牌菜谱做菜”而不用先学三年的“通用切菜基本功”再研究菜谱。

评测中还有一个值得注意的细节:在偏好数据量较少或偏好差异不够明显的场景下,ORPO的优势会有所收窄——因为SFT项相对占主导,偏好信号被稀释了。这提醒我们,ORPO不是魔法,它是对“数据质量有信心的场景”的高效加速器。

从工程收益的角度看,一步训练大幅简化了训练管线:不需要维护两个训练脚本、不需要在SFT之后重新加载checkpoint并冻结参考模型、不需要额外的RLHF奖励模型推理开销。这在动辄上千卡时的模型训练任务里,节省的不是一点点,而是实打实的时间与成本。

AI 应用场景

大模型快速迭代训练

阶段:模型对齐与训练优化

解决的问题:传统对齐流程需要在SFT完成后另起炉灶做DPO或RLHF,不仅训练管道复杂,还需要额外加载参考模型和奖励模型,对于需要快速迭代的团队来说,每次实验周期太长。ORPO将两步合并为一步,可以在同一个训练脚本里同时完成模仿和偏好优化,显著缩短实验迭代周期。

具体案例:一家做客服问答模型的创业公司,原先训练一个可用版本需要“SFT两周 + DPO一周”共三周时间。引入ORPO后,只需两周即可达到相似的效果水平,且不再需要维护两套训练代码和两份checkpoint,团队可以把省下的时间用于收集更高质量的偏好数据。

小参数量模型的高效对齐

阶段:微调与轻量化模型适配

解决的问题:7B级别以下的小模型对训练资源的敏感度更高。两阶段的训练管线在资源受限环境下(如单机多卡)经常由于显存不足导致冻结参考模型的加载失败。ORPO省掉了参考模型的内存开销,让小团队也能在有限硬件上完成偏好对齐训练。

具体案例:某高校实验室使用单张A100训练一个3B参数的对话模型,原来用DPO方案时冻结参考模型后显存几近极限,不得不减小batch size、拖慢训练速度。改用ORPO后,省下的显存让batch size直接翻倍,训练在更短时间内收敛。

Python 演示

python59 行
import torchimport torch.nn.functional as F class SimpORPOLoss:    def __init__(self, lambd=0.1, label_smoothing=0.0):        self.lambd = lambd        self.ls = label_smoothing     def compute_log_odds(self, log_prob_chosen, log_prob_rejected):        p_chosen = torch.sigmoid(log_prob_chosen)        p_rejected = torch.sigmoid(log_prob_rejected)        odds_chosen = p_chosen / (1 - p_chosen + 1e-8)        odds_rejected = p_rejected / (1 - p_rejected + 1e-8)        log_odds_ratio = torch.log(odds_chosen / (odds_rejected + 1e-8))        return log_odds_ratio     def orpo_loss(self, sft_loss, log_prob_chosen, log_prob_rejected):        log_odds_ratio = self.compute_log_odds(log_prob_chosen, log_prob_rejected)        odds_penalty = -torch.log(torch.sigmoid(log_odds_ratio) + 1e-8)        total_loss = sft_loss + self.lambd * odds_penalty        return total_loss, odds_penalty     def sft_loss(self, logits, labels):        log_probs = F.log_softmax(logits[:, :-1, :], dim=-1)        target = labels[:, 1:]        ce_loss = F.nll_loss(            log_probs.reshape(-1, log_probs.size(-1)),            target.reshape(-1),            reduction="mean",            label_smoothing=self.ls,        )        return ce_loss  def main():    torch.manual_seed(42)    vocab_size, seq_len, batch_size = 32000, 48, 4    logits = torch.randn(batch_size, seq_len, vocab_size)    labels = torch.randint(0, vocab_size, (batch_size, seq_len))    log_prob_chosen = torch.tensor([0.25, 0.80, 0.60], requires_grad=True)    log_prob_rejected = torch.tensor([0.15, 0.20, 0.30], requires_grad=True)     criterion = SimpORPOLoss(lambd=0.1)    sft_loss_val = criterion.sft_loss(logits, labels)    total_loss, odds_penalty = criterion.orpo_loss(        sft_loss_val, log_prob_chosen, log_prob_rejected    )     print("SFT loss:", sft_loss_val.item())    print("Odds penalty:", odds_penalty.item())    print("ORPO total loss:", total_loss.item())     total_loss.backward()    print("log_prob_chosen grad:", log_prob_chosen.grad)    print("log_prob_rejected grad:", log_prob_rejected.grad)  if __name__ == "__main__":    main()
目的:用极简的PyTorch脚本模拟ORPO损失的计算流程,展示SFT损失与Odds惩罚如何组合、梯度如何传播。
  1. class SimpORPOLoss:定义一个简化版ORPO损失类,方便演示核心计算逻辑。
  2. p_chosen / (1 - p_chosen + 1e-8)把生成概率转为胜率odds,加微小常数防止除零。
  3. log_odds_ratio = torch.log(odds_chosen / odds_rejected)计算好坏回答胜率比的对数,这是ORPO的核心信号。
  4. odds_penalty = -torch.log(torch.sigmoid(log_odds_ratio))对胜率比施加负对数sigmoid惩罚,拉大好坏差距。
  5. total_loss = sft_loss + self.lambd * odds_penalty把模仿损失和偏好惩罚按λ配比加权合并。
  6. F.nll_loss(..., label_smoothing=...)用带标签平滑的负对数似然做SFT损失,让模型不过度自信。
  7. total_loss.backward()反向传播,观察好回答和差回答各自的梯度方向。

常见误区

误区ORPO既然把SFT和对齐合成一步,那是不是只用偏好数据训练就行了,纯SFT数据可以扔掉?

正解这是误解。ORPO的损失函数中有明确的SFT项——它仍然在最大化好回答的生成概率。SFT数据提供了基本的语言能力和任务格式,偏好数据则提供“什么样的回答更受青睐”的排序信号。两者缺一不可,就像一道菜既要有主食材(SFT数据)又要有调味料(偏好数据)。如果不给SFT数据,模型连“说人话”的能力都保不住。

为何常见:人们看到“统一为单阶段”就容易理解成“两个数据源合并成一个”,忽略SFT项在损失函数中的独立存在。

误区ORPO损失里λ是偏好惩罚的权重,那是不是λ调到很大,模型就能学到更强的偏好?

正解λ过大会让偏好信号淹没SFT信号,模型可能出现过拟合偏好数据、生成重复句式、语言流畅度下降等问题。论文实验表明,λ的合理范围约在0.05到0.2之间,具体数值需要结合偏好数据集的规模与信号强度来定。λ是调味料不是主菜,烹饪的关键是平衡。

为何常见:直觉上“权重越大效果越强”符合直觉,但训练稳定性和泛化能力往往是一个多目标平衡问题。

误区Odds Ratio就是好回答生成概率除以差回答生成概率,直接看概率值就行。

正解Odds本身也经过了一个非线性变换——概率除以1减概率(即sigmoid的反函数),然后再做比值。这意味着ORPO比较的不是线性概率差,而是“胜算的倍数”。概率从0.9提到0.99看似只涨了0.09,但odds从9涨到99,其实是10倍的胜率提升。这种放大效应让ORPO能更敏锐地捕捉模型在高置信区域的细微改进。

为何常见:概率是最直观的概念,而odds是统计学里的专业术语,初学者容易下意识忽略中间的非线性变换步骤。

误区ORPO是DPO的升级版,所以任何场景下都应该用ORPO替代DPO。

正解ORPO在训练效率上有明显优势,但没有免费午餐。它的表现依赖于偏好数据的质量和信号强度,在偏好差异较弱的数据上,优势会收窄;而DPO因为有参考模型的“安全带”,在超参调整不当或数据噪声较大时更稳定。工程上应当根据场景选择,而不是无脑替换。

为何常见:看到一篇论文效果更好就认为全面取代,忽略了不同方法对不同数据分布和训练条件的适应差异。

面试题

Q1. ORPO的核心创新是什么?

单选题 · easy

  • A.用更大的模型做偏好对齐
  • B.把SFT与偏好对齐合并为单阶段← 正确答案
  • C.用强化学习替代监督学习
  • D.用更多人类反馈数据

答案:B。ORPO的核心在于将SFT(模仿学习)和偏好对齐(让模型偏向好回答)合并为一个训练阶段,通过统一的损失函数同时优化两个目标。B正确。A是模型规模问题,C描述的是RLHF路线,D是数据工程问题,都不是ORPO的方法论创新。

Q2. Odds Ratio在ORPO中衡量的是什么?

单选题 · easy

  • A.模型生成好回答与差回答的胜率比← 正确答案
  • B.模型的训练收敛速度
  • C.人类标注的评分方差
  • D.数据的长度占比

答案:A。Odds即胜率,Odds Ratio是好回答胜率与差回答胜率之比。ORPO通过最大化这一比值,让模型学会在生成时更偏向优质回答。B、C、D都与偏好信号无关。

Q3. ORPO损失函数由哪两部分组成?

单选题 · mid

  • A.生成损失和奖励模型损失
  • B.SFT损失和Odds惩罚项← 正确答案
  • C.π损失和Q损失
  • D.对比损失和余弦损失

答案:B。ORPO损失为SFT项加λ倍的Odds惩罚项:前者维持模仿能力,后者压大好回答的胜率比。A是RLHF的奖励模型体系,C是强化学习的价值函数,D是自监督学习常用方法。

Q4. 相比DPO,ORPO的主要优势是什么?

单选题 · mid

  • A.不需要训练奖励模型
  • B.不需要参考模型,训练更省资源← 正确答案
  • C.不需要人类标注数据
  • D.不需要SFT数据

答案:B。DPO虽然不需要奖励模型,但需要冻结一个参考模型来约束训练;ORPO用模型自身的生成概率算Odds Ratio,连参考模型都省了,因此显存占用更低、训练管线更简单。A中DPO本身也不需要奖励模型,C和D都不成立。

Q5. 在ORPO中,λ参数的作用是什么?

单选题 · mid

  • A.控制SFT损失的权重
  • B.控制偏好惩罚的强度← 正确答案
  • C.调整学习率的大小
  • D.改变模型的层数

答案:B。λ是Odds惩罚项的权重系数。λ过小偏好信号弱,λ过大可能过拟合偏好数据、损失语言流畅度。学习率是单独的超参,SFT项权重固定为1,模型层数是结构参数。

Q6. 以下哪些说法关于ORPO的训练稳定性是正确的?

多选题 · mid

  • A.学习率通常需要调低← 正确答案
  • B.验证集loss回升时可能过拟合← 正确答案
  • C.可以混入纯SFT数据做锚点← 正确答案
  • D.训练过程中需要动态调整模型结构

答案:ABC。ORPO没有参考模型的约束,稳定性更依赖超参控制。学习率要控制得比标准SFT更谨慎(A);验证loss回升是过拟合信号(B);混入纯SFT数据可防止模型偏离语言能力(C)。模型结构在训练中固定,D错误。

Q7. ORPO在效果上与“两步法”相比有何特点?

多选题 · mid

  • A.训练成本大约省一半← 正确答案
  • B.效果能比肩甚至超过两步法← 正确答案
  • C.偏好数据质量差时优势收窄← 正确答案
  • D.完全无法用于小模型

答案:ABC。论文实验显示ORPO在AlpacaEval等基准上能达到甚至超过SFT+DPO的效果,同时省去参考模型的推理开销,训练成本显著降低。偏好数据信号弱时ORPO优势缩小(C)。D说法错误,ORPO对小模型同样适用。

Q8. ORPO的Odds惩罚项中,对胜率比对数做sigmoid变换的目的是什么?

单选题 · hard

  • A.让梯度大小保持恒定
  • B.把对数比值映射到0到1之间作为概率← 正确答案
  • C.增加训练的计算量
  • D.替代softmax做归一化

答案:B。sigmoid把任意实数压缩到(0,1)区间,使胜率比对变成“好回答胜出”的概率。然后取负对数,将最大化胜率比转化为最小化损失,形式上更利于梯度优化。A、C不是设计目的,D与softmax无关。

Q9. 关于ORPO的自我对比原理,正确的理解有哪些?

多选题 · hard

  • A.模型用自己的概率计算好差回答的胜率← 正确答案
  • B.不需要外部参考模型的约束← 正确答案
  • C.每一对好差回答构成一个对比样本← 正确答案
  • D.模型需要两个并行的参数副本

答案:ABC。ORPO的核心是“自己跟自己比”,用当前模型的生成概率计算Odds Ratio,因此不需要参考模型(A、B)。训练数据以“好差回答对”形式组织,每对提供偏好信号(C)。D需要双份模型参数,是某些对比学习方法的设计,非ORPO。

Q10. 当偏好数据集中好差回答的生成概率都非常接近1时,Odds Ratio会怎样变化?

单选题 · extreme

  • A.比值趋近于0
  • B.小的概率差异被放大为巨大的胜率差距← 正确答案
  • C.比值完全等于概率之差
  • D.比值不受影响仍为常数

答案:B。odds对接近1的概率极其敏感:0.90的odds是9,0.99的odds是99,表面上概率只差0.09,胜率却差了11倍。所以当概率都接近1时,微小的偏好差异会被Odds Ratio放大成明确的胜率信号。这正是ORPO在高置信区域仍能有效学习的数学基础。C和D显然错误,A方向反了。