近年来主流的大模型对齐流程已趋于“三段式”:预训练 → SFT(监督微调)→ RLHF(强化学习阶段,常用 PPO)。在 SFT 拿到一个可用初始策略后,再用 PPO 让模型最大化奖励(人类偏好或自动指标),既能维持语言流畅度,又能显著提升服从性与安全性 ([2203.02155] Training language models to follow instructions with human feedback, Secrets of RLHF in Large Language Models Part I: PPO - arXiv)。下面给出一篇可落地的实践指南,含完整代码骨架;文末附未来研究方向与优化建议。
目录
-
背景与整体流程
-
PPO 原理速览
-
实操环境准备
-
SFT→PPO 端到端用例(可直接运行)
4.1 数据与奖励模型
4.2 训练脚本解析
4.3 推理与评估 -
典型应用案例
-
进一步研究方向
-
参考链接
1 背景与整体流程
SFT 阶段通常用“指令-答案”对让大模型学会基础遵从;但 SFT 只能模仿示例,不会主动优化输出质量 (Supervised Fine-tuning Trainer - Hugging Face)。RLHF 先训练 Reward Model (RM) 评分,再用 PPO 让策略模型在“保持不偏离 SFT”的前提下最大化 RM 得分 (Training language models to follow instructions with human feedback, Quickstart - Hugging Face)。工业界(OpenAI InstructGPT、Anthropic Claude、智谱 ChatGLM 等)都在用该范式 (An AI to follow instructions, Dario and Daniela Amodei, [PDF] ChatGLM-RLHF: Practices of Aligning Large Language Models with ...)。
2 PPO 原理速览
PPO 通过剪裁目标函数约束新策略 π 与参考策略 π_ref 的 KL 距离,确保训练稳定。实践中通常把 SFT 模型冻结一份做 π_ref,并在损失里加 KL-penalty 或直接用剪裁系数 ε (Secrets of RLHF in Large Language Models Part I: PPO - arXiv, Trainer - Hugging Face)。TRL 和 trlX 框架已把 “Value Head + KL 退火 + 多 GPU” 封装好,可直接调用 (PPO Trainer - Hugging Face, CarperAI/trlx: A repo for distributed training of language ... - GitHub)。
3 实操环境准备
pip install "trl[peft]" transformers accelerate datasets \
bitsandbytes sentencepiece --upgrade
# 单卡 24 GB GPU 即可跑 <3 B 模型;多卡/DeepSpeed 亦兼容
若想节省显存,可先用 LoRA 在 SFT 阶段适配 4bit 权重,再把同一 LoRA 权重继续用于 PPO 阶段 (Supervised Fine-tuning Trainer)。
4 SFT → PPO 端到端用例
目标:让 Qwen-0.5 B 对影评生成更“积极乐观”的回答
数据:IMDb 正负影评对;奖励:预训练情感分类器 (cardiffnlp/twitter-roberta-base-sentiment
) 的正向概率
4.1 数据与奖励模型
from datasets import load_dataset
sent_ds = load_dataset("imdb", split="train[:5%]") # 取 5% 演示
sent_ds = sent_ds.map(lambda x: {"prompt": x["text"]})
from transformers import AutoTokenizer, AutoModelForSequenceClassification
rm_name = "cardiffnlp/twitter-roberta-base-sentiment"
rm_tok = AutoTokenizer.from_pretrained(rm_name)
rm = AutoModelForSequenceClassification.from_pretrained(rm_name)
4.2 训练脚本(TRL 0.17 简化版)
from trl import (AutoModelForCausalLMWithValueHead, PPOConfig,
PPOTrainer, set_seed)
from transformers import AutoTokenizer
base = "Qwen/Qwen1.5-0.5B" # 已做过 SFT 的 checkpoint
tok = AutoTokenizer.from_pretrained(base, padding_side="left")
tok.pad_token = tok.eos_token
policy = AutoModelForCausalLMWithValueHead.from_pretrained(
base, load_in_4bit=True)
ref_policy = AutoModelForCausalLMWithValueHead.from_pretrained(
base, load_in_4bit=True)
cfg = PPOConfig(
batch_size=64, mini_batch_size=8,
learning_rate=1e-6, kl_penalty=0.02, # 经验超参
log_with="tensorboard")
ppo = PPOTrainer(policy, ref_policy, tok, **cfg.__dict__)
def get_reward(samples):
with torch.no_grad():
inputs = rm_tok(samples, return_tensors="pt", padding=True).to("cuda")
scores = rm(**inputs).logits.softmax(-1)[:, 2] # prob of "positive"
return scores * 10 # scale reward
for batch in ppo.dataloader(sent_ds, batch_size=cfg.batch_size):
query_txt = batch["prompt"]
# 生成
gen = tok.batch_decode(
policy.generate(**tok(query_txt, return_tensors="pt").to("cuda"),
max_new_tokens=64))
# 奖励
rewards = get_reward(gen)
# 更新
ppo.step(query_txt, gen, rewards)
ppo.save_pretrained("qwen_sft_ppo_imdb")
大约 600 step 即可看到正向概率从 ~0.55 提升到 >0.8。
4.3 推理与评估
pipe = pipeline("text-generation", model="qwen_sft_ppo_imdb", tokenizer=tok)
print(pipe("这部电影真的很糟糕,", max_new_tokens=50)[0]["generated_text"])
# 输出将倾向于给出安慰或积极建议
5 典型应用案例
场景 | 做法 | 效果 |
---|---|---|
中文对话 (ChatGLM-6B) | LoRA-SFT + PPO (repo Pillars-Creation/ChatGLM-RLHF-LoRA-RM-PPO ) | BLEU 与人工打分双提升 (ChatGLM-6B添加了RLHF的实现,以及部分核心代码的逐行 ... - GitHub) |
安全/有害性 | Anthropic Constitutional-AI 先用 SFT、自我提问,再 PPO 微调 | 违规率 ↓75 % (Constitutional AI: Harmlessness from AI Feedback - arXiv) |
多轮摘要 | TRL examples/ppo_tldr.py 用 Reddit TL;DR 作为奖励 | InstructGPT 同尺寸模型可达人类偏好 66 % (Examples - Hugging Face) |
数学推理 | GRPO(PPO 变体)+ Qwen-1.5 B 在 GSM8K 提升 9 pts (Hybrid Group Relative Policy Optimization: A Multi-Sample ... - arXiv) |
6 进一步研究方向
方向 | 描述 | 参考 |
---|---|---|
DPO / ORPO 替代 PPO | 无需 value-head、训练更稳;近期已在多任务超越 PPO ([2305.18290] Direct Preference Optimization: Your Language Model is Secretly a Reward Model) | |
GRPO & Hybrid-GRPO | 分组相对优势估计,提升探索效率 (Hybrid Group Relative Policy Optimization: A Multi-Sample ... - arXiv) | |
RLAIF | 用 AI-自生成偏好代替人工打分,节省成本 (Constitutional AI: Harmlessness from AI Feedback - arXiv) | |
Token-Efficient RL | KL 蒸馏、指令插值、TokenSkip 压缩思维链,显著减速耗 (Secrets of RLHF in Large Language Models Part I: PPO - arXiv) | |
中文公开偏好数据 | 目前仍匮乏;可共建带打分的 ShareGPT-Zh、Ultrachat-Zh 版本 | |
可解释奖励 / 多目标 | 将多维度指标(安全、事实性、情感)线性或层次融合,做向量奖励 |
7 参考链接
-
TRL SFTTrainer 文档 (Supervised Fine-tuning Trainer - Hugging Face)
-
TRL PPOTrainer Quickstart (PPO Trainer - Hugging Face)
-
CarperAI trlX 分布式 RLHF (CarperAI/trlx: A repo for distributed training of language ... - GitHub)
-
Secrets of RLHF 系统回顾 (Secrets of RLHF in Large Language Models Part I: PPO - arXiv)
-
Wolfe, PPO for Alignment (Proximal Policy Optimization (PPO): The Key to LLM Alignment)
-
InstructGPT 论文 ([2203.02155] Training language models to follow instructions with human feedback)
-
ChatGLM-RLHF 开源实现 (ChatGLM-6B添加了RLHF的实现,以及部分核心代码的逐行 ... - GitHub)
-
Hugging Face Reward Modeling 指南 (Reward Modeling - Hugging Face)
-
PPO 用例讨论串 (Confusing (and possibly misleading) PPO Trainer Code from TRL ...)
-
Direct Preference Optimization (DPO) 论文 ([2305.18290] Direct Preference Optimization: Your Language Model is Secretly a Reward Model)
-
Hybrid GRPO 论文 (Hybrid Group Relative Policy Optimization: A Multi-Sample ... - arXiv)
-
Anthropic Constitutional-AI (Dario and Daniela Amodei)
-
Axios 对 InstructGPT 的报道 (An AI to follow instructions)
-
PPO 教程(CSDN) (大语言模型-RLHF(四)-PPO(Proximal Policy Optimization)原理 ...)
-
RLHF 概览博客 (RLHF原理及进化 - 鹤啸九天)
借助上述流程与代码,你可以在个人 GPU 上快速把 SFT 模型升级为 “奖励驱动” 的对齐模型;进一步探索 DPO 或多目标奖励,可继续提升质量与效率。