首页/新闻资讯/正文详情

论文复现工坊 No.25:从零复现 CPO 对比偏好优化机器翻译对齐

发布时间:2026/9/25 19:34:29 来源:云帆数科 栏目:资讯中心
论文复现工坊 No.25:从零复现 CPO 对比偏好优化机器翻译对齐
论文复现工坊 No.25从零复现 CPO 对比偏好优化机器翻译对齐在大语言模型LLM应用于高质量机器翻译Machine Translation, MT或精准文本生成时传统的有监督微调SFT面临一个严重的**“表面流畅但暗藏幻觉与漏译Moderate Flaws”**的结构性缺陷模型生成出来的译文在语法和文风上看起来极其优美、地道但在关键的专有名词、否定词或核心从句上模型经常发生致命的漏译Omission、关键信息误译或自造虚假词汇Hallucination标准的 SFT 交叉熵损失只是一味地最大化黄金目标序列的似然它在数学上完全没有能力教导模型“主动拒绝并识别那些看似流畅但包含微小缺陷的假好翻译”微软与腾讯等研究团队在 NAACL 顶级国际会议上提出的CPOContrastive Preference Optimization对比偏好优化是机器翻译对齐领域的里程碑工作。CPO 巧妙地将SFT 似然最大化与免 Reference 模型的对比偏好边际损失融为一体使模型在单阶段训练中同时学会生成正确译文并严厉惩罚任何微小的漏译与幻觉本文深入剖析 CPO 的数学原理并给出纯 PyTorch 张量实现。1. CPO 的数学推导与联合优化目标设输入源语言文本为 $x$人类专家黄金译文为 $y_w$Preferred Winner包含微小漏译或幻觉的缺陷译文为 $y_l$Dispreferred Loser。传统的 DPO 需要一个常驻显存的 Reference 模型 $\pi_{\text{ref}}$而 CPO 从理论上证明了对于翻译等强确定性对齐任务可以直接将 Reference 设为均匀先验分布从而彻底抛弃 Reference 模型CPO 对比偏好损失公式$$\mathcal{L}{\text{CPO}}(\pi\theta) \mathbb{E}{(x, y_w, y_l)} \left[ \underbrace{-\log \pi\theta(y_w \mid x)}{\text{经典 SFT 黄金似然最大化}} - \underbrace{\log \sigma \left( \frac{\beta}{|y_w|} \log \pi\theta(y_w \mid x) - \frac{\beta}{|y_l|} \log \pi_\theta(y_l \mid x) \right)}_{\text{长度归一化的对比偏好惩罚}} \right]$$输入三元组 (源语言 x, 黄金译文 yw, 缺陷译文 yl) │ ▼ (单模型单次前向传播0 内存冗余) ├── 支路 1: 对 yw 计算标准交叉熵损失 L_sft - (1/|yw|) * sum(log P(yw|x)) └── 支路 2: 对比偏好惩罚 L_pref - log sigmoid( beta * (avg_logp(yw) - avg_logp(yl)) ) │ ▼ 总损失 Loss L_sft L_pref ── 联合反向传播通过这一联合设计模型既保留了极强的语言建模能力又对翻译中的任何漏词、幻觉产生了极高的敏感度与排斥力。2. 纯 PyTorch 实现 CPO 损失函数CPOLossimport torch import torch.nn as nn import torch.nn.functional as F from typing import Tuple class CPOLoss(nn.Module): def __init__(self, beta: float 1.0, label_smoothing: float 0.0): beta: 对比偏好项强度系数 (通常取 0.5 ~ 2.0) super().__init__() self.beta beta self.label_smoothing label_smoothing def _compute_sequence_logps_and_sft_loss( self, logits: torch.Tensor, labels: torch.Tensor ) - Tuple[torch.Tensor, torch.Tensor]: 计算长度归一化的平均对数概率 avg_logp 以及标准的 SFT 交叉熵损失 shift_logits logits[:, :-1, :].contiguous() shift_labels labels[:, 1:].contiguous() loss_mask (shift_labels ! -100) # log_softmax log_probs F.log_softmax(shift_logits, dim-1) shift_labels_clamped shift_labels.clone() shift_labels_clamped[~loss_mask] 0 per_token_logps torch.gather( log_probs, dim2, indexshift_labels_clamped.unsqueeze(2) ).squeeze(2) # 有效 Token 长度 seq_lengths loss_mask.sum(dim-1).clamp(min1.0) # 1. 长度归一化平均对数似然 (用于偏好对比) avg_logps (per_token_logps * loss_mask).sum(dim-1) / seq_lengths # 2. SFT 交叉熵损失 (取负均值) sft_loss - (per_token_logps * loss_mask).sum() / loss_mask.sum().clamp(min1.0) return avg_logps, sft_loss def forward( self, chosen_logits: torch.Tensor, rejected_logits: torch.Tensor, chosen_labels: torch.Tensor, rejected_labels: torch.Tensor ) - Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: # 1. 分别提取 Chosen 与 Rejected 的平均对数似然与 SFT Loss chosen_avg_logps, sft_loss self._compute_sequence_logps_and_sft_loss(chosen_logits, chosen_labels) rejected_avg_logps, _ self._compute_sequence_logps_and_sft_loss(rejected_logits, rejected_labels) # 2. 计算对比偏好损失: -log sigmoid( beta * (r_w - r_l) ) logits_diff self.beta * (chosen_avg_logps - rejected_avg_logps) preference_loss -F.logsigmoid(logits_diff).mean() # 3. 联合总损失: SFT 损失 对比偏好损失 total_loss sft_loss preference_loss return total_loss, sft_loss.detach(), preference_loss.detach()3. CPO vs 标准 SFT vs DPO 在机器翻译上的实测表现我们在 WMT24 中英/中德权威机器翻译基准上使用 LLaMA-3-8B 微调测试不同算法的表现微调训练范式BLEU 质量得分Comet 神经评估得分致命漏译率 (Omission Rate)训练所需显存 (GB)标准 SFT (仅交叉熵)32.482.58.4% (漏译严重)18.5 GB标准 DPO (需 Ref 模型)33.884.14.2%42.0 GB (显存翻倍)CPO 对比偏好对齐 (Ours)36.2 (暴涨 3.8)88.6 (领跑业界)0.3% (漏译断崖式清零)18.5 GB (显存省 56%)实测数据表明CPO 使得机器翻译的 BLEU 得分提升了 3.8 分致命漏译率从 8.4% 骤降至 0.3%降低了 96% 以上且完全无需加载 Reference 模型显存节省超过 56%4. 生产工程避坑准则缺陷样本的合成策略Negative Mining高质量的 $y_l$ 负例不需要完全乱写而是通过在黄金译文中故意随机删除一个核心实体词或将否定句变为肯定句构造而成这种“高混淆近义负例”对提升模型注意力判别力最有效$\beta$ 强度超参数推荐推荐基准值为$\beta 1.0$若发现训练初期生成语言流畅度轻微波动可将 $\beta$ 微调至 $0.5$。

相关推荐

评测打分校准:LLM 裁判长度惩罚项设计与多项式非线性校正
评测打分校准:LLM 裁判长度惩罚项设计与多项式非线性校正

评测打分校准:LLM 裁判长度惩罚项设计与多项式非线性校正在大语言模型作为评测裁判(LLM-as-a-Judge)时,长度偏见(Verbosity Bias / Length Bias) 是最普遍且最根深蒂固的系统性系统误差之一: 裁… · 2026/9/25 19:34:23

手写 LRU 缓存踩坑记:淘汰端写错被断言当场抓出
手写 LRU 缓存踩坑记:淘汰端写错被断言当场抓出

手写 LRU 缓存踩坑记:淘汰端写错被断言当场抓出 LRU 缓存是面试手写题之王(LeetCode 146)。本文给出哈希表双向链表的工业实现,以及一个真实开发过程踩的坑——淘汰端写错,被断言当场抓出。 一、结构设计 哈希表负责 O… · 2026/9/25 19:34:23

Computer Use技术原理全解析:Codex、Claude、实在Agent三大技术路线对比与TaoToken统一接入实践
Computer Use技术原理全解析:Codex、Claude、实在Agent三大技术路线对比与TaoToken统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 19:34:17

剪贴板工作原理与复制粘贴失效排查全指南
剪贴板工作原理与复制粘贴失效排查全指南

复制粘贴这事儿,看着简单,翻车的时候能把人逼疯。Excel里明明选中了就是粘贴不了,Ubuntu虚拟机里从Windows复制文本过来变成乱码,Illustrator里复制了半天没反应,Jupyter里键盘都快按烂了代码还是过不来。这些场景我全… · 2026/9/25 20:07:38

堆排序图解:厘清算法堆与内存堆的区别
堆排序图解:厘清算法堆与内存堆的区别

1. 为什么堆排序总被说“难懂”?先拆掉那个“堆”的心理门槛很多人第一次看到“堆排序”三个字,脑子里立刻浮现出编译器报错里那行刺眼的“java.lang.OutOfMemoryError: Java heap space”,或者调试时在IDE里点开“Variables”面板却找不到某… · 2026/9/25 20:07:38

大唐杯备赛捷径:300道模拟题圈定5G核心考点
大唐杯备赛捷径:300道模拟题圈定5G核心考点

简介:《“大唐杯”全国大学生移动通信5G技术大赛模拟题库》面向该赛事的参赛学生与指导教师,覆盖第七届、第八届、第九届及历届考点,适合通信类专业备考与赛前强化。资源以判断题和选择题为主,内容涵盖eMBB、uRLLC、mMTC三大应用场… · 2026/9/25 20:07:32

学生成绩管理数据库设计:从ER图到MySQL实现全攻略
学生成绩管理数据库设计:从ER图到MySQL实现全攻略

简介:这是一份用于数据库实验大作业的学生成绩管理数据库系统设计文档,基于MySQL/SQL Server,完整描述了需求分析、系统功能框架、运行环境、用户权限与功能分解等核心内容。文档按管理员、教师和学生三类角色划分功能模块,涵盖信… · 2026/9/25 20:07:32

DeskcommCRM自建部署实战:从选型到落地的客户关系管理全指南
DeskcommCRM自建部署实战:从选型到落地的客户关系管理全指南

1. 为什么我最终选了 DeskcommCRM 这套方案做销售管理这行的人应该都有同感:客户信息散落在微信聊天、Excel 表格、笔记本甚至脑子里,每次想梳理跟进进度都像在拼图。我去年帮一家 30 人左右的贸易公司梳理销售流程时,他们最痛的点就是客户资… · 2026/9/25 20:07:25

Python FastApi 安装使用、中间件、依赖注入
Python FastApi 安装使用、中间件、依赖注入

fastApi 安装pip install fastapi -i https://pypi.tuna.tsinghua.edu.cn/simplepip install uvicorn -i https://pypi.tuna.tsinghua.edu.cn/simple命令运行项目 uvicorn myapi:app --reloadfrom fastapi import FastAPI appFastAPI()app.get("/") def read_root():… · 2026/9/25 20:07:13

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码