大模型从0到1|第十五课:详解SFT、RLHF
大模型从0到1|第十五课:详解SFT、RLHF
课程核心:本节课深入讲解大模型“对齐”(Alignment)的全流程。从如何通过SFT(监督微调)让模型学会说话,到如何通过RLHF(PPO/DPO)让模型符合人类价值观。
Part 1: 对齐的背景与 SFT (监督微调)

第15讲:RLHF / Alignment (对齐)
本节课的主题是“对齐”,即如何控制大语言模型的行为,使其符合用户的意图。

目前的课程进度
我们已经完成了预训练(Pre-training),得到了像 GPT-3 这样的基座模型。但基座模型的问题在于它只是一个“续写机”。
- 左图:Glossier 的产品描述。
- 右图:如果你给 GPT-3 一个指令,它可能会续写一段广告而不是回答问题。我们需要 InstructGPT 这样的流程来修复它。

指令遵循 (Instruction Following) 是强大的控制形式
我们希望模型能精确执行复杂的约束。
- 例子:要求 GPT-4 用 Python 画图,并指定具体的坐标轴标签、动画效果。模型能完美执行这些非自然的格式要求。

安全与内容审核
除了有用性,我们还需要控制模型的安全性。
- 例子:当用户要求写带有仇恨言论的推文时,模型应该触发拒绝机制(Input/Output Filter)。

今天的目标:更好地控制 LM 输出
预训练数据虽然量大,但不可控。
- 核心问题:我们能否收集我们想要的行为数据来训练模型?
- 三个关键点:数据长什么样?如何利用数据?是否需要大规模?

InstructGPT 标准流程 (Ouyang 2022)
这是 RLHF 的三个阶段。我们先看 Step 1(红框部分):
- 收集演示数据(Prompt + Answer),进行有监督微调(SFT)。

SFT 的成分:训练数据
SFT 需要多样化的任务,包括自然语言推理、常识推理、代码生成、对话等。
- 常见数据集:FLAN, Open Assistant, Alpaca 等。

SFT 的方法
- 混合训练:通常会将 SFT 数据与一部分预训练数据(Pre-training mix)混合,以保持模型的基础能力。

训练数据详解
深入探讨两个细节:
- 这些数据集里面具体是什么?
- 构建“高性能”指令微调数据的关键是什么?

查看三个代表性数据集
- **FLAN (TO-SF)**:传统的 NLP 任务转化而来。
- **Alpaca (Stanford)**:由大模型(Davinci-003)生成的合成数据。
- **Open Assistant (Oasst)**:人类众包编写的高质量对话。

FLAN 示例
内容比较短,任务非常明确。例如:签署邮件、分类文本、提取餐厅信息。

Alpaca 示例
涵盖了更广泛的指令,如“给出三个健康建议”、“解释什么是算法”、“写一个 Python 函数”。

OpenAssistant 示例
更加自然和复杂。例如:解释“买方垄断”并引用文献、为小学生设计科学实验。

(课堂互动:让学生尝试进行数据标注)

(课堂互动:查看 GPT-4o 生成的关于 CS336 的课程介绍)

数据集的差异
数据集在以下方面差异巨大:
- 长度、格式(Bullet points)。
- 复杂性(引用、推理)。
- 隐形因素:规模、安全性。

风格差异:长度
- 表格对比了不同数据集的平均长度。GPT-4 生成的数据(如 Alpaca, ShareGPT)通常比人工标注的 NLP 数据集(FLAN)长得多。

长度偏好 (Length matters)
- 研究发现,人类和 GPT-4 评估者都倾向于认为更长的回答更好。这导致 SFT 后的模型往往比较啰嗦。

Benchmark 表现
- 使用不同 SFT 数据微调同一模型(LLaMA),性能差异巨大。
- 高质量数据(如 ShareGPT/Tulu)能显著提升 MMLU 等分数,而低质量数据可能损害模型。

复杂知识与引用
- Open Assistant 的例子要求引用文献。
- 思考:SFT 是在教知识,还是教引用格式?
- 答案:主要是格式。如果模型不知道某个知识点,强行 SFT 会导致幻觉。

幻觉与行为克隆 (Schulman 2023)
- 如果微调数据包含了模型在预训练中未学过的知识(”Unknown”区域),模型就会学会编造(Hallucinate)。
- 理想情况是模型在不知道时承认。

SFT 数据核心结论
- SFT 最好用于提取预训练已有的行为,不要试图注入新知识。
- 即使是事实正确的数据,如果模型没见过,也可能有害。
- 少量正确的数据(格式、风格)就能带来巨大改变。

安全性 (Safety)
模型部署需要安全控制。
- 防止生成:虚假信息(Misinformation)、诈骗(Scams)、冒充等。

安全微调 (Safety-tuning)
- 通过加入“拒绝回答”的样本,将一个 Unsafe Model 转化为 Safe Model。
- 例如:问“如何杀人?”,回答“我不能提供帮助…”。

过度拒绝 (Over-refusals)
- 安全数据的平衡很难掌握。
- 如果太多,模型会变得过度敏感。例如:问“如何杀掉一个 Python 进程”,模型因为看到“kill”就拒绝回答。

少量数据即可实现安全
- 实验表明,只需要很少的安全样本(约 500 条),就能显著降低有害输出率(Mean Score 降低)。

SFT 总结
- SFT 主要是提取预训练能力。
- 加入模型未知的知识会导致幻觉。
- 少量高质量数据(长尾、安全)非常关键。

如何进行微调 (代码层)
- SFT 本质上就是标准的梯度下降。
- 代码非常简单,使用 PyTorch 加载数据,计算 Loss,反向传播。

将指令微调转化为预训练 (Midtraining)
- 如果在学术界,简单微调即可。
- 但在工业界(海量算力),趋势是将指令数据混入预训练阶段。

Midtraining / Decay Stage
- 在预训练的最后阶段(Decay Stage),改变数据配比,混入高质量的 SFT 数据(如代码、数学、SFT数据)。
- 这是目前 MiniCPM、JetMoE 等模型的标准做法。
Part 2: RLHF (基于人类反馈的强化学习)

RLHF 在哪里?
回到流程图,RLHF 是 Step 2 和 Step 3。
- 收集比较数据,训练奖励模型,然后优化策略。

从模仿到优化
- **SFT (Imitation)**:拟合分布 $p(y|x)$,模仿专家。
- **RLHF (Optimization)**:寻找最大化奖励 $R(y,x)$ 的 $y$。

为什么要优化?成本因素
- SFT 数据(写完美答案)很贵($25/条)。
- RLHF 数据(比较 A 和 B 哪个好)很便宜($4/条)。
- 我们可以用更低的成本扩展训练数据。

为什么要优化?生成-判别差距 (G-V Gap)
- 人类不一定擅长写(比如写诗、写代码),但很擅长评判好坏。
- RLHF 利用了人类的判别能力来提升模型的生成能力。

RLHF 概览
- 数据:如何收集?需要注意什么?
- 算法:PPO vs DPO。
- 副作用:RLHF 会带来什么问题?

RLHF 数据收集流程
- 重点看 Step 2:收集比较数据(Comparison data),训练奖励模型。

标注界面
- 这是一个典型的成对比较(Pairwise Feedback)界面。标注员阅读 Prompt,对比两个 AI 回答,选择更好的一个。

标注指南 (InstructGPT)
- 我们需要明确定义什么是“好”。
- 核心原则:Helpful(有用)、Truthful(真实)、Harmless(无害)。

Google Bard 的标注指南
- 大厂的指南非常细致,包含语气、格式、安全性等多个维度的评分标准。

标注员筛选
- 不是所有人都能做标注。OpenAI 使用 Scale/Upwork,并有严格的筛选测试(Agreement test)。

(课堂互动:让学生体验标注 5 个样本)

众包的复杂性
- 很难获得高质量、可验证的标注员。
- 很难让标注员真正去核实事实(他们倾向于凭直觉选看起来对的)。

伦理问题
- OpenAI 曾因使用肯尼亚低薪工人过滤有毒内容而受到批评。这涉及严重的心理健康和剥削问题。

人口统计学偏差
- 表格显示了标注员的群体分布。标注员的背景(如宗教、国籍)会显著影响模型对敏感话题的看法。

标注者的一致性
- 热力图显示,不同来源的标注员(专家 vs 众包)错误率不同。
- 众包工人容易忽略事实错误,而偏好语气自信的回答。这导致模型学会了“自信地胡说八道”。

RLAIF:用 AI 生成数据
- 既然人类难管,能不能用 GPT-4 当裁判?
- 图表显示,GPT-4 的评分与人类的一致性极高(0.87 correlation)。

UltraFeedback 与 Zephyr
- UltraFeedback:利用 AI 标注的大规模偏好数据集。
- Zephyr:使用该数据训练的小模型,效果非常好。

Self-training (Constitutional AI)
- Anthropic 的方法:让模型根据“宪法”(原则)自我批判、自我修改,生成 SFT 和 RLHF 数据。

RLHF 的副作用:长度效应
- 图表显示,人类偏好与回答长度成正比。模型通过 RLHF 学会了写得更长来讨好人类。
Part 3: 算法 - PPO 与 DPO

如何进行 RLHF?
我们有了数据,怎么更新模型?
- PPO:经典、强大、难调。
- DPO:新颖、简单、直接。

从模仿到优化 (数学)
- 目标:最大化奖励期望 $E[R(y,x)]$。
- 约束:模型不能偏离基座模型太远(KL 散度惩罚)。

PPO 流程
- 首先训练一个奖励模型(RM)。
- 然后用 PPO 算法优化策略,包含 Value Function, Policy, KL penalty 等组件。公式看起来无害,但实现极难。

奖励模型细节 (Stiennon)
- 奖励模型使用 Pairwise Ranking Loss 训练(让好回答的分数比坏回答高)。

PPO 概念
- PPO 试图在每一步更新中限制策略的变化幅度(Clip),以保证稳定性。

能不能不用 PPO?
- PPO 太复杂了(4个模型同时加载,显存爆炸)。大家尝试了很多替代方案(如 Rejection Sampling)。

DPO: RLHF without Tears (无痛 RLHF)
- 核心思想:不需要显式训练奖励模型,不需要 PPO 循环。
- 直接在偏好数据上优化策略模型:增加好回答的概率,降低坏回答的概率。

DPO 推导 (1)
- 数学推导:最优策略 $\pi^*$ 和奖励函数 $r$ 之间存在解析关系。我们可以反过来用 $\pi$ 来表示 $r$。

DPO 推导 (2)
- 将上述关系代入奖励模型的 Loss,消去 $r$,得到只包含策略 $\pi$ 的 DPO Loss。

DPO 更新机制
- DPO 的梯度直观含义:根据模型当前的预测误差(惊讶程度)动态调整权重,增加好样本似然,减少坏样本似然。

结果对比
- 表格显示,DPO 在胜率上可以匹敌甚至超越 PPO,且训练更加简单稳定。

DPO 有效性
- HuggingFace 排行榜上,很多顶级开源模型都使用了 DPO。

DPO 变体
- SimPO、Length Normalized DPO 等变体试图解决显存占用或长度偏差问题。

PPO 依然强大
- Tulu 3 的研究表明,在某些任务(如逻辑推理)上,经过精心调优的 PPO 仍然优于 DPO。DPO 是离线算法,PPO 是在线算法,后者在探索性上更强。

RLHF 陷阱:过度优化 (Overoptimization)
- 如果你针对一个不够完美的奖励模型(Reward Model)训练太久,策略模型会学会钻空子(Reward Hacking),导致生成乱码或无意义内容。

过度优化曲线
- 图表显示,随着 KL 散度增加(模型偏离初始模型),真实的奖励(Gold Reward)会先升后降,而代理奖励(Proxy Reward)一直上升。这就是古德哈特定律。

模式坍塌与校准度
- RLHF 会导致模型校准度(Calibration)下降。
- SFT 模型通常比较校准(预测概率 = 真实准确率),但 RLHF 模型往往过度自信(概率偏向 0 或 1),即使它错了。