692 字
2 分钟
RLHF:让 AI 对齐人类价值观
2020 年,OpenAI 发表了一篇关于「用人类反馈学习摘要」的论文。
这篇论文提出了 RLHF(Reinforcement Learning from Human Feedback)——让 AI 通过人类反馈来学习,而不是仅仅依靠预定义的目标函数。
2022 年,InstructGPT 将 RLHF 应用于大语言模型,实现了人类意图对齐。这成为 ChatGPT 的核心技术基础。
RLHF 是让 AI 听话的关键。
本文要点
- RLHF 的起源与动机
- Learning to Summarize 论文解读
- 偏好建模与奖励模型
- InstructGPT 三阶段训练
- PPO 算法详解
- RLHF 的影响与局限
一、RLHF 的起源
1.1 研究动机
flowchart TB
subgraph RLHF要解决的问题
A[传统训练的问题]
A --> A1[语言模型优化目标:预测下一个词]
A --> A2[这个目标与「有用、无害、诚实」不完全对齐]
A --> A3[模型可能生成正确但不有用的内容]
B[难以定义的目标]
B --> B1["「好的摘要」难以用公式定义"]
B --> B2["「有帮助的回答」因人而异"]
B --> B3[传统损失函数无法捕捉这些]
C[RLHF 的解决思路]
C --> C1[ 让人类直接表达偏好]
C --> C2[ 训练奖励模型学习人类偏好]
C --> C3[ 用强化学习优化模型]
end
1.2 论文信息
论文:Learning to Summarize with Human Feedback作者:Nisan Stiennon, Long Ouyang, Jeffrey Wu, Daniel Ziegler, Ryan Lowe, Chelsea Voss, Alec Radford, Dario Amodei, Paul Christiano机构:OpenAI发表:NeurIPS 2020引用:5000+ 次二、Learning to Summarize 论文解读
2.1 任务定义
flowchart LR
A[长文章] --> B[摘要模型]
B --> C[摘要]
D[人类评估者] --> E[比较两个摘要]
E --> F[偏好数据]
F --> G[奖励模型]
G --> H[强化学习优化]
H --> B
flowchart TB
subgraph 摘要任务设定
A[任务]
A --> A1[生成帖子摘要]
B[输入]
B --> B1[Reddit 帖子(通常较长)]
B --> B2[输出:简短摘要]
C[数据]
C --> C1[Reddit TL;DR 数据集]
C --> C2[约 93,000 个帖子-摘要对]
C --> C3[帖子平均长度:500+ 词]
C --> C4[摘要平均长度:25 词]
D[评估方式]
D --> D1[人类偏好比较]
D --> D2[不是 BLEU/ROUGE,而是人类判断]
end
2.2 三阶段训练流程
flowchart TB
subgraph 阶段1: 监督微调
A1[帖子-摘要对] --> B1[监督训练]
B1 --> C1[SFT 模型]
end
subgraph 阶段2: 奖励模型训练
D1[生成多个摘要] --> E1[人类排序]
E1 --> F1[训练奖励模型]
F1 --> G1[RM]
end
subgraph 阶段3: 强化学习
H1[SFT 模型] --> I1[生成摘要]
I1 --> J1[RM 评分]
J1 --> K1[PPO 更新]
K1 --> H1
end
C1 --> D1
C1 --> H1
G1 --> J1
三、偏好建模与奖励模型
3.1 数据收集
flowchart TB
subgraph 人类偏好数据收集
A[流程]
A --> A1[给定一个帖子]
A --> A2[模型生成多个候选摘要]
A --> A3[人类评估者比较并排序]
A --> A4[记录偏好关系]
B[收集规模]
B --> B1[约 64,000 对比较]
B --> B2[多个评估者交叉验证]
B --> B3[计算评估者一致性]
C[偏好格式]
C --> C1[给定摘要 A 和 B]
C --> C2[人类选择「A 更好」或「B 更好」]
C --> C3[可选:程度(好很多/稍好)]
end
3.2 奖励模型训练
import torchimport torch.nn as nn
class RewardModel(nn.Module): """奖励模型:将文本映射到标量分数"""
def __init__(self, base_model): super().__init__() self.base_model = base_model # 预训练语言模型 self.value_head = nn.Linear(hidden_size, 1)
def forward(self, input_ids, attention_mask): """ 计算奖励分数
Args: input_ids: 输入文本的 token ID attention_mask: 注意力掩码
Returns: reward: 标量奖励值 """ # 获取最后一个 token 的隐藏状态 outputs = self.base_model( input_ids=input_ids, attention_mask=attention_mask ) last_hidden = outputs.last_hidden_state[:, -1, :]
# 预测奖励 reward = self.value_head(last_hidden) return reward.squeeze(-1)
def train_reward_model(reward_model, preference_data, optimizer): """ 训练奖励模型
偏好数据:(post, summary_better, summary_worse) """ for post, better, worse in preference_data: # 计算两个摘要的奖励 reward_better = reward_model(post + better) reward_worse = reward_model(post + worse)
# Bradley-Terry 模型:P(A > B) = sigmoid(r_A - r_B) # 损失:-log sigmoid(r_better - r_worse) loss = -torch.nn.functional.logsigmoid(reward_better - reward_worse)
optimizer.zero_grad() loss.backward() optimizer.step()3.3 Bradley-Terry 模型
flowchart TB
subgraph Bradley-Terry偏好模型
A[基本形式]
A --> A1["P(A 优于 B) = σ(r_A - r_B)"]
B[其中]
B --> B1[σ 是 sigmoid 函数]
B --> B2["r_A, r_B 是奖励模型给 A、B 的分数"]
C[训练目标]
C --> C1["L = -E[log P(人类偏好)]"]
C --> C2["= -E[log σ(r_better - r_worse)]"]
D[优势]
D --> D1[将排序问题转化为分类问题]
D --> D2[可微分,易于训练]
D --> D3[不需要绝对分数,只需要相对偏好]
end
四、InstructGPT 三阶段训练
4.1 论文信息
论文:Training Language Models to Follow Instructions with Human Feedback作者:Long Ouyang, Jeffrey Wu, Xu Jiang, Diogo Almeida, Carroll Wainwright, Pamela Mishkin, ... (OpenAI 团队)机构:OpenAI发表:2022 年4.2 三阶段详解
flowchart TB
subgraph InstructGPT训练流程
A[阶段 1:监督微调(SFT)]
A --> A1[数据:人类编写的示范回答]
A --> A2[规模:约 13,000 条指令-回答对]
A --> A3[方法:标准语言模型微调]
A --> A4[目的:让模型学会遵循指令的基本格式]
B[阶段 2:奖励模型训练(RM)]
B --> B1[数据:人类对模型输出的排序]
B --> B2[规模:约 33,000 对比较]
B --> B3[方法:Bradley-Terry 损失]
B --> B4[目的:学习人类偏好]
C[阶段 3:PPO 强化学习]
C --> C1[数据:提示词]
C --> C2[方法:Proximal Policy Optimization]
C --> C3[奖励:奖励模型分数 + KL 散度惩罚]
C --> C4[目的:优化策略以最大化人类偏好]
end
4.3 PPO 算法
def ppo_train(policy_model, reward_model, reference_model, prompts, epochs=4, batch_size=64): """ PPO 训练循环 """ optimizer = torch.optim.Adam(policy_model.parameters(), lr=1e-6) kl_coef = 0.02 # KL 散度惩罚系数
for epoch in range(epochs): for prompt_batch in prompts: # 1. 生成响应 responses = policy_model.generate(prompt_batch)
# 2. 计算奖励 rewards = reward_model(prompt_batch + responses)
# 3. 计算 KL 散度(防止偏离太远) kl_div = compute_kl_divergence( policy_model, reference_model, prompt_batch, responses )
# 4. 总奖励 = RM 分数 - KL 惩罚 total_reward = rewards - kl_coef * kl_div
# 5. 计算优势(简化版) advantages = total_reward - total_reward.mean()
# 6. PPO 损失 old_log_probs = policy_model.log_prob(prompt_batch, responses) new_log_probs = policy_model.log_prob(prompt_batch, responses)
ratio = torch.exp(new_log_probs - old_log_probs) clipped_ratio = torch.clamp(ratio, 1 - 0.2, 1 + 0.2)
loss = -torch.min( ratio * advantages, clipped_ratio * advantages ).mean()
# 7. 更新 optimizer.zero_grad() loss.backward() optimizer.step()
return policy_model
def compute_kl_divergence(policy, reference, prompt, response): """计算 KL 散度""" policy_probs = policy.get_probs(prompt, response) reference_probs = reference.get_probs(prompt, response)
kl = (reference_probs * ( torch.log(reference_probs + 1e-10) - torch.log(policy_probs + 1e-10) )).sum(-1)
return kl4.4 为什么需要 KL 惩罚?
flowchart TB
subgraph KL惩罚的作用
A[问题]
A --> A1[奖励模型可能不完美]
A --> A2["RM 可能有「漏洞」"]
A --> A3["模型可能学会「欺骗」RM"]
A --> A4[生成高奖励但无意义的内容]
B[解决:KL 散度惩罚]
B --> B1[让策略模型不要偏离初始模型太远]
B --> B2[保持语言能力]
B --> B3[防止「奖励黑客」]
C[公式]
C --> C1["总奖励 = R(x, y) - β * KL(π || π_ref)"]
D[其中]
D --> D1[R:奖励模型分数]
D --> D2[β:惩罚系数]
D --> D3[π:当前策略]
D --> D4[π_ref:初始策略(SFT 模型)]
end
五、实验结果
5.1 InstructGPT 效果
xychart-beta
title "人类偏好评估:InstructGPT vs GPT-3"
x-axis ["真实性", "无害性", "指令遵循"]
y-axis "偏好率 %" 0 --> 100
bar [73, 69, 85]
flowchart TB
subgraph InstructGPT关键结果
A[人类评估结果]
A --> A1[85% 的回答优于 GPT-3]
A --> A2[真实性提升:22% → 73%]
A --> A3[无害性提升:21% → 69%]
B[有趣发现]
B --> B1[1.3B 的 InstructGPT 优于 175B 的 GPT-3]
B --> B2[对齐比规模更重要]
C[泛化能力]
C --> C1[在未见过的指令上表现良好]
C --> C2[能处理非英语输入]
C --> C3[具备一定的代码能力]
end
六、RLHF 的影响与局限
6.1 对行业的影响
flowchart TB
subgraph RLHF的深远影响
A[技术层面]
A --> A1[成为 AI 对齐的标准方法]
A --> A2[ChatGPT 的核心技术]
A --> A3[被所有主流模型采用]
B[产品层面]
B --> B1[ChatGPT 的成功证明 RLHF 的价值]
B --> B2[用户期望:AI 应该「听话」]
B --> B3[安全性成为产品要求]
C[研究层面]
C --> C1[对齐研究成为热点]
C --> C2[Constitutional AI、DPO 等变体出现]
C --> C3[RLHF 的改进方向活跃]
D[后续发展]
D --> D1[Claude: Constitutional AI]
D --> D2[LLaMA 2: RLHF + 拒绝采样]
D --> D3[Direct Preference Optimization (DPO)]
end
6.2 RLHF 的局限
flowchart TB
subgraph RLHF的局限性
A[人类标注成本高]
A --> A1[需要大量人类偏好数据]
A --> A2[标注质量影响最终效果]
B[奖励模型不完美]
B --> B1[可能被「欺骗」]
B --> B2[奖励黑客问题]
C[训练不稳定]
C --> C1[PPO 超参数敏感]
C --> C2[需要仔细调优]
D[价值观不一致]
D --> D1[不同人群价值观不同]
D --> D2[模型可能偏向标注者]
E[性能权衡]
E --> E1[对齐可能导致性能下降(对齐税)]
E --> E2[在某些任务上变差]
end
七、后续改进方向
7.1 DPO:直接偏好优化
def dpo_loss(policy, reference, preferred, dispreferred, beta=0.1): """ Direct Preference Optimization 直接优化偏好,无需训练奖励模型 """ # 计算两个模型的 log 概率 log_prob_pref = policy.log_prob(preferred) log_prob_disp = policy.log_prob(dispreferred) log_prob_ref_pref = reference.log_prob(preferred) log_prob_ref_disp = reference.log_prob(dispreferred)
# DPO 损失 loss = -torch.nn.functional.logsigmoid( beta * ( (log_prob_pref - log_prob_ref_pref) - (log_prob_disp - log_prob_ref_disp) ) )
return loss
# DPO 优势:更简单、更稳定、无需 RM7.2 其他变体
RLHF 变体:
1. RLAIF (RL from AI Feedback) • 用 AI 代替人类标注 • 降低成本,可扩展
2. RRHF (Rank Responses to Align) • 排序响应进行对齐 • 更简单的训练方式
3. Rejection Sampling • 生成多个候选 • 选择奖励最高的 • LLaMA 2 采用
4. Iterative DPO • 多轮迭代优化 • 逐步提升质量常见问题 FAQ
Q1:RLHF 和传统微调有什么区别?
A:传统微调优化的是「预测下一个词」,RLHF 优化的是「人类偏好」。RLHF 让模型学会什么是「好」的回答,而不只是什么是「正确」的预测。
Q2:为什么需要三个阶段?
A:SFT 让模型学会格式和基本能力;RM 学习人类偏好;PPO 用 RM 引导优化。每个阶段解决不同问题,。
Q3:PPO 比 REINFORCE 好在哪里?
A:PPO 有信任区域约束,更新更稳定,不会一次性改变太多。对于大模型,稳定性非常重要。
Q4:RLHF 会导致模型变「笨」吗?
A:可能。过度对齐可能降低模型的创造性和某些能力。这就是「对齐税」问题,需要平衡。
Q5:如何评估 RLHF 的效果?
A:主要靠人类评估。自动化指标(如 BLEU)与人类偏好相关性低,所以 RLHF 的评估依赖人工标注。
小结
RLHF 是让 AI 对齐人类价值观的关键技术。
核心贡献:
flowchart TB
subgraph RLHF变体
A[RLAIF (RL from AI Feedback)]
A --> A1[用 AI 代替人类标注]
A --> A2[降低成本,可扩展]
B[RRHF (Rank Responses to Align)]
B --> B1[排序响应进行对齐]
B --> B2[更简单的训练方式]
C[Rejection Sampling]
C --> C1[生成多个候选]
C --> C2[选择奖励最高的]
C --> C3[LLaMA 2 采用]
D[Iterative DPO]
D --> D1[多轮迭代优化]
D --> D2[逐步提升质量]
end
RLHF 让 AI 从「会说话」变成「会听话」。
参考资料
- Learning to Summarize with Human Feedback - Stiennon et al. 2020
- InstructGPT: Training Language Models to Follow Instructions - Ouyang et al. 2022
- Direct Preference Optimization - Rafailov et al. 2023
- Constitutional AI - Bai et al. 2022
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时
相关文章 智能推荐
1
RLAIF 论文解读:用 AI 反馈替代人类反馈
AI 深度解读 RLAIF 论文——Google 如何用 AI 反馈替代人类反馈进行强化学习,实现与 RLHF 相当的对齐效果。
2
Claude 系列:Anthropic 的对齐之路
AI 深度解读 Claude 系列模型——从 Claude 1 到 Claude 4,Constitutional AI、3H 原则的发展历程
3
InstructGPT:ChatGPT 的直接前身
AI 深度解读 InstructGPT 论文(2022)——SFT+RLHF 三步训练流程、奖励模型训练、PPO 对齐优化
4
DPO:绕过奖励模型的直接偏好优化
AI 深度解读 Direct Preference Optimization (2023)——绕过 reward model 直接优化人类偏好
5
LoRA 与 PEFT:参数高效微调技术
AI 深度解读 LoRA 与 PEFT 系列——低秩适应、QLoRA、Adapter 等参数高效微调技术






