mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
692 字
2 分钟
RLHF:让 AI 对齐人类价值观
2025-01-18

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 torch
import 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 kl

4.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 优势:更简单、更稳定、无需 RM

7.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 从「会说话」变成「会听话」。


参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

RLHF:让 AI 对齐人类价值观
https://blog.souloss.com/posts/machine-learning/llm-paper-history/rlhf-and-human-feedback-rl/
作者
Souloss
发布于
2025-01-18
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时