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 的区别

相关推荐
txzrxz14 小时前
单调栈详解(含题目)
数据结构·c++·算法·前缀和·单调栈
人工智能AI技术14 小时前
【Agent从入门到实践】29 开发第一个Agent——需求定义
人工智能·python
爱喝可乐的老王14 小时前
深度学习初认识
人工智能·深度学习
前端达人14 小时前
为什么聪明的工程师都在用TypeScript写AI辅助代码?
前端·javascript·人工智能·typescript·ecmascript
AI科技星14 小时前
张祥前统一场论的数学表述与概念梳理:从几何公设到统一场方程
人工智能·线性代数·算法·机器学习·矩阵·数据挖掘
丝斯201114 小时前
AI学习笔记整理(55)——大模型训练流程
人工智能·笔记·学习
程序员-King.14 小时前
day167—递归—二叉树的直径(LeetCode-543)
算法·leetcode·深度优先·递归
GatiArt雷14 小时前
生成式AI重构开发流程:从工具到生产力的质变之路
人工智能
亲爱的非洲野猪14 小时前
2动态规划进阶:背包问题详解与实战
算法·动态规划·代理模式
迎仔14 小时前
算力中心设备指南 (1):计算单元——从“全能经理”到“暴力施工队”
人工智能