大模型对齐(Alignment)是使模型的输出更符合人类意图、偏好和价值观的关键步骤。当前主流的对齐方法主要包括以下几种,它们在复杂度、资源需求和效果上各有特点。
1.RLHF(基于人类反馈的强化学习)
人类反馈强化学习(Reinforcement Learning from Human Feedback, RLHF),这是早期且效果显著的方法,被用于训练 InstructGPT 和 ChatGPT。它包含三个阶段:
- 监督微调(SFT):首先,使用一个包含大量"指令-期望输出"对的高质量数据集,对预训练好的基础语言模型进行微调。这一步使模型学会理解并执行人类的指令,为其后续的对齐打下基础。
- 奖励模型(RM)训练:这是RLHF的核心环节。收集大量人类对模型生成的多个回复进行偏好排序的数据(例如,人类判断哪个回复更好、更安全、更有帮助)。利用这些偏好数据,训练一个独立的奖励模型(Reward Model)。这个模型的任务是学习预测人类对任何给定回复的偏好程度,并为其打一个分数。
- 强化学习优化(PPO):将经过监督微调的模型视为一个"策略"(Policy)。使用强化学习算法(最常用的是近端策略优化,PPO)来优化这个策略。在训练过程中,模型生成回复,奖励模型会为这些回复打分。强化学习算法的目标是最大化模型生成回复的预期奖励(即让奖励模型打高分),同时通过一个KL惩罚项来防止模型的策略与原始的监督微调模型偏离太远,从而保持模型的稳定性和泛化能力。
简而言之,RLHF通过"人类评估 -> 训练奖励模型 -> 用奖励模型指导模型优化"的闭环,让模型学会"讨好"人类的偏好。
RLHF 的痛点
RLHF 能达到较高的对齐质量,但训练过程复杂,需要同时维护多个模型副本,显存开销大,对算力要求极高。
RLHF 效果强,但也很"重":
- 流程复杂:要三步训练,特别是强化学习(PPO)部分非常难调;
- 不稳定:奖励模型噪声会导致训练不收敛;
- 成本高:每次都要采样、评估、梯度更新,计算量巨大;
- 不可控性:有时候模型会学会"讨好"奖励模型,而非真正遵循人类偏好(Reward Hacking)。

强化学习的基本概念
要理解RLHF,首先需要了解强化学习(Reinforcement Learning, RL)的基本概念。强化学习是一种通过与环境互动来学习最优行为的机器学习范式。
强化学习系统通常包含以下核心组件: - 智能体(Agent):执行动作并从环境中学习的实体
- 环境(Environment):智能体所处的外部环境,能够接收智能体的动作并返回状态和奖励
- 状态(State):环境在某一时刻的表示
- 动作(Action):智能体可以执行的行为
- 奖励(Reward):环境对智能体动作的反馈信号
- 策略(Policy):智能体从状态到动作的映射函数
强化学习的目标 是学习一个最优策略π*,使得智能体在与环境交互过程中获得的累积奖励最大化:

价值函数与策略梯度
在强化学习中,常用的优化方法包括基于价值函数的方法(如Q-learning)和基于策略梯度的方法。对于大语言模型的RLHF,策略梯度方法更为常用,因为它能够直接优化策略,而不需要显式地学习价值函数。
策略梯度方法的核心思想是通过调整策略参数,使得累积奖励的期望增加。
人类反馈的类型
在RLHF中,常见的人类反馈类型包括:
- 比较反馈(Comparative Feedback):人类评估者对多个模型输出进行比较,指出哪个更好
- 评分反馈(Rating Feedback):人类评估者为模型输出分配一个数值评分
- 纠正反馈(Corrective Feedback):人类评估者直接修改或提供更好的输出
- 偏好排序(Preference Ranking):人类评估者对多个输出进行排序
RLHF的数学模型
RLHF可以看作是传统强化学习的一个扩展,其核心区别在于奖励信号的来源。在RLHF中,我们首先训练一个奖励模型(Reward Model, RM)来预测人类的偏好,然后使用这个奖励模型来指导策略的优化。

RLHF的实现流程
参考链接:https://developer.aliyun.com/article/1684041
RLHF是一个多阶段的复杂过程,通常包括以下四个主要步骤:
- 预训练模型选择与准备
- 模型架构与规模:不同的模型架构(如Transformer、GPT、LLaMA等)在RLHF中的表现可能有所不同。模型规模(参数量)也是一个重要考量因素,更大的模型通常具有更强的学习能力,但也需要更多的计算资源。
- 预训练数据质量:预训练数据的质量对最终模型性能有重要影响。优质的预训练数据应具有多样性、准确性和代表性。
- 模型准备步骤:
- 模型加载与配置:加载预训练权重并配置模型参数
- 分词器设置:确保分词器与模型兼容,并设置适当的特殊标记
- 设备分配:根据可用硬件资源,将模型分配到合适的计算设备上
- 监督微调(Supervised Fine-Tuning, SFT)
监督微调是RLHF流程的第一步,其目标是让模型学习基本的任务格式和指令遵循能力。- SFT数据集构建:SFT数据集通常包含高质量的指令-响应对,这些数据可以来自:人工编写的高质量示例;公开的指令微调数据集(如Alpaca、ShareGPT等);从人类评估者那里收集的示范;通过自指导(Self-Instruct)方法生成的数据
- SFT实现方法:
- 数据预处理:格式化数据以适应模型输入要求
- 模型训练:使用监督学习方法训练模型
- 模型评估:评估模型在验证集上的性能
- 模型保存:保存微调后的模型权重
- 以下是使用HuggingFace Transformers库实现SFT的示例代码:
python
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from datasets import load_dataset
def sft_training(model_name, dataset_path, output_dir):
# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 加载数据集
dataset = load_dataset("json", data_files=dataset_path)
# 数据预处理函数
def preprocess_function(examples):
texts = [f"### 指令:\n{instruction}\n### 回答:\n{output}"
for instruction, output in zip(examples["instruction"], examples["output"])]
return tokenizer(texts, truncation=True, max_length=1024)
# 预处理数据集
tokenized_dataset = dataset.map(preprocess_function, batched=True)
# 设置训练参数
training_args = TrainingArguments(
output_dir=output_dir,
learning_rate=2e-5,
per_device_train_batch_size=4,
per_device_eval_batch_size=4,
num_train_epochs=3,
weight_decay=0.01,
evaluation_strategy="steps",
save_steps=500,
eval_steps=500,
)
# 创建训练器
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"],
eval_dataset=tokenized_dataset["test"] if "test" in tokenized_dataset else None,
tokenizer=tokenizer,
)
# 开始训练
trainer.train()
# 保存模型
trainer.save_model(output_dir)
return model
- 奖励模型(Reward Model, RM)训练
奖励模型是RLHF的核心组件,它负责将人类偏好转换为可用于强化学习的数值奖励信号。- 人类偏好数据收集:收集人类偏好数据是训练奖励模型的关键步骤。常见的数据收集方法包括:
- 比较排序:让人类评估者对多个模型输出进行排序
- 两两比较:让人类评估者比较两个模型输出,选择更好的一个
- 评分系统:让人类评估者为模型输出打分(如1-10分)
- 奖励模型架构设计:奖励模型通常采用与基础语言模型相似的架构,但最后一层被替换为输出标量奖励的层。常见的奖励模型架构包括:
- 基于分类头的架构:在语言模型顶部添加一个线性层,输出单个标量值
- 基于对比学习的架构:学习区分好/坏输出的嵌入空间
- 多任务奖励模型:同时预测多个维度的奖励(如有用性、安全性等)
- 奖励模型训练方法:训练奖励模型的常用方法是基于比较学习的方法。给定一个输入x和两个输出y1、y2,如果人类评估者认为y1比y2好,我们希望奖励模型满足f(x,y1) > f(x,y2)。
- 以下是训练奖励模型的示例代码:
- 人类偏好数据收集:收集人类偏好数据是训练奖励模型的关键步骤。常见的数据收集方法包括:
python
from transformers import AutoModelForSequenceClassification, AutoTokenizer, TrainingArguments, Trainer
from datasets import load_dataset
import torch
def train_reward_model(base_model_name, preference_data_path, output_dir):
# 加载模型和分词器
model = AutoModelForSequenceClassification.from_pretrained(
base_model_name,
num_labels=1, # 输出单个标量奖励
problem_type="regression"
)
tokenizer = AutoTokenizer.from_pretrained(base_model_name)
# 加载偏好数据集
dataset = load_dataset("json", data_files=preference_data_path)
# 数据预处理函数
def preprocess_function(examples):
# 假设数据格式为{"prompt": "...", "chosen": "...", "rejected": "..."}
chosen_inputs = tokenizer(
[f"{prompt}{chosen}" for prompt, chosen in zip(examples["prompt"], examples["chosen"])],
truncation=True,
max_length=1024
)
rejected_inputs = tokenizer(
[f"{prompt}{rejected}" for prompt, rejected in zip(examples["prompt"], examples["rejected"])],
truncation=True,
max_length=1024
)
# 合并数据
inputs = {
}
for key in chosen_inputs:
inputs[f"{key}_chosen"] = chosen_inputs[key]
inputs[f"{key}_rejected"] = rejected_inputs[key]
return inputs
# 预处理数据集
tokenized_dataset = dataset.map(preprocess_function, batched=True)
# 定义对比损失函数
class RewardModelTrainer(Trainer):
def compute_loss(self, model, inputs, return_outputs=False):
# 提取chosen和rejected数据
chosen_input_ids = inputs.pop("input_ids_chosen")
chosen_attention_mask = inputs.pop("attention_mask_chosen")
rejected_input_ids = inputs.pop("input_ids_rejected")
rejected_attention_mask = inputs.pop("attention_mask_rejected")
# 获取chosen和rejected的奖励
chosen_outputs = model(
input_ids=chosen_input_ids,
attention_mask=chosen_attention_mask
)
chosen_rewards = chosen_outputs.logits.squeeze(-1)
rejected_outputs = model(
input_ids=rejected_input_ids,
attention_mask=rejected_attention_mask
)
rejected_rewards = rejected_outputs.logits.squeeze(-1)
# 计算对比损失
# 我们希望chosen_rewards > rejected_rewards
loss = -torch.nn.functional.logsigmoid(chosen_rewards - rejected_rewards).mean()
return (loss, chosen_outputs) if return_outputs else loss
# 设置训练参数
training_args = TrainingArguments(
output_dir=output_dir,
learning_rate=1e-5,
per_device_train_batch_size=4,
per_device_eval_batch_size=4,
num_train_epochs=3,
weight_decay=0.01,
evaluation_strategy="steps",
save_steps=500,
eval_steps=500,
)
# 创建自定义训练器
trainer = RewardModelTrainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"],
eval_dataset=tokenized_dataset["test"] if "test" in tokenized_dataset else None,
tokenizer=tokenizer,
)
# 开始训练
trainer.train()
# 保存模型
trainer.save_model(output_dir)
return model
- 强化学习优化(通常使用PPO算法)
在获得奖励模型后,我们使用强化学习算法(通常是PPO)对SFT模型进行进一步优化,使其输出更符合人类偏好。- PPO算法原理:近端策略优化(Proximal Policy Optimization, PPO)是一种流行的策略梯度算法,它通过限制策略更新的幅度,确保训练的稳定性。
- RLHF中的PPO实现:在RLHF中应用PPO时,需要考虑以下特殊因素:
- 参考模型:通常使用SFT模型作为参考模型,以限制策略偏离
- KL散度惩罚:为了防止模型输出过于偏离原始分布,通常会添加KL散度惩罚
- 值函数估计:使用值函数或广义优势估计(GAE)来估计优势函数
- 混合奖励:可以结合奖励模型的奖励和其他辅助奖励(如长度惩罚)
- 以下是在RLHF中应用PPO的示例代码:
python
from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import PPOTrainer, PPOConfig
from peft import LoraConfig, get_peft_model
import torch
def rlhf_ppo_training(sft_model_path, reward_model_path, dataset_path, output_dir):
# 加载SFT模型和分词器
model = AutoModelForCausalLM.from_pretrained(sft_model_path)
tokenizer = AutoTokenizer.from_pretrained(sft_model_path)
# 加载奖励模型
reward_model = AutoModelForSequenceClassification.from_pretrained(reward_model_path, num_labels=1)
# 可选:使用LoRA进行参数高效微调
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
# 加载数据集
dataset = load_dataset("json", data_files=dataset_path)
# 设置PPO配置
ppo_config = PPOConfig(
model_name=sft_model_path,
learning_rate=1e-5,
batch_size=4,
mini_batch_size=2,
gradient_accumulation_steps=4,
optimize_cuda_cache=True,
early_stopping=False,
target_kl=0.1,
kl_penalty="kl",
seed=42,
)
# 定义奖励函数
def reward_fn(samples, outputs):
# 将样本和输出格式化为奖励模型的输入
texts = [f"{sample['prompt']}{output['response']}" for sample, output in zip(samples, outputs)]
inputs = tokenizer(texts, padding=True, truncation=True, max_length=1024, return_tensors="pt")
# 移动到正确的设备
inputs = {
k: v.to(reward_model.device) for k, v in inputs.items()}
# 获取奖励
with torch.no_grad():
rewards = reward_model(**inputs).logits.squeeze(-1)
return rewards
# 创建PPO训练器
ppo_trainer = PPOTrainer(
model=model,
ref_model=None, # 使用当前模型作为参考
tokenizer=tokenizer,
args=ppo_config,
dataset=dataset["train"],
data_collator=lambda x: x,
tokenizer_kwargs={
"truncation": True, "max_length": 1024},
)
# 开始PPO训练
for epoch in range(3):
for batch in ppo_trainer.dataloader:
# 生成响应
response_tensors = []
for prompt in batch:
input_ids = tokenizer(prompt["prompt"], return_tensors="pt").input_ids.to(model.device)
response = model.generate(
input_ids=input_ids,
max_new_tokens=128,
temperature=0.7,
do_sample=True,
)
response_tensors.append(response.squeeze())
# 计算奖励
texts = [tokenizer.decode(response) for response in response_tensors]
rewards = reward_fn(batch, [{
"response": text} for text in texts])
# 执行PPO步骤
stats = ppo_trainer.step(batch, response_tensors, rewards)
ppo_trainer.log_stats(stats, batch, rewards)
# 保存模型
ppo_trainer.save_pretrained(output_dir)
return model
RLHF的完整工作流
将以上四个步骤整合起来,RLHF的完整工作流如下:
预训练模型 → 监督微调(SFT) → 生成候选输出 → 人类偏好标注 → 奖励模型训练 → PPO优化 → 对齐模型
在实际应用中,这一流程可能需要多次迭代,以不断改进模型性能。此外,还需要监控训练过程中的各种指标,如奖励值、KL散度、模型输出质量等,以确保训练的稳定性和有效性。
2.DPO(直接偏好优化)
DPO 是一种更简洁高效的替代方案,它跳过了显式训练奖励模型的步骤。DPO 不用训练奖励模型,也不用强化学习,而是直接在原始语言模型上优化人类偏好。2023 年,Anthropic 提出了 DPO(Direct Preference Optimization),它一出现就成了替代 RLHF 的轻量方案。
- 其核心思想是:DPO通过数学变换将传统的基于人类反馈的强化学习(RLHF)中的奖励建模和策略优化合并为一个单阶段的分类问题,直接使用标注的偏好数据(如"好答案"和"坏答案")来训练模型。
- 相比 RLHF,DPO 只需训练一个模型,训练过程更稳定,显存需求更低,且避免了奖励模型可能存在的偏差或"奖励黑客"问题(如模型为获取高分而生成冗长无用的回答)。
- 对于中小团队或资源有限的场景,DPO 被认为是当前性价比最高的对齐方法。
主要特点
- 端到端可训练:不需要单独的奖励模型,也不需要强化学习框架,直接基于语言建模损失优化即可,简化了流程。
- 计算成本低:由于是单阶段训练且无需复杂强化学习迭代,DPO的计算开销较小。
- 训练稳定性高:避免了策略梯度方差问题,训练过程更稳定。
正因如此,现在大多数开源模型都采用 SFT + DPO 流程,既能获得接近 RLHF 的效果,又节省了大部分训练成本。
与RLHF对比
- 训练流程:DPO是单阶段优化,而RLHF需要两阶段(奖励模型训练+强化学习)。
- 数据依赖:DPO直接依赖标注偏好数据的质量,而RLHF的奖励模型可以部分泛化噪声。
- 灵活性:DPO的偏好建模相对静态,RLHF支持动态调整奖励函数。
其核心原理可概括为以下几点:
- 直接优化目标模型:DPO跳过了传统RLHF(基于人类反馈的强化学习)中训练奖励模型和使用PPO(近端策略优化)强化学习的复杂步骤。它直接利用人类标注的偏好数据(即对于同一提示,哪个回答更受青睐)来优化目标模型的参数。
- 基于偏好数据的损失函数:DPO的数学原理源于对原始偏好对齐优化目标的推导。它将模型参数更新的目标转化为一个可以直接通过监督式微调(SFT)方式实现的损失函数。该损失函数的核心是比较模型对偏好回答(chosen response)和拒绝回答(rejected response)的对数概率差异,并引入一个温度参数β来控制对齐的强度。
- 引入参考模型以稳定训练:DPO在优化过程中会使用一个参考模型(通常是监督微调SFT后的模型),其作用类似于RLHF中的KL散度惩罚项。这有助于防止训练后的模型参数与参考模型偏离过大,从而避免模型性能退化或输出变得不稳定。
总而言之,DPO通过一个精巧的数学转换,将复杂的偏好对齐问题简化为一个直接优化问题,显著提高了训练的稳定性和效率。
3.KTO(基于心理学的对齐方法)
KTO 是一种较新的方法,其设计灵感来源于心理学中的"损失厌恶"理论(即人们对损失的敏感度高于对等量收益的敏感度)。
- 它使用单条标注数据({问题, 回答, 标签(+1/-1)}),其中 +1 表示"偏好",-1 表示"不偏好"。
- KTO 在优化时对"不偏好"样本施加更强的惩罚,从而更有效地抑制有害或不相关的行为,同时对"偏好"样本的奖励相对温和。
- 这种"重罚轻赏"的机制使其在低数据量下也能表现良好,训练门槛更低,适合对安全性要求高但标注数据有限的场景。
4.RRHF(基于排序的奖励人类反馈)
RRHF 是一种介于监督微调和强化学习之间的方法。
它通过收集来自不同来源(如模型自身、其他大模型、人类专家)的响应,并对这些响应进行排序,然后使用排序损失函数直接优化模型。
与 RLHF 相比,RRHF 不需要复杂的 PPO 算法,通常只需 1-2 个模型,训练更稳定,且在部分基准测试上能与 PPO 性能持平。

综上,DPO 因其高效与易用性,已成为当前最热门的对齐方案;而 RLHF 仍是性能上限的标杆;KTO 和 RRHF 则为不同资源约束下的场景提供了有价值的替代路径。
DeepSeek中的强化学习训练
传统大模型的训练依赖海量文本的统计规律学习,本质是模式匹配的"记忆式学习"。例如,GPT系列通过预测下一个单词完成训练,但在需要多步逻辑推导的场景(如数学证明、因果分析)中表现乏力。DeepSeek的核心突破在于将强化学习(Reinforcement Learning, RL)引入模型训练,通过构建"环境-动作-奖励"的闭环,让模型在试错中主动构建推理路径。
DeepSeek的推理训练框架可抽象为马尔可夫决策过程(MDP)模型:
- 状态(State):当前输入的文本上下文(如待解答的数学题)
- 动作(Action):模型生成的下一个token或推理步骤
- 奖励函数(Reward):基于逻辑正确性、连贯性等指标的反馈信号
奖励函数的创新设计:多维度反馈机制
DeepSeek的奖励函数突破了传统"正确/错误"的二元评价,引入分层奖励:
- 基础奖励:答案的最终正确性(如数学题结果是否匹配)
- 过程奖励:中间步骤的逻辑合理性(如是否引用已知条件)
- 效率奖励:推理路径的简洁性(如避免冗余计算)
DeepSeek的强化学习训练框架:三阶段迭代优化
阶段一 :监督微调(SFT)构建基础能力
在强化学习前,DeepSeek首先通过监督微调让模型具备基础的语言理解和生成能力。此阶段使用高质量的推理数据集(如数学证明、逻辑谜题),通过交叉熵损失优化模型参数。
关键技术点:
- 数据增强:对同一问题生成多种解题路径,增加模型对不同推理方式的适应性
- 长文本建模:采用Transformer-XL架构处理超长上下文,避免中间步骤丢失
阶段二 :近端策略优化(PPO)实现策略迭代
PPO算法是DeepSeek强化学习的核心,其优势在于平衡探索与利用:
- 策略网络(Actor):生成推理步骤的候选方案
- 价值网络(Critic):评估当前状态的价值,指导策略更新
训练流程:
- 模型根据输入问题生成多个推理路径
- 价值网络评估各路径的预期奖励
- 策略网络根据评估结果调整生成概率
- 重复迭代直至收敛
阶段三 :人类反馈强化学习(RLHF)对齐人类价值观
为避免模型生成"技术正确但不符合常识"的推理(如用物理定律证明魔法存在),DeepSeek引入人类反馈:
- 偏好排序:让标注员对不同推理路径进行排序
- 奖励建模:训练一个奖励模型拟合人类偏好
- 策略优化:基于拟合的奖励函数进一步微调模型