LLM对齐核心:RLHF 从基础到实践全解析

二、RLHF

1. RLHF 基础概念

RLHF (Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)是一种通过人类偏好反馈来优化大语言模型的技术框架。其核心目标是让模型输出更安全 (safe)、有帮助 (helpful)且符合人类价值观

典型应用模型:ChatGPT、LLaMA-3、Qwen2、DeepSeek-R1 等在对齐(alignment)阶段广泛使用。

主要模块及流程(三阶段,面试必背)

  1. SFT (Supervised Fine-Tuning,有监督微调)

    使用指令-回答对 数据集对预训练模型进行微调,让模型学会遵循指令

    涉及模块:

    • 数据加载器
    • LoRA / PEFT 适配器
    • Trainer 优化器
  2. Reward Model(RM,奖励模型)

    基于偏好数据集 训练一个分类或回归模型,学习给人类偏好的回答打分。

    涉及模块:

    • SequenceClassification 头
    • 偏好损失函数(通常基于 Bradley-Terry 模型)
  3. PPO (Proximal Policy Optimization,近端策略优化)

    以 RM 作为奖励信号,通过强化学习迭代优化策略模型(即语言模型本身)。

    涉及模块:

    • 策略模型(Actor)
    • 参考模型(用于 KL 惩罚)
    • 价值函数(Critic)
    • 在线采样器

整体流程

SFT 提供初始基线 → RM 捕捉人类偏好 → PPO 闭环迭代优化

常结合 Qwen / DeepSeek 的 MoE 架构,进一步提升多语言、长上下文对齐效果。

2. RLHF 和 DPO 的区别

RLHF vs DPO(Direct Preference Optimization)

相似点

两者都利用偏好数据集来进行模型对齐,弥补纯 SFT 的局限性。

主要差异

方面 RLHF(带 PPO) DPO
训练方式 在线采样(生成新响应) 离线优化
是否需要 RM 需要独立的奖励模型 不需要 RM
是否需要 PPO 需要 PPO 进行强化学习 直接用偏好对计算损失
计算成本 较高、不稳定 更稳定、训练更快
探索能力 强(能探索新响应) 较弱(依赖已有数据)
典型代表 DeepSeek-R1 Qwen2.5(常用 DPO 变体如 SimPO)
优缺点总结 上限高,但易模式崩溃(可加 KL 惩罚缓解) 简单高效,但对数据质量敏感

简单一句话总结

DPO 是一种"更直接"的对齐方法,它跳过了奖励模型这一中间步骤,直接根据人类偏好数据优化语言模型。

与其他 RL 方法对比

  • PPO vs REINFORCE:PPO 引入 clipping 机制,梯度更稳定,避免大更新导致训练崩溃。
  • RLHF vs RLAIF (RL from AI Feedback):
    RLHF 使用真人反馈,质量高但成本高;
    RLAIF 使用强模型(如 GPT-4)合成反馈,成本低但可能引入偏差。

参考https://deepseek.csdn.net/68425033965a29319f2524fd.html

3. RLHF 数据集类型

  • 偏好数据集(Preference Dataset):每条数据包含 prompt + chosen(更好回答)+ rejected(较差回答)
  • 纯 Prompt 数据集:仅包含 prompt,用于 PPO 在线采样生成新回答
  • SFT 数据集:指令-回答对,用于初始监督微调

4. 代码实现(基于 Hugging Face TRL 库)

常用于 Qwen / DeepSeek 模型,面试代码题高频出现。

奖励模型(RM)训练代码

python 复制代码
from trl import RewardTrainer, RewardConfig
from transformers import AutoModelForSequenceClassification

reward_model = AutoModelForSequenceClassification.from_pretrained(
    "Qwen/Qwen2-7B", 
    num_labels=1
)

trainer = RewardTrainer(
    model=reward_model,
    args=RewardConfig(output_dir="./rm"),
    train_dataset=preference_dataset,  # 格式:{prompt, chosen, rejected}
    tokenizer=tokenizer
)

trainer.train()

PPO 训练代码

python 复制代码
from trl import PPOTrainer, PPOConfig
from transformers import AutoModelForCausalLM

ppo_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-7B")

ppo_trainer = PPOTrainer(
    model=ppo_model,                    # 需要优化的模型
    ref_model=sft_model,                # SFT 后的模型,用于 KL 惩罚
    reward_model=reward_model,          # 已训练好的奖励模型
    tokenizer=tokenizer,
    dataset=prompt_only_dataset,        # 只含 prompt 的数据集
    config=PPOConfig(batch_size=64, ppo_epochs=4)
)

ppo_trainer.train()

优化建议:

结合 LoRA / QLoRA 大幅降低显存占用

面试可能考点:手写 PPO 损失函数、数据加载逻辑等

5. RLHF 相关面试高频 Q&A(点对点)

Q: RLHF 为什么分为三个阶段?

A: SFT 打基础(学会指令跟随);RM 学习人类偏好(打分);PPO 迭代优化(探索更高奖励响应)。三者缺一不可,避免直接 RL 的低效。

Q: 为什么奖励模型(RM)不直接用来生成文本?

A: RM 是分类/回归模型,只负责打分,没有自回归生成能力;强行用于生成容易导致分布偏移和模型崩坏。

Q: PPO 为什么使用纯 prompt 数据集?

A: 需要在线采样生成全新响应以实现探索;如果带固定回答,会导致过拟合,失去强化学习的效果。

Q: DPO 相比 RLHF 的优势是什么?

A: DPO 无需训练 RM 和 PPO,训练更稳定、速度更快;RLHF 探索能力更强,但计算成本高。Qwen2 系列倾向使用 DPO 简化流程。

Q: PPO 中 KL 散度起什么作用?

A: 防止策略模型偏离参考模型(通常是 SFT 模型)太远,缓解模式崩溃问题。

代码体现:loss = -clipped_surrogate + value_loss + entropy - beta * kl_div

Q: DeepSeek-R1 是如何使用 RLHF 的?

A: 在 MoE 架构下使用 PPO 优化多语言偏好;数据集合成 + 人工标注结合,重点对齐长程推理能力。

参考文章:

1、DPO PPO GRPO RLHF 的区别

相关推荐
iAkuya1 天前
(leetcode)力扣100 31K个一组翻转链表(模拟)
算法·leetcode·链表
编程饭碗1 天前
【Java 类的完整组成】
java·开发语言·python
西瓜情怀总是籽1 天前
回首2025,抬眸2026
人工智能
nwsuaf_huasir1 天前
适合一维信号时间序列分割与窗口检测的问题的深度神经网络架构
人工智能·神经网络·dnn
铭哥的编程日记1 天前
二叉树遍历的递归和非递归版本(所有题型)
算法
&永恒的星河&1 天前
告别过时预测!最新时序新SOTA:TimeFilter教会模型“选择性失明”
人工智能·深度学习·算法·时序预测·timefilter·时序算法
DLite1 天前
Python静态类型设计:语法割裂的槽点
开发语言·python
闻缺陷则喜何志丹1 天前
【二分查找】P9029 [COCI 2022/2023 #1] Čokolade|普及+
c++·算法·二分查找·洛谷
2501_921649491 天前
如何获取外汇实时数据:全球货币行情对接指南
后端·python·websocket·金融·区块链