01RLHF Pipeline Overview

RLHF 全流程概览

从监督微调(SFT)到奖励建模,再到 PPO 强化学习优化,最终得到对齐的人类偏好模型。点击下方各阶段查看详细说明。

三阶段流程图
Bradley-Terry 偏好建模 → RLHF 训练循环
Python# RLHF 三阶段训练流程 def rlhf_pipeline(base_model, pref_data): # Stage 1: SFT — 监督微调 sft_model = supervised_finetune( base_model, instruction_data ) # Stage 2: RM — 奖励模型训练 reward_model = train_reward_model( sft_model, pref_data ) # Bradley-Terry loss # Stage 3: PPO — 强化学习优化 aligned_model = ppo_optimize( policy=sft_model, reward_model=reward_model, ref_model=copy(sft_model), kl_coef=0.02 ) return aligned_model
02Reward Model Training

奖励模型训练

基于人类偏好对 (chosen, rejected) 训练奖励模型 r(x),使用 Bradley-Terry 模型使 chosen 的奖励分数高于 rejected。拖动滑块调整偏好数据质量。

偏好对与奖励分数
Bradley-Terry 损失函数
Python# Bradley-Terry 偏好模型 import torch import torch.nn.functional as F def bt_loss(reward_model, chosen_ids, rejected_ids): r_chosen = reward_model(chosen_ids) # r(x_chosen) r_rejected = reward_model(rejected_ids) # r(x_rejected) # P(chosen > rejected) = sigmoid(r_c - r_r) logits = r_chosen - r_rejected loss = -F.logsigmoid(logits).mean() return loss # 奖励分数排序准确率 def accuracy(r_c, r_r): return (r_c > r_r).float().mean().item()
03PPO Algorithm

PPO 优化算法

近端策略优化(PPO)同时运行策略模型、参考模型、奖励模型和价值模型。调整 KL 惩罚系数 β 与裁剪比率 ε,观察策略梯度裁剪效果。

PPO 训练循环
策略梯度与裁剪目标
Python# PPO Clipped Surrogate Objective def ppo_loss(policy, ref, reward, values, old_logp, states, actions, beta=0.02, eps=0.2): # 比率 ratio = pi(a|s) / pi_old(a|s) logp = policy.log_prob(states, actions) ratio = torch.exp(logp - old_logp) # 优势函数 (GAE) advantages = compute_gae(reward, values) advantages = (advantages - advantages.mean()) / \ (advantages.std() + 1e-8) # 裁剪目标 surr1 = ratio * advantages surr2 = torch.clamp(ratio, 1-eps, 1+eps) * advantages policy_loss = -torch.min(surr1, surr2).mean() # KL 惩罚 kl = kl_divergence(policy, ref, states).mean() return policy_loss + beta * kl
04Direct Preference Optimization

DPO 直接偏好优化

DPO 跳过显式奖励模型,直接用偏好数据优化策略。核心洞察:隐式奖励 r = β·log(π/π_ref)。调整 β 观察损失景观变化。

DPO vs PPO 对比与损失景观
DPO 损失函数
Python# Direct Preference Optimization import torch.nn.functional as F def dpo_loss(policy, ref, chosen, rejected, beta=0.1): # 隐式奖励: r = beta * log(pi / pi_ref) pi_c = policy.log_prob(chosen) pi_r = policy.log_prob(rejected) ref_c = ref.log_prob(chosen).detach() ref_r = ref.log_prob(rejected).detach() log_ratio_c = pi_c - ref_c # log(pi_c/pi_ref_c) log_ratio_r = pi_r - ref_r # DPO 损失 = -log sigmoid(beta * (r_c - r_r)) logits = beta * (log_ratio_c - log_ratio_r) loss = -F.logsigmoid(logits).mean() return loss # 无需奖励模型, 直接从偏好学习
05Preference Data Format

偏好数据格式

偏好数据由 prompt、chosen 和 rejected 组成,标注流程涉及人工标注员排序。切换 pairwise / listwise / pointwise 查看不同标注格式。

标注流程与数据格式
偏好数据集结构
JSON// pairwise 偏好数据格式 { "prompt": "解释什么是量子纠缠", "chosen": [ {"role": "user", "content": "..."}, {"role": "assistant", "content": "量子纠缠是..."} ], "rejected": [ {"role": "user", "content": "..."}, {"role": "assistant", "content": "纠缠就是..."} ], "metadata": { "annotator_id": 42, "agreement": 0.92, "source": "human" } } // listwise: prompt + ranked_responses[] // pointwise: prompt + response + score
06KL Divergence Constraint

KL 散度约束

KL 惩罚防止策略偏离参考模型过远,避免奖励黑客(reward hacking)与模式崩溃。调整 KL 系数,观察奖励与多样性之间的权衡曲线。

策略漂移与 Reward-KL 权衡
KL 惩罚项
Python# KL 散度惩罚 import torch.nn.functional as F def kl_penalty(policy, ref_model, states, beta=0.02): # 逐 token KL 散度 logp = policy.log_prob(states) # log pi_theta logp_ref = ref_model.log_prob(states) # log pi_ref p = torch.exp(logp) # KL(pi || pi_ref) = sum p * (logp - logp_ref) kl = (p * (logp - logp_ref)).sum(dim=-1).mean() # 总目标 = reward - beta * KL return beta * kl # reward_hacking 防御: # 高 reward + 低 KL = 安全优化 # 高 reward + 高 KL = 可能 hacking
07Safety Alignment & Red Teaming

安全对齐与红队

红队测试模拟越狱攻击(jailbreak),安全护栏在多层防御中拦截有害请求。选择不同攻击类型,查看防御层的响应策略。

攻击面与防御层
安全分类器
Python# 安全分类与拦截 from transformers import AutoModelForSequenceClassification HARMFUL_CATEGORIES = [ "violence", "self_harm", "hate_speech", "sexual", "illegal", "deception", ] def safety_check(prompt, response, threshold=0.85): # 多层防御: 输入检测 + 输出检测 input_risk = classifier.predict(prompt) output_risk = classifier.predict(response) if input_risk.max() > threshold: return refuse( "抱歉,我无法协助此类请求。" ) if output_risk.max() > threshold: return rewrite(response) return response # 安全通过
08Evaluation & Benchmarks

评估与基准

MT-Bench、AlpacaEval、Arena Elo 与奖励模型准确率共同衡量对齐效果。雷达图对比 base 与 aligned 模型,调整参数查看预测变化。

雷达图对比与基准分数
评估脚本
Python# RLHF 评估基准 def evaluate(model, benchmarks): results = {} for bench in benchmarks: if bench == "mt_bench": # 多轮对话, GPT-4 评分 results[bench] = mt_bench_score( model, judge="gpt-4" ) elif bench == "alpaca_eval": # 胜率 vs reference results[bench] = alpaca_winrate( model, ref="text-davinci-003" ) elif bench == "arena_elo": # 人群盲评 Elo 排名 results[bench] = compute_elo( model, human_votes ) elif bench == "rm_acc": # 奖励模型排序准确率 results[bench] = rm_accuracy( reward_model, test_set ) return results # 人类评估 vs 自动指标 # correlation = pearson(human, auto)