RLHF强化学习人类反馈对齐是什么
RLHF(Reinforcement Learning from Human Feedback)是大模型对齐训练的核心技术路线,通过引入人类偏好信号指导模型行为,使大语言模型的输出更符合人类预期。自InstructGPT论文发表以来,RLHF已成为GPT系列、Claude、Gemini等主流商业模型对齐阶段的标准方案,其核心思路是将人类主观判断转化为可优化的奖励信号,再通过强化学习算法调整模型策略。
RLHF训练三阶段流程拆解
RLHF的训练流程可拆解为三个阶段:监督微调(SFT)、奖励模型训练(Reward Modeling)、PPO策略优化(Reinforcement Learning)。每个阶段的输入输出和目标函数截然不同,理解各阶段的衔接逻辑是落地RLHF的关键。
阶段一监督微调SFT构建基线策略
SFT阶段的目标是在预训练模型基础上建立初步的指令遵循能力。该阶段使用人工编写的高质量指令-回答对作为训练数据,采用标准的交叉熵损失进行监督学习。SFT模型的质量直接决定后续RLHF的上限——基线策略如果连基本指令都无法遵循,奖励模型的偏好信号就无从生效。
# SFT训练示例 - 使用HuggingFace TRL库
from trl import SFTTrainer
from transformers import AutoTokenizer, AutoModelForCausalLM
from datasets import load_dataset
model = AutoModelForCausalLM.from_pretrained('meta-llama/Llama-3-8B')
tokenizer = AutoTokenizer.from_pretrained('meta-llama/Llama-3-8B')
dataset = load_dataset('json', data_files='sft_data.json')
def formatting_func(example):
return f"### Instruction:\n{example['instruction']}\n### Response:\n{example['output']}"
trainer = SFTTrainer(
model=model,
train_dataset=dataset['train'],
formatting_func=formatting_func,
max_seq_length=2048,
args=TrainingArguments(
per_device_train_batch_size=4,
gradient_accumulation_steps=8,
learning_rate=2e-5,
num_train_epochs=3,
output_dir='./sft_output'
)
)
trainer.train()
阶段二奖励模型训练将偏好转化为标量信号
奖励模型(RM)的核心任务是把人类的「A比B好」这种排序判断转化为可微分的标量奖励值。训练数据由人类标注员对同一提示下的多个模型输出进行排序,形成偏好对(preference pairs)。奖励模型通常以SFT模型为底座,去掉最后的unembedding层,替换为标量输出头。
奖励模型的训练损失函数采用Bradley-Terry模型推导出的成对排序损失:
# 奖励模型训练 - 成对排序损失
import torch
import torch.nn.functional as F
def reward_model_loss(reward_chosen, reward_rejected):
"""Bradley-Terry成对排序损失
L = -log(sigmoid(r_chosen - r_rejected))
"""
loss = -F.logsigmoid(reward_chosen - reward_rejected)
return loss.mean()
# 使用TRL的RewardTrainer
from trl import RewardTrainer, RewardConfig
reward_config = RewardConfig(
per_device_train_batch_size=16,
learning_rate=1e-5,
num_train_epochs=1,
max_length=2048,
output_dir='./reward_model_output'
)
trainer = RewardTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=preference_dataset,
args=reward_config
)
trainer.train()
奖励模型的精度对最终效果影响极大。实际训练中,每个提示通常收集4-9个候选回复的排序,通过组合构成K*(K-1)/2个偏好对。奖励模型的输出需要在不同提示间保持可比性,训练数据的多样性和标注质量是关键变量。
阶段三PPO策略优化用奖励信号微调生成策略
PPO(Proximal Policy Optimization)是RLHF第三阶段的核心算法。该阶段将SFT模型作为初始策略,冻结的奖励模型对策略生成的每个回复打分,PPO根据奖励信号更新策略参数,同时通过KL散度惩罚项约束策略不偏离SFT模型过远。
# PPO训练配置
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead
ppo_config = PPOConfig(
model_name='sft_model_path',
learning_rate=1e-6,
batch_size=128,
mini_batch_size=16,
ppo_epochs=4,
kl_coef=0.05,
cliprange=0.2,
vf_coef=0.1,
)
ppo_model = AutoModelForCausalLMWithValueHead.from_pretrained(
ppo_config.model_name
)
ppo_trainer = PPOTrainer(
model=ppo_model,
ref_model=sft_model,
tokenizer=tokenizer,
config=ppo_config,
dataset=ppo_dataset,
)
for epoch in range(num_ppo_epochs):
for batch in ppo_trainer.dataloader:
query_tensors = batch['input_ids']
response_tensors = ppo_trainer.generate(query_tensors, max_new_tokens=512)
rewards = reward_model.score(query_tensors, response_tensors)
stats = ppo_trainer.step(query_tensors, response_tensors, rewards)
KL散度惩罚与奖励作弊防控
RLHF训练中一个普遍问题是奖励作弊(Reward Hacking)——策略模型可能找到奖励模型的高分漏洞,生成人类并不认可的输出。KL散度惩罚项通过约束生成策略与SFT参考模型的分布距离来缓解这一问题:
r_total = r_rm(x, y) – beta * KL(pi_theta || pi_ref)
其中beta控制KL惩罚的强度。beta过大会导致策略几乎不更新,beta过小则无法约束奖励作弊。工程实践中的做法是采用自适应KL控制器:当KL散度超过目标值时增大beta,低于目标值时减小beta。
DPO直接偏好优化RLHF的无RL替代方案
DPO(Direct Preference Optimization)绕开了奖励模型训练和PPO强化学习,直接用偏好数据优化策略模型。DPO的理论推导证明,在 Bradley-Terry偏好模型下,最优策略的闭式解可通过对数比率表达,因此可以直接用偏好对训练策略模型:
# DPO训练
from trl import DPOTrainer, DPOConfig
dpo_config = DPOConfig(
per_device_train_batch_size=4,
learning_rate=5e-7,
beta=0.1,
max_length=2048,
num_train_epochs=1,
output_dir='./dpo_output'
)
dpo_trainer = DPOTrainer(
model=model,
ref_model=sft_model,
tokenizer=tokenizer,
train_dataset=preference_dataset,
args=dpo_config
)
dpo_trainer.train()
DPO的优势在于训练流程大幅简化,不需要单独训练奖励模型,也不需要PPO的复杂超参调节。实测表明,在数据量充足(10万以上偏好对)的条件下,DPO的效果可与PPO版本的RLHF持平。在数据量较小时,PPO+RM方案仍然更稳定。
RLHF实战中的关键调优经验
奖励模型的质量是RLHF效果的天花板。标注团队的质量一致性远比数量重要,4个高质量标注员的效果往往优于20个低质量标注。每个提示收集的候选数建议在4-9个之间,组合出足够多的偏好对。
PPO阶段的超参对训练稳定性影响极大。学习率通常设在1e-6到5e-7之间,比SFT低一个数量级。KL惩罚系数beta建议从0.05开始,配合自适应控制器。训练过程中的奖励曲线和KL曲线需要同时监控,如果奖励持续上升但KL也暴涨,基本可以判断出现了奖励作弊。
评估RLHF效果不应该只看奖励模型的分数,而是要在独立的人类评估集上做side-by-side比较。奖励模型和生成策略之间的分布偏移(Distribution Shift)会导致奖励分数与实际人类偏好的相关性逐渐下降,这正是需要独立评估集的原因。
不同规模模型的RLHF策略差异
7B及以下参数的模型做RLHF时,PPO训练的稳定性较差,容易在训练中途崩溃(loss爆炸或策略退化)。对于小模型,DPO通常是更稳妥的选择。70B以上的模型在PPO训练中表现更稳定,奖励信号能被更有效地利用,但也意味着训练成本更高——70B模型的PPO训练需要至少8张A100-80G。
多轮对话场景的RLHF比单轮对话复杂得多,需要对完整对话历史建模偏好,而非仅对最后一轮回复打分。目前主流做法是将多轮对话拼接为完整序列,奖励模型对整个序列打分,PPO在生成阶段对每一步施加约束。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/rlhf-qiang-hua-xue-xi-ren-lei-fan-kui-dui-qi-xun-lian-quan/