【大模型解惑】大模型如何在 Supervised Fine‑Tuning (SFT) 之后进行 PPO 强化学习微调?

近年来主流的大模型对齐流程已趋于“三段式”:预训练 → 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)。下面给出一篇可落地的实践指南,含完整代码骨架;文末附未来研究方向与优化建议。


目录

  1. 背景与整体流程

  2. PPO 原理速览

  3. 实操环境准备

  4. SFT→PPO 端到端用例(可直接运行)
    4.1 数据与奖励模型
    4.2 训练脚本解析
    4.3 推理与评估

  5. 典型应用案例

  6. 进一步研究方向

  7. 参考链接


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 RLKL 蒸馏、指令插值、TokenSkip 压缩思维链,显著减速耗 (Secrets of RLHF in Large Language Models Part I: PPO - arXiv)
中文公开偏好数据目前仍匮乏;可共建带打分的 ShareGPT-Zh、Ultrachat-Zh 版本
可解释奖励 / 多目标将多维度指标(安全、事实性、情感)线性或层次融合,做向量奖励

7 参考链接

  1. TRL SFTTrainer 文档  (Supervised Fine-tuning Trainer - Hugging Face)

  2. TRL PPOTrainer Quickstart  (PPO Trainer - Hugging Face)

  3. CarperAI trlX 分布式 RLHF  (CarperAI/trlx: A repo for distributed training of language ... - GitHub)

  4. Secrets of RLHF 系统回顾  (Secrets of RLHF in Large Language Models Part I: PPO - arXiv)

  5. Wolfe, PPO for Alignment  (Proximal Policy Optimization (PPO): The Key to LLM Alignment)

  6. InstructGPT 论文  ([2203.02155] Training language models to follow instructions with human feedback)

  7. ChatGLM-RLHF 开源实现  (ChatGLM-6B添加了RLHF的实现,以及部分核心代码的逐行 ... - GitHub)

  8. Hugging Face Reward Modeling 指南  (Reward Modeling - Hugging Face)

  9. PPO 用例讨论串  (Confusing (and possibly misleading) PPO Trainer Code from TRL ...)

  10. Direct Preference Optimization (DPO) 论文  ([2305.18290] Direct Preference Optimization: Your Language Model is Secretly a Reward Model)

  11. Hybrid GRPO 论文  (Hybrid Group Relative Policy Optimization: A Multi-Sample ... - arXiv)

  12. Anthropic Constitutional-AI  (Dario and Daniela Amodei)

  13. Axios 对 InstructGPT 的报道  (An AI to follow instructions)

  14. PPO 教程(CSDN)  (大语言模型-RLHF(四)-PPO(Proximal Policy Optimization)原理 ...)

  15. RLHF 概览博客  (RLHF原理及进化 - 鹤啸九天)

借助上述流程与代码,你可以在个人 GPU 上快速把 SFT 模型升级为 “奖励驱动” 的对齐模型;进一步探索 DPO 或多目标奖励,可继续提升质量与效率。

哈佛博后带小白玩转机器学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值