欢迎光临
我们一直在努力

第11篇-对齐训练-从RLHF到DPO的范式演进

【AIaaS 全栈架构师】第 11 篇:对齐训练——从 RLHF 到 DPO 的范式演进

本系列定位:本系列是一套面向全栈架构师的 AIaaS(AI as a Service)系统化教程,覆盖从概念全景、模型训练/微调底层原理、推理部署优化、Go 平台工程、GPU 集群编排到平台核心服务与运维前沿的完整知识体系。技术栈以 Go 为主,Python/C++ 为辅。


本篇你将学到

  • 理解为什么大模型需要"对齐"训练:预训练只是学会语言,对齐才让它学会"什么是好回答"
  • 掌握 RLHF 三阶段流程:SFT → 奖励模型(RM)→ PPO 强化学习
  • 理解 PPO 的工程复杂度:4 个模型同时驻留显存、在线采样、训练不稳定
  • 掌握 DPO 直接偏好优化的数学原理:Bradley-Terry 模型 + sigmoid 损失,跳过 RM 和 RL
  • 了解 ORPO、KTO、IPO 等 DPO 变体及对齐方法的工程选型

学完本篇,你将理解从 RLHF 到 DPO 的范式演进逻辑,掌握各类对齐方法的原理、成本与适用场景,为 AIaaS 平台的对齐训练服务设计打下基础。


一、为什么需要对齐训练

1.1 预训练的局限

在前面几篇中,我们学习了如何训练和微调大模型。但仅靠预训练得到的只是一个"文字接龙"模型——它学会了语言的统计规律,能生成流畅的文本,却不知道什么样的回答是人类期望的。

预训练模型的问题:

问题表现例子
不遵循指令 不理解"请帮我翻译"这类指令的含义 你说"翻译成英文",它继续接龙生成中文
风格不友好 输出像维基百科,不像对话助手 续写一段,而不是"回答你的问题"
可能有害 会生成不当内容 “如何制造危险物品”——它照样接龙
不拒绝 不该回答的问题也会硬答 被误导时会胡编乱造

1.2 对齐训练的目标

对齐训练(Alignment Training) 的目标是让模型的行为与人类意图、价值观和偏好对齐(Alignment)。用一句话概括:

让模型从"能生成文本"进化为"能生成人类偏好的回答"。

对齐训练通常在预训练(和可选的 SFT)之后进行,是大语言模型从"基座模型"变成"对话助手"的关键一步。

#mermaid-svg-DjR4aLTAYsY9UAPA{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DjR4aLTAYsY9UAPA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DjR4aLTAYsY9UAPA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DjR4aLTAYsY9UAPA .error-icon{fill:#552222;}#mermaid-svg-DjR4aLTAYsY9UAPA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DjR4aLTAYsY9UAPA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DjR4aLTAYsY9UAPA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DjR4aLTAYsY9UAPA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DjR4aLTAYsY9UAPA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DjR4aLTAYsY9UAPA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DjR4aLTAYsY9UAPA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DjR4aLTAYsY9UAPA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DjR4aLTAYsY9UAPA .marker.cross{stroke:#333333;}#mermaid-svg-DjR4aLTAYsY9UAPA svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DjR4aLTAYsY9UAPA p{margin:0;}#mermaid-svg-DjR4aLTAYsY9UAPA .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-DjR4aLTAYsY9UAPA .cluster-label text{fill:#333;}#mermaid-svg-DjR4aLTAYsY9UAPA .cluster-label span{color:#333;}#mermaid-svg-DjR4aLTAYsY9UAPA .cluster-label span p{background-color:transparent;}#mermaid-svg-DjR4aLTAYsY9UAPA .label text,#mermaid-svg-DjR4aLTAYsY9UAPA span{fill:#333;color:#333;}#mermaid-svg-DjR4aLTAYsY9UAPA .node rect,#mermaid-svg-DjR4aLTAYsY9UAPA .node circle,#mermaid-svg-DjR4aLTAYsY9UAPA .node ellipse,#mermaid-svg-DjR4aLTAYsY9UAPA .node polygon,#mermaid-svg-DjR4aLTAYsY9UAPA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DjR4aLTAYsY9UAPA .rough-node .label text,#mermaid-svg-DjR4aLTAYsY9UAPA .node .label text,#mermaid-svg-DjR4aLTAYsY9UAPA .image-shape .label,#mermaid-svg-DjR4aLTAYsY9UAPA .icon-shape .label{text-anchor:middle;}#mermaid-svg-DjR4aLTAYsY9UAPA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DjR4aLTAYsY9UAPA .rough-node .label,#mermaid-svg-DjR4aLTAYsY9UAPA .node .label,#mermaid-svg-DjR4aLTAYsY9UAPA .image-shape .label,#mermaid-svg-DjR4aLTAYsY9UAPA .icon-shape .label{text-align:center;}#mermaid-svg-DjR4aLTAYsY9UAPA .node.clickable{cursor:pointer;}#mermaid-svg-DjR4aLTAYsY9UAPA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DjR4aLTAYsY9UAPA .arrowheadPath{fill:#333333;}#mermaid-svg-DjR4aLTAYsY9UAPA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DjR4aLTAYsY9UAPA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DjR4aLTAYsY9UAPA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DjR4aLTAYsY9UAPA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DjR4aLTAYsY9UAPA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DjR4aLTAYsY9UAPA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DjR4aLTAYsY9UAPA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DjR4aLTAYsY9UAPA .cluster text{fill:#333;}#mermaid-svg-DjR4aLTAYsY9UAPA .cluster span{color:#333;}#mermaid-svg-DjR4aLTAYsY9UAPA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DjR4aLTAYsY9UAPA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DjR4aLTAYsY9UAPA rect.text{fill:none;stroke-width:0;}#mermaid-svg-DjR4aLTAYsY9UAPA .icon-shape,#mermaid-svg-DjR4aLTAYsY9UAPA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DjR4aLTAYsY9UAPA .icon-shape p,#mermaid-svg-DjR4aLTAYsY9UAPA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DjR4aLTAYsY9UAPA .icon-shape .label rect,#mermaid-svg-DjR4aLTAYsY9UAPA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DjR4aLTAYsY9UAPA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DjR4aLTAYsY9UAPA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DjR4aLTAYsY9UAPA :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

预训练海量无标注文本学会语言

监督微调 SFT指令-回答对学会格式

对齐训练偏好数据学会好与坏

部署为对话助手

1.3 偏好数据的形式

对齐训练的数据不同于 SFT——它不是"正确答案",而是偏好对。标注员对同一个问题的多个回答进行排序,标记哪个更好:

问题(prompt): "什么是量子纠缠?"

回答 A (chosen): 量子纠缠是指两个粒子之间存在的一种特殊关联…
回答 B (rejected): 我不知道,你去问物理老师吧。

标注员标记 A 优于 B。模型通过学习这种"偏好"来改进自己的生成质量。


二、RLHF:强化学习人类反馈

2.1 RLHF 的三阶段流程

RLHF(Reinforcement Learning from Human Feedback,强化学习人类反馈) 是 ChatGPT 的核心技术之一,也是对齐训练的经典方法。它分三个阶段:

#mermaid-svg-G7VFi6moV20wLnGg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-G7VFi6moV20wLnGg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-G7VFi6moV20wLnGg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-G7VFi6moV20wLnGg .error-icon{fill:#552222;}#mermaid-svg-G7VFi6moV20wLnGg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-G7VFi6moV20wLnGg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-G7VFi6moV20wLnGg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-G7VFi6moV20wLnGg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-G7VFi6moV20wLnGg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-G7VFi6moV20wLnGg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-G7VFi6moV20wLnGg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-G7VFi6moV20wLnGg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-G7VFi6moV20wLnGg .marker.cross{stroke:#333333;}#mermaid-svg-G7VFi6moV20wLnGg svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-G7VFi6moV20wLnGg p{margin:0;}#mermaid-svg-G7VFi6moV20wLnGg .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-G7VFi6moV20wLnGg .cluster-label text{fill:#333;}#mermaid-svg-G7VFi6moV20wLnGg .cluster-label span{color:#333;}#mermaid-svg-G7VFi6moV20wLnGg .cluster-label span p{background-color:transparent;}#mermaid-svg-G7VFi6moV20wLnGg .label text,#mermaid-svg-G7VFi6moV20wLnGg span{fill:#333;color:#333;}#mermaid-svg-G7VFi6moV20wLnGg .node rect,#mermaid-svg-G7VFi6moV20wLnGg .node circle,#mermaid-svg-G7VFi6moV20wLnGg .node ellipse,#mermaid-svg-G7VFi6moV20wLnGg .node polygon,#mermaid-svg-G7VFi6moV20wLnGg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-G7VFi6moV20wLnGg .rough-node .label text,#mermaid-svg-G7VFi6moV20wLnGg .node .label text,#mermaid-svg-G7VFi6moV20wLnGg .image-shape .label,#mermaid-svg-G7VFi6moV20wLnGg .icon-shape .label{text-anchor:middle;}#mermaid-svg-G7VFi6moV20wLnGg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-G7VFi6moV20wLnGg .rough-node .label,#mermaid-svg-G7VFi6moV20wLnGg .node .label,#mermaid-svg-G7VFi6moV20wLnGg .image-shape .label,#mermaid-svg-G7VFi6moV20wLnGg .icon-shape .label{text-align:center;}#mermaid-svg-G7VFi6moV20wLnGg .node.clickable{cursor:pointer;}#mermaid-svg-G7VFi6moV20wLnGg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-G7VFi6moV20wLnGg .arrowheadPath{fill:#333333;}#mermaid-svg-G7VFi6moV20wLnGg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-G7VFi6moV20wLnGg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-G7VFi6moV20wLnGg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-G7VFi6moV20wLnGg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-G7VFi6moV20wLnGg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-G7VFi6moV20wLnGg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-G7VFi6moV20wLnGg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-G7VFi6moV20wLnGg .cluster text{fill:#333;}#mermaid-svg-G7VFi6moV20wLnGg .cluster span{color:#333;}#mermaid-svg-G7VFi6moV20wLnGg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-G7VFi6moV20wLnGg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-G7VFi6moV20wLnGg rect.text{fill:none;stroke-width:0;}#mermaid-svg-G7VFi6moV20wLnGg .icon-shape,#mermaid-svg-G7VFi6moV20wLnGg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-G7VFi6moV20wLnGg .icon-shape p,#mermaid-svg-G7VFi6moV20wLnGg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-G7VFi6moV20wLnGg .icon-shape .label rect,#mermaid-svg-G7VFi6moV20wLnGg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-G7VFi6moV20wLnGg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-G7VFi6moV20wLnGg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-G7VFi6moV20wLnGg :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

阶段三:PPO 强化学习

阶段二:奖励模型训练 RM

阶段一:SFT 监督微调

指令数据问题-答案对

微调基座模型得到 SFT 模型 π_SFT

偏好数据问题 + 回答A优于回答B

训练奖励模型R(x, y) → 标量分数

SFT 模型 π_SFT

策略模型 π_θ(被训练)

奖励模型 R

计算奖励

参考模型 π_ref(冻结)

KL 散度惩罚

在线采样回答

更新策略模型 π_θ

下面逐阶段展开。

2.2 阶段一:SFT(监督微调)

SFT 是 RLHF 的起点。用一个"指令-回答"数据集对基座模型做监督微调,让模型学会按照"问题→回答"的格式输出。

这一步数据量通常不大(数万到数十万条),目标是教会模型"对话格式"和"基本的指令遵循能力"。

SFT 之后的模型记为 π_SFT,它既是下一阶段的起点,也是最终 RL 阶段的"参考模型"(防止策略漂移太远)。

2.3 阶段二:奖励模型(Reward Model)

奖励模型是一个打分模型,输入一个问题和一个回答,输出一个标量分数(分数越高代表回答越好)。

数据采集:让 π_SFT 对同一问题生成多个不同的回答(比如 K 个),人工标注员对这些回答排序。

训练目标:将偏好排序转化为奖励函数。对于一对回答 (y_chosen, y_rejected):

最大化: R(x, y_chosen) – R(x, y_rejected)

通常用 Bradley-Terry 模型将其转化为交叉熵损失:

L_RM = -log( sigmoid( R(x, y_chosen) – R(x, y_rejected) ) )

模型架构:奖励模型通常就是 π_SFT 本身(Transformer 结构),只是把最后一层的语言建模头换成"标量输出头"(一个线性层映射到维度 1)。

阶段输入输出损失函数
RM 训练 (prompt, response_A, response_B) 标量分数 R_A, R_B -log σ(R_A – R_B)

2.4 阶段三:PPO(强化学习优化)

这是 RLHF 中最复杂、最消耗资源的阶段。核心目标是优化策略模型 π_θ,使其生成的回答获得更高的奖励,同时不偏离原始 SFT 模型太远。

优化目标:

maximize: E[ R(x, y) – β · KL( π_θ(·|x) || π_ref(·|x) ) ]
↑奖励 ↑KL散度惩罚(防止偏离太远)

其中:

  • R(x, y) 是奖励模型对生成回答 y 的评分
  • KL 散度项惩罚策略模型 π_θ 偏离参考模型 π_ref(即 SFT 模型)
  • β 是控制偏移程度的超参数(通常 0.01-0.5)

PPO 算法步骤(每次迭代):

  • 采样:用当前策略 π_θ 对每个 prompt 生成回答 y
  • 评分:用奖励模型 R(x, y) 对回答打分
  • 计算优势:用价值模型估计每个 token 的优势函数
  • 更新:用 PPO 的 clipped objective 更新策略参数
  • PPO(Proximal Policy Optimization)通过"截断"(clip)机制限制每次更新的幅度,保证训练稳定性:

    L_PPO = min( ratio · A, clip(ratio, 1-ε, 1+ε) · A )
    其中 ratio = π_θ(y|x) / π_old(y|x)

    2.5 PPO 的工程复杂度

    PPO 阶段是 RLHF 工程落地的最大痛点。训练时需要 4 个模型同时在显存中:

    #mermaid-svg-bQpF8Ja6fWhVGAsT{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bQpF8Ja6fWhVGAsT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bQpF8Ja6fWhVGAsT .error-icon{fill:#552222;}#mermaid-svg-bQpF8Ja6fWhVGAsT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bQpF8Ja6fWhVGAsT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bQpF8Ja6fWhVGAsT .marker.cross{stroke:#333333;}#mermaid-svg-bQpF8Ja6fWhVGAsT svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bQpF8Ja6fWhVGAsT p{margin:0;}#mermaid-svg-bQpF8Ja6fWhVGAsT .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-bQpF8Ja6fWhVGAsT .cluster-label text{fill:#333;}#mermaid-svg-bQpF8Ja6fWhVGAsT .cluster-label span{color:#333;}#mermaid-svg-bQpF8Ja6fWhVGAsT .cluster-label span p{background-color:transparent;}#mermaid-svg-bQpF8Ja6fWhVGAsT .label text,#mermaid-svg-bQpF8Ja6fWhVGAsT span{fill:#333;color:#333;}#mermaid-svg-bQpF8Ja6fWhVGAsT .node rect,#mermaid-svg-bQpF8Ja6fWhVGAsT .node circle,#mermaid-svg-bQpF8Ja6fWhVGAsT .node ellipse,#mermaid-svg-bQpF8Ja6fWhVGAsT .node polygon,#mermaid-svg-bQpF8Ja6fWhVGAsT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bQpF8Ja6fWhVGAsT .rough-node .label text,#mermaid-svg-bQpF8Ja6fWhVGAsT .node .label text,#mermaid-svg-bQpF8Ja6fWhVGAsT .image-shape .label,#mermaid-svg-bQpF8Ja6fWhVGAsT .icon-shape .label{text-anchor:middle;}#mermaid-svg-bQpF8Ja6fWhVGAsT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bQpF8Ja6fWhVGAsT .rough-node .label,#mermaid-svg-bQpF8Ja6fWhVGAsT .node .label,#mermaid-svg-bQpF8Ja6fWhVGAsT .image-shape .label,#mermaid-svg-bQpF8Ja6fWhVGAsT .icon-shape .label{text-align:center;}#mermaid-svg-bQpF8Ja6fWhVGAsT .node.clickable{cursor:pointer;}#mermaid-svg-bQpF8Ja6fWhVGAsT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bQpF8Ja6fWhVGAsT .arrowheadPath{fill:#333333;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bQpF8Ja6fWhVGAsT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bQpF8Ja6fWhVGAsT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bQpF8Ja6fWhVGAsT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bQpF8Ja6fWhVGAsT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bQpF8Ja6fWhVGAsT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bQpF8Ja6fWhVGAsT .cluster text{fill:#333;}#mermaid-svg-bQpF8Ja6fWhVGAsT .cluster span{color:#333;}#mermaid-svg-bQpF8Ja6fWhVGAsT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bQpF8Ja6fWhVGAsT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bQpF8Ja6fWhVGAsT rect.text{fill:none;stroke-width:0;}#mermaid-svg-bQpF8Ja6fWhVGAsT .icon-shape,#mermaid-svg-bQpF8Ja6fWhVGAsT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bQpF8Ja6fWhVGAsT .icon-shape p,#mermaid-svg-bQpF8Ja6fWhVGAsT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bQpF8Ja6fWhVGAsT .icon-shape .label rect,#mermaid-svg-bQpF8Ja6fWhVGAsT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bQpF8Ja6fWhVGAsT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bQpF8Ja6fWhVGAsT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bQpF8Ja6fWhVGAsT :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    PPO 阶段显存中的 4 个模型

    显存 ~100 GB

    ① 策略模型 π_θ7B 参数🔥 训练(梯度+优化器状态)

    ② 参考模型 π_ref7B 参数❄️ 冻结(计算 KL)

    ③ 奖励模型 R7B 参数❄️ 冻结(打分)

    ④ 价值模型 V7B 参数🔥 训练(估计优势)

    总显存需求~300-400 GB(7B 模型)

    模型作用参数量是否训练显存(7B)
    策略模型 π_θ 被优化的模型 7B ~100 GB
    参考模型 π_ref 计算 KL 散度 7B 否(推理) ~14 GB
    奖励模型 R 对回答打分 7B 否(推理) ~14 GB
    价值模型 V 估计优势函数 7B ~100 GB

    一个 7B 模型的 PPO 训练就需要 300-400 GB 显存(相当于 4-5 张 80GB A100)。如果训 70B 模型,显存需求还要再翻 10 倍。

    PPO 的其他工程难点:

    • 在线采样:每步都要用当前策略生成回答(forward pass),不能复用旧数据
    • 训练不稳定:RL 本身就难调,超参数敏感(学习率、clip ε、β、GAE λ 等)
    • 奖励黑客(Reward Hacking):策略可能学会"钻空子"骗奖励模型打高分,而非真正提升回答质量
    • 实现复杂:PPO 的工程实现非常繁琐,社区实现良莠不齐

    正因为如此,社区一直在寻找更简单、更稳定的替代方案。


    三、DPO:直接偏好优化

    3.1 DPO 的核心洞察

    DPO(Direct Preference Optimization,直接偏好优化) 是 2023 年 Stanford 提出的方法,它从根本上重新思考了对齐问题:

    既然 RLHF 的最终目标是用偏好数据改进策略模型,为什么不直接用偏好数据训练,而要绕道训练奖励模型和做 RL?

    DPO 的核心贡献是一个数学推导:最优的策略模型与奖励模型之间存在一个闭式解关系。利用这个关系,可以将偏好数据直接转化为策略模型的损失函数,完全跳过奖励模型训练和 RL 采样。

    3.2 DPO 的数学推导

    Step 1:从 RL 目标出发

    RLHF 的 RL 阶段优化目标(带 KL 约束的最大化期望奖励):

    maximize: E[ r(x, y) – β · log( π_θ(y|x) / π_ref(y|x) ) ]

    Step 2:求解最优策略

    这个优化问题有闭式解。对每个 (x, y),最优策略为:

    π*(y|x) = π_ref(y|x) · exp( r(x,y) / β ) / Z(x)

    其中 Z(x) 是配分函数(归一化常数)。

    Step 3:反解出奖励函数

    把上式重新排列,用 π* 和 π_ref 表示奖励 r:

    r(x, y) = β · log( π*(y|x) / π_ref(y|x) ) + β · log Z(x)

    Step 4:代入 Bradley-Terry 模型

    Bradley-Terry 模型假设人类偏好的概率与奖励差成正比:

    P(y_chosen > y_rejected | x) = σ( r(x, y_chosen) – r(x, y_rejected) )

    把 Step 3 的 r(x,y) 代入这个公式。注意 Z(x) 在做差时被消掉:

    r(x, y_chosen) – r(x, y_rejected)
    = β · log( π*(y_chosen|x) / π_ref(y_chosen|x) ) – β · log( π*(y_rejected|x) / π_ref(y_rejected|x) )

    Step 5:得到 DPO 损失

    将最优策略 π* 替换为我们训练的 π_θ,得到 DPO 的损失函数:

    L_DPO = -log σ( β · log( π_θ(y_chosen|x) / π_ref(y_chosen|x) ) – β · log( π_θ(y_rejected|x) / π_ref(y_rejected|x) ) )

    这个损失函数只需要:

    • 当前策略 π_θ 的对数概率(需要训练)
    • 参考模型 π_ref 的对数概率(冻结,预计算)
    • 偏好对 (y_chosen, y_rejected)

    完全不需要奖励模型,也不需要在线采样!

    3.3 DPO 的直觉理解

    DPO 损失函数的直觉:

    情况效果
    π_θ 对 y_chosen 的概率 ↑,对 y_rejected 的概率 ↓ 损失 ↓(好)
    π_θ 对 y_chosen 的概率 ↓,对 y_rejected 的概率 ↑ 损失 ↑(差,梯度纠正)

    DPO 本质上是在做一个相对概率最大化:在参考模型的约束下,提高"好回答"的概率、降低"坏回答"的概率。

    3.4 DPO 的工程优势

    #mermaid-svg-aGkSSHSviIGJqM7S{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aGkSSHSviIGJqM7S .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aGkSSHSviIGJqM7S .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aGkSSHSviIGJqM7S .error-icon{fill:#552222;}#mermaid-svg-aGkSSHSviIGJqM7S .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aGkSSHSviIGJqM7S .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aGkSSHSviIGJqM7S .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aGkSSHSviIGJqM7S .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aGkSSHSviIGJqM7S .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aGkSSHSviIGJqM7S .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aGkSSHSviIGJqM7S .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aGkSSHSviIGJqM7S .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aGkSSHSviIGJqM7S .marker.cross{stroke:#333333;}#mermaid-svg-aGkSSHSviIGJqM7S svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aGkSSHSviIGJqM7S p{margin:0;}#mermaid-svg-aGkSSHSviIGJqM7S .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-aGkSSHSviIGJqM7S .cluster-label text{fill:#333;}#mermaid-svg-aGkSSHSviIGJqM7S .cluster-label span{color:#333;}#mermaid-svg-aGkSSHSviIGJqM7S .cluster-label span p{background-color:transparent;}#mermaid-svg-aGkSSHSviIGJqM7S .label text,#mermaid-svg-aGkSSHSviIGJqM7S span{fill:#333;color:#333;}#mermaid-svg-aGkSSHSviIGJqM7S .node rect,#mermaid-svg-aGkSSHSviIGJqM7S .node circle,#mermaid-svg-aGkSSHSviIGJqM7S .node ellipse,#mermaid-svg-aGkSSHSviIGJqM7S .node polygon,#mermaid-svg-aGkSSHSviIGJqM7S .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aGkSSHSviIGJqM7S .rough-node .label text,#mermaid-svg-aGkSSHSviIGJqM7S .node .label text,#mermaid-svg-aGkSSHSviIGJqM7S .image-shape .label,#mermaid-svg-aGkSSHSviIGJqM7S .icon-shape .label{text-anchor:middle;}#mermaid-svg-aGkSSHSviIGJqM7S .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aGkSSHSviIGJqM7S .rough-node .label,#mermaid-svg-aGkSSHSviIGJqM7S .node .label,#mermaid-svg-aGkSSHSviIGJqM7S .image-shape .label,#mermaid-svg-aGkSSHSviIGJqM7S .icon-shape .label{text-align:center;}#mermaid-svg-aGkSSHSviIGJqM7S .node.clickable{cursor:pointer;}#mermaid-svg-aGkSSHSviIGJqM7S .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aGkSSHSviIGJqM7S .arrowheadPath{fill:#333333;}#mermaid-svg-aGkSSHSviIGJqM7S .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aGkSSHSviIGJqM7S .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aGkSSHSviIGJqM7S .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aGkSSHSviIGJqM7S .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aGkSSHSviIGJqM7S .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aGkSSHSviIGJqM7S .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aGkSSHSviIGJqM7S .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aGkSSHSviIGJqM7S .cluster text{fill:#333;}#mermaid-svg-aGkSSHSviIGJqM7S .cluster span{color:#333;}#mermaid-svg-aGkSSHSviIGJqM7S div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aGkSSHSviIGJqM7S .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aGkSSHSviIGJqM7S rect.text{fill:none;stroke-width:0;}#mermaid-svg-aGkSSHSviIGJqM7S .icon-shape,#mermaid-svg-aGkSSHSviIGJqM7S .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aGkSSHSviIGJqM7S .icon-shape p,#mermaid-svg-aGkSSHSviIGJqM7S .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aGkSSHSviIGJqM7S .icon-shape .label rect,#mermaid-svg-aGkSSHSviIGJqM7S .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aGkSSHSviIGJqM7S .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aGkSSHSviIGJqM7S .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aGkSSHSviIGJqM7S :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    DPO

    RLHF(PPO)

    偏好数据

    训练奖励模型需要额外模型

    PPO 强化学习需要 4 个模型

    对齐后的模型

    偏好数据

    直接训练只需 2 个模型(策略 + 参考)

    对齐后的模型

    显存: 4 个 7B 模型~300-400 GB

    显存: 2 个 7B 模型~120 GB

    对比维度RLHF(PPO)DPO
    模型数量 4 个(策略+参考+RM+价值) 2 个(策略+参考)
    显存(7B 模型) ~300-400 GB ~120 GB
    是否需要训练 RM
    是否需要在线采样 是(每步采样) 否(离线数据)
    训练稳定性 差(RL 难调) 好(类似 SFT)
    超参数复杂度 高(PPO/RL 参数多) 低(主要 β 和学习率)
    实现复杂度 低(几十行代码)
    效果 在大规模数据+精调下上限略高 接近 RLHF,多数场景足够

    3.5 DPO 代码示例

    import torch
    import torch.nn.functional as F
    from transformers import AutoModelForCausalLM, AutoTokenizer

    # 加载策略模型(训练)和参考模型(冻结)
    policy_model = AutoModelForCausalLM.from_pretrained("./sft_model", torch_dtype=torch.bfloat16)
    ref_model = AutoModelForCausalLM.from_pretrained("./sft_model", torch_dtype=torch.bfloat16)
    ref_model.eval()
    for p in ref_model.parameters():
    p.requires_grad = False

    tokenizer = AutoTokenizer.from_pretrained("./sft_model")

    def dpo_loss(policy_logits_fn, ref_logits_fn, chosen_ids, rejected_ids, beta=0.1):
    """
    policy_logits_fn: 输入 ids 返回 policy_model 的 log-probs
    ref_logits_fn: 输入 ids 返回 ref_model 的 log-probs
    chosen_ids: 偏好回答 A 的 token ids
    rejected_ids: 偏好回答 B 的 token ids
    """

    # 计算各回答在策略模型和参考模型下的对数概率
    policy_logp_chosen = policy_logits_fn(chosen_ids)
    policy_logp_rejected = policy_logits_fn(rejected_ids)
    ref_logp_chosen = ref_logits_fn(chosen_ids)
    ref_logp_rejected = ref_logits_fn(rejected_ids)

    # 对数比率(log-ratio)
    logits = beta * (
    (policy_logp_chosen ref_logp_chosen)
    (policy_logp_rejected ref_logp_rejected)
    )

    # DPO 损失 = -log sigmoid(logits)
    loss = F.logsigmoid(logits).mean()
    return loss

    # 典型的 DPO 训练循环
    optimizer = torch.optim.AdamW(policy_model.parameters(), lr=5e-7, betas=(0.9, 0.95))
    beta = 0.1 # 控制偏离参考模型的程度

    for batch in dataloader:
    prompt_ids = batch["prompt_ids"]
    chosen_ids = batch["chosen_ids"]
    rejected_ids = batch["rejected_ids"]

    loss = dpo_loss(
    lambda ids: compute_logp(policy_model, prompt_ids, ids),
    lambda ids: compute_logp(ref_model, prompt_ids, ids),
    chosen_ids, rejected_ids, beta
    )

    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

    DPO 的超参数比 PPO 简单得多:

    超参数典型值作用
    β(beta) 0.1 – 0.5 控制偏离参考模型的程度,β 越大越保守
    学习率 5e-7 ~ 1e-6 比预训练低
    Batch Size 32-128 偏好对的数量
    Epoch 1-3 通常 1-2 个 epoch 即可

    四、DPO 变体

    DPO 的简洁性催生了大量改进工作,下面介绍几个有代表性的变体。

    4.1 ORPO:SFT 与偏好学习合一

    ORPO(Odds Ratio Preference Optimization) 的特点是将 SFT 和偏好优化合并为一个阶段。

    • 不需要单独的 SFT 阶段:直接从基座模型开始
    • 引入"赔率比"(Odds Ratio) 作为偏好信号的度量
    • 损失函数同时包含语言建模损失(NLL)和偏好损失

    L_ORPO = L_NLL + λ · L_OR

    其中 L_OR 基于赔率比:

    OR = log( P(y_chosen) / (1 – P(y_chosen)) ) – log( P(y_rejected) / (1 – P(y_rejected)) )

    ORPO 的优势是省去了一个阶段(不需要先 SFT 再 DPO),训练流程更短、更快。

    4.2 KTO:不需要成对数据

    KTO(Kahneman-Tversky Optimization) 的突破在于:不需要偏好对,只需要"好/坏"的二元标签。

    • 数据形式从 (chosen, rejected) 变为 (response, good/bad)
    • 基于前景理论(Prospect Theory)设计损失
    • 数据标注成本更低(标注"好/坏"比排序容易)
    数据类型形式标注成本方法
    偏好对 (A 优于 B) 高(需要比较排序) DPO、ORPO
    二元标签 (回答, 好/坏) 低(只需判断) KTO
    点式奖励 (回答, 分数) 中(需要打分) RM + PPO

    4.3 IPO:解决 DPO 的过拟合问题

    IPO(Identity Preference Optimization) 针对 DPO 在大数据集上过拟合的问题。

    DPO 的损失在偏好数据完全拟合时会趋向于 0,导致策略过度自信。IPO 将 sigmoid 损失替换为平方损失:

    L_IPO = ( logit – 0.5 )²

    这限制了模型对偏好数据的过度拟合。

    4.4 SimPO:无需参考模型

    SimPO(Simple Preference Optimization) 进一步简化:完全去掉参考模型。

    • 用回答的长度归一化对数概率作为隐式奖励
    • 不需要冻结的参考模型,显存再减一半
    方法需要参考模型?需要训练 RM?需要在线采样?显存(7B)
    RLHF (PPO) ~400 GB
    DPO ~120 GB
    ORPO 否(SFT 合并) ~100 GB
    KTO ~120 GB
    SimPO ~60 GB

    五、方法效果与成本对比

    5.1 效果对比

    根据大量实验和论文报告,各方法在标准基准(如 AlpacaEval、MT-Bench、Chatbot Arena)上的大致表现:

    方法效果(相对值)训练成本标注成本工程复杂度
    仅 SFT 基准
    RLHF (PPO) 105-110% 极高 极高
    DPO 103-107%
    ORPO 103-106% 中低
    KTO 102-105%
    SimPO 103-107% 最低

    说明:效果相对值以"仅 SFT"为 100% 基准,数据来源于各方法论文及社区实验,仅供参考,实际效果取决于数据和调参。

    5.2 成本对比

    维度RLHFDPOORPO
    阶段数 3(SFT+RM+PPO) 2(SFT+DPO) 1(直接 ORPO)
    GPU 需求(7B) 4-8 × A100 2 × A100 1-2 × A100
    训练时间 数天 数小时 数小时
    超参数数 10+ 3-4 3-4
    可复现性

    5.3 选型建议

    #mermaid-svg-peUBBqEtQGQGZ9rK{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-peUBBqEtQGQGZ9rK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-peUBBqEtQGQGZ9rK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-peUBBqEtQGQGZ9rK .error-icon{fill:#552222;}#mermaid-svg-peUBBqEtQGQGZ9rK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-peUBBqEtQGQGZ9rK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-peUBBqEtQGQGZ9rK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-peUBBqEtQGQGZ9rK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-peUBBqEtQGQGZ9rK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-peUBBqEtQGQGZ9rK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-peUBBqEtQGQGZ9rK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-peUBBqEtQGQGZ9rK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-peUBBqEtQGQGZ9rK .marker.cross{stroke:#333333;}#mermaid-svg-peUBBqEtQGQGZ9rK svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-peUBBqEtQGQGZ9rK p{margin:0;}#mermaid-svg-peUBBqEtQGQGZ9rK .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-peUBBqEtQGQGZ9rK .cluster-label text{fill:#333;}#mermaid-svg-peUBBqEtQGQGZ9rK .cluster-label span{color:#333;}#mermaid-svg-peUBBqEtQGQGZ9rK .cluster-label span p{background-color:transparent;}#mermaid-svg-peUBBqEtQGQGZ9rK .label text,#mermaid-svg-peUBBqEtQGQGZ9rK span{fill:#333;color:#333;}#mermaid-svg-peUBBqEtQGQGZ9rK .node rect,#mermaid-svg-peUBBqEtQGQGZ9rK .node circle,#mermaid-svg-peUBBqEtQGQGZ9rK .node ellipse,#mermaid-svg-peUBBqEtQGQGZ9rK .node polygon,#mermaid-svg-peUBBqEtQGQGZ9rK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-peUBBqEtQGQGZ9rK .rough-node .label text,#mermaid-svg-peUBBqEtQGQGZ9rK .node .label text,#mermaid-svg-peUBBqEtQGQGZ9rK .image-shape .label,#mermaid-svg-peUBBqEtQGQGZ9rK .icon-shape .label{text-anchor:middle;}#mermaid-svg-peUBBqEtQGQGZ9rK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-peUBBqEtQGQGZ9rK .rough-node .label,#mermaid-svg-peUBBqEtQGQGZ9rK .node .label,#mermaid-svg-peUBBqEtQGQGZ9rK .image-shape .label,#mermaid-svg-peUBBqEtQGQGZ9rK .icon-shape .label{text-align:center;}#mermaid-svg-peUBBqEtQGQGZ9rK .node.clickable{cursor:pointer;}#mermaid-svg-peUBBqEtQGQGZ9rK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-peUBBqEtQGQGZ9rK .arrowheadPath{fill:#333333;}#mermaid-svg-peUBBqEtQGQGZ9rK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-peUBBqEtQGQGZ9rK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-peUBBqEtQGQGZ9rK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-peUBBqEtQGQGZ9rK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-peUBBqEtQGQGZ9rK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-peUBBqEtQGQGZ9rK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-peUBBqEtQGQGZ9rK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-peUBBqEtQGQGZ9rK .cluster text{fill:#333;}#mermaid-svg-peUBBqEtQGQGZ9rK .cluster span{color:#333;}#mermaid-svg-peUBBqEtQGQGZ9rK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-peUBBqEtQGQGZ9rK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-peUBBqEtQGQGZ9rK rect.text{fill:none;stroke-width:0;}#mermaid-svg-peUBBqEtQGQGZ9rK .icon-shape,#mermaid-svg-peUBBqEtQGQGZ9rK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-peUBBqEtQGQGZ9rK .icon-shape p,#mermaid-svg-peUBBqEtQGQGZ9rK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-peUBBqEtQGQGZ9rK .icon-shape .label rect,#mermaid-svg-peUBBqEtQGQGZ9rK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-peUBBqEtQGQGZ9rK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-peUBBqEtQGQGZ9rK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-peUBBqEtQGQGZ9rK :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    否,只有好/坏标签

    选择对齐方法

    资源充足?(8+ A100)

    追求最高上限?有专家团队?

    有成对偏好数据?

    → RLHF (PPO)上限最高但最复杂

    → DPO平衡效果与成本

    → DPO / SimPO标准选择

    → KTO标注成本最低

    想省去 SFT 阶段?

    → ORPO一步到位

    DPO

    SimPO

    实践建议:

  • 大多数场景选 DPO:效果接近 RLHF,工程简单,是当前社区的事实标准
  • 想省流程选 ORPO:跳过 SFT,一步训练完成
  • 标注预算有限选 KTO:只需好/坏标签
  • 追求极致效果且有充足资源选 RLHF:在大规模数据 + 专家调参下上限最高
  • 显存极度紧张选 SimPO:无需参考模型,显存最低

  • 六、对齐训练的常见陷阱

    6.1 奖励黑客(Reward Hacking)

    在 RLHF 中,策略模型可能学会"钻空子"——找到奖励模型的盲点来获得高分,而非真正提升回答质量。

    表现:

    • 回答变得冗长(RM 偏好长回答)
    • 模型生成 RM 训练数据中的模式,而非真正回答问题
    • KL 散度快速增大,策略偏离参考模型太远

    对策:

    • 适当增大 β(KL 惩罚系数)
    • 定期用新数据更新奖励模型
    • 监控 KL 散度,设置阈值

    6.2 DPO 的多样性下降

    DPO 的一个常见问题是:训练后模型生成多样性下降(所有回答趋于类似风格)。

    原因:DPO 鼓励模型提高 chosen 回答的概率、降低 rejected 回答的概率,过度训练会导致输出分布塌缩。

    对策:

    • 控制 epoch 数(通常 1-2 epoch)
    • 适当增大 β
    • 监控生成多样性指标

    6.3 偏好数据的质量是关键

    无论哪种方法,偏好数据的质量决定了对齐效果的上限。常见问题:

    问题影响对策
    标注不一致 不同标注员偏好不同 多人标注取共识
    chosen 和 rejected 差异太小 模型学不到区分信号 过滤低质量数据
    偏好分布偏差 标注员偏好影响模型风格 多样化标注来源

    本篇小结

    知识点核心内容
    对齐训练目标 让模型从"能生成文本"进化为"能生成人类偏好的回答"
    RLHF 三阶段 SFT → 奖励模型 RM → PPO 强化学习
    PPO 工程复杂度 4 个模型同时驻留(策略+参考+RM+价值),显存 300-400 GB(7B)
    DPO 核心思想 用数学推导将偏好数据直接转化为策略损失,跳过 RM 和 RL
    DPO 数学原理 Bradley-Terry 模型 + KL 约束的闭式解 → sigmoid 损失
    DPO 显存优势 只需 2 个模型(策略+参考),~120 GB(7B)
    ORPO SFT 与偏好学习合一,省去一个训练阶段
    KTO 不需要成对数据,只需好/坏二元标签
    SimPO 无需参考模型,显存最低
    选型建议 大多数场景选 DPO,极致效果选 RLHF,省流程选 ORPO

    下篇预告

    第 12 篇:主流训练框架对比——DeepSpeed、Megatron-LM 与 PyTorch FSDP

    本篇我们学习了从 RLHF 到 DPO 的对齐训练方法。下一篇我们将转向工程工具层,系统对比主流分布式训练框架:DeepSpeed 的 ZeRO 全家族、Megatron-LM 的 3D 并行、PyTorch 原生 FSDP、Ray Train 与 ColossalAI。理解各框架的定位与选型,是搭建 AIaaS 训练平台的基础。


    如果本篇内容对你有帮助,欢迎点赞收藏!有任何疑问,欢迎在评论区交流。

    赞(0)
    未经允许不得转载:171主机测评 » 第11篇-对齐训练-从RLHF到DPO的范式演进
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址