【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 算法步骤(每次迭代):
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 | 是 | ~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
| 模型数量 | 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) 进一步简化:完全去掉参考模型。
- 用回答的长度归一化对数概率作为隐式奖励
- 不需要冻结的参考模型,显存再减一半
| 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 成本对比
| 阶段数 | 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
实践建议:
六、对齐训练的常见陷阱
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 训练平台的基础。
如果本篇内容对你有帮助,欢迎点赞收藏!有任何疑问,欢迎在评论区交流。


