CS336 Lecture Notes 8
本文为本人学习相关开源课程过程中,整理的个人学习笔记及作业解答,核心目的仅用于记录个人学习轨迹、巩固所学知识、梳理学习思路,全程为个人自主学习使用,不具备任何商业用途,也不构成任何形式的课程辅导或标准答案参考。
需特别说明的是,由于本人学习进度及知识储备有限,笔记内容及作业解答中可能存在大量纰漏、思路偏差甚至错误,仅代表本人当时的学习理解,不具备权威性和准确性。
在此郑重提醒:请勿将本文中的任何作业解答复制粘贴,作为自身所修课程的提交答案。任何因抄袭本文内容导致的课程成绩问题、学术诚信问题,均由抄袭者自行承担全部责任,本人不承担任何相关连带责任。
同时,本文所分享的内容均基于开源课程的公开内容整理,尊重原课程创作者的知识产权,若涉及相关内容的版权问题,请及时联系本人,本人将第一时间进行调整或删除。
感谢各位读者的理解与支持,也欢迎大家针对笔记及解答中的问题提出宝贵建议,共同交流学习、共同进步。
- 课程网站: https://cs336.stanford.edu/
- Lec0_ 资料: lecture_0x.py
- Lec0_ 资料: lecture_0x.pdf
Alignment - SFT/RLHF
课程定位
本节课程关注如何从预训练模型(如GPT-3)过渡到指令跟随模型(如InstructGPT)。预训练数据并不完全符合我们的需求,因此需要收集符合期望行为的数据来训练模型。核心问题包括:
- 这些数据应该是什么样子?
- 如何最好地利用这些数据?
- 是否需要大规模数据?
标准方法流程:模仿学习(SFT)→ 强化学习(RLHF)
Part 1: 监督微调(SFT)
训练数据类型
常见的指令微调数据集包括:
- FLAN:包含多种任务类型(邮件主题生成、文本分类、文章摘要等)
- Alpaca:基于Self-Instruct生成的指令数据
- OpenAssistant (OASST):开源众包数据,包含更长、更复杂的回答
数据集特征分析
可见的差异:
- 回答长度和格式风格(如是否使用要点)
- 引用和复杂知识的呈现
不可见但重要的因素:
- 规模(Scale)
- 安全性(Safety)
风格变化的影响
模型在回答长度上差异很大,偏好评估中风格因素影响显著:
- 人类和GPT评估都存在强烈的长度效应(length effects)
- 但这些因素对其他基准测试性能影响较小
知识提取与对齐
关键发现: 在模型”不知道”的事实上进行微调可能导致幻觉(hallucination)
实践经验:
- 不建议在长尾知识上进行微调,即使这是LM的使用场景
- 原则上,“RL”式的正确性反馈可能有帮助
- LM中的知识存储和提取是复杂且微妙的
安全微调(Safety-tuning)
LM广泛部署给终端用户,需要安全控制:
- 风险类型:错误信息、诈骗和垃圾邮件
- 少量指令微调可显著改变安全特性
- 挑战:平衡安全性与过度拒绝(over-refusals)
研究发现:仅约500个样本即可显著改善安全性,同时添加500个Alpaca风格示例可使模型遵循安全指南。
SFT数据总结
- 指令微调(SFT)在提取预训练行为而非添加新行为时效果最佳
- 添加(事实正确的)数据有时可能有害
- 少量正确类型的行为数据(安全、指令跟随、风格)能产生显著效果,但长尾部分需要更多数据
微调方法
基础方法: 直接使用梯度下降
规模化方法 - Midtraining / Two-phase training:
- 在web/预训练数据上预训练
- 将指令微调数据混入预训练
- 进行实际(但较短的)指令微调轮次
这种方法可规模化指令微调而避免灾难性遗忘,被大多数LLM公司采用。
Part 2: RLHF部分
从模仿到优化
模仿(SFT):
- 拟合 对于某个参考分布
- 纯生成建模视角
- 需要从参考策略采样
优化(RLHF):
- 找到 使得 对于奖励函数
- 最大化可测量的奖励函数
- LM是策略,而非某个分布的模型
为什么需要优化?
成本考量:
- SFT数据可能非常昂贵
- 专家验证任务比解决任务更容易
- 对于7B模型:SFT约100;而 pairwise feedback + RL约4k
G-V Gap(Generation-Verification Gap): 人们并不总是写出他们偏好的LM输出内容
RLHF数据收集
标准 Pairwise Feedback 设置:
- 给定输入x,模型生成两个输出
- 标注者选择更好的输出
- 可选:标注者提供文字反馈
标注者选择:
- InstructGPT使用Scale + Upwork,约40名标注者
- 需要仔细筛选高质量标注者
众包的复杂性:
- 难以获得真正高质量、可验证的标注者
- 难以确保他们真正检查正确性
- 需要注意GPT-4的使用
人口统计学影响: RLHF的标注者分布会显著改变模型行为
LM生成的反馈:
- GPT-4作为pairwise feedback系统表现出色
- 在成本-质量光谱低端,AI反馈常用于RLHF
- 用于Olmo、Zephyr等模型
PPO算法简介
PPO(Proximal Policy Optimization)是RLHF的经典方法:
-
策略梯度:方差太高
-
TRPO:在当前策略附近线性化问题
-
PPO:在某个ε处裁剪比率
PPO实现复杂,需要reward model、rollout、外循环等组件。
DPO算法详解
DPO(Direct Preference Optimization) 简化了PPO:
- 不需要reward model
- 不需要on-policy相关内容(rollouts、外循环等)
核心思路:
- 对”好”的内容进行正梯度更新
- 对”坏”的内容进行负梯度更新(适当加权)
DPO推导:
-
RLHF目标是优化:
-
假设策略π是所有策略的集合(非参数假设),最优策略为:
-
解出隐含奖励:
-
DPO目标函数:
关键步骤:
- 做非参数假设(将和r以闭式关联)
- 通过策略参数化奖励r
- 使用监督损失优化奖励(进而优化策略)
DPO变体:
- SimPO:无参考模型
- Length-normalized DPO:长度归一化
RLHF注意事项
过优化(Overoptimization):
- 在多种RLHF优化器中,过度优化奖励会导致过拟合
- 对人类偏好和噪声LM偏好成立,但对无噪声LM偏好不成立
模式崩塌(Mode Collapse):
- RLHF使模型不再成为”概率模型”
- 默认情况下没有校准(calibration)
总结
SFT要点:
- SFT最适合提取预训练行为而非添加新行为
- 添加数据有时可能有害(幻觉风险)
- 少量高质量数据可产生显著效果
RLHF要点:
- RLHF数据收集同样困难,存在许多混淆因素
- RLHF算法比SFT复杂(尤其是PPO)
- 注意过度优化奖励的影响
- DPO提供了更简单的替代方案
Alignment - RL
课程定位
本节课程关注如何从 GPT-3.5 级别模型进一步提升到 o1/r1 级别的推理模型。RLHF 存在过优化问题,难以直接扩展。核心思路是在 RL 能发挥优势的领域工作——即可以精确优化目标的领域。
Part 1: PPO 回顾与实践
PPO 理论基础
PPO 的演进历程:
- Policy Gradient:方差太高
- TRPO:在当前策略附近线性化问题
- PPO:在某个 ε 处裁剪比率
PPO 在语言模型中的应用
在语言模型设置中,PPO 与标准 RL 公式相似:
- Actions 操作在 tokens 上
- 序列末端有密集奖励
PPO 实践组件:
- 外循环:调用内循环在 rollouts 上优化损失
- 损失计算:标准的裁剪损失,cliprange=0.2
- Reward Shaping:
- 添加 per-token KL penalty
- 最后 token 的完整奖励
- 裁剪 KL 以防止新策略 logp < 参考策略 logp 时 KL 发散
- Generalized Advantage Estimate (GAE):
- 使用 advantages 而非 reward
- 这是一个 bandit 问题,gamma=lambda=1 即可
PPO 的问题
- 实现复杂
- Value model 内存消耗大,需要额外调优
- 为什么不用 DPO?数据不总是 pairwise 形式,且是 offline 方法
Part 2: GRPO 算法
GRPO 核心思想
GRPO (Group Relative Policy Optimization):
- 从 PPO 开始(许多部分相似)
- 移除 value function / advantage computation
- 将 advantage 计算为”组内 z-score”
在 online case(rollout + immediate update)中,这实际上是带组归一化奖励的 policy gradient。
GRPO 实现步骤
GRPO 实现非常简单:
- 计算每个 rollout 的奖励
- 组内 Mean/Var 归一化
- 计算 KL term
- 对损失进行梯度更新
GRPO 理论分析
关键问题:GRPO vs PPO 的区别在于 advantage 计算
问题:除以 stdev 不是保持 unbiasedness 的有效 baseline。
Liu et al 2025 提出了 unbiased-gradient 版本的 GRPO(接近 reinforce w/ leave-one-out)。
GRPO 的长度偏差
- Stdev term:过度加权太简单或太难的问题
- Length normalization 需要修正
Part 3: 案例研究
DeepSeek R1
R1 的突破性意义:
- 性能超越 OpenAI O1
- 开放且简单的 RL recipe
- 结束了关于 MCTS/PRMs 必要性的争论
R1-Zero 设置:
- 奖励:Accuracy rewards + Format rewards(使用 thinking tags)
- Base model:DeepSeek-V3
- 结果略逊于 OpenAI O1
有趣现象:
- 训练过程中 CoT 变长
- “aha moment”(顿悟时刻)——可能被过度渲染
R1 vs R1-Zero 关键差异:
- SFT 初始化
- 语言一致性奖励(用于 CoT)
- 非可验证奖励(第二阶段)
训练流程:
- SFT 初始化:使用长 CoT 数据
- RL step:与 R1-Zero 相同,增加语言一致性 loss
- SFT/RLHF:
- SFT:推理数据(600k)+ 非推理数据(200k)
- RLHF:推理 RLHF + 非可验证任务的 GRPO
Distillation:
- 用 R1 生成 800k CoT traces
- 教 Qwen 2.5 通过 distillation 学习
失败尝试:
- PRMs(PRM800k, DeepSeekMath)
- MCTS
Kimi K1.5
核心步骤:
- Dataset construction(难度过滤)
- SFT(用于长 CoT)
- RL(使用自己的 policy gradient loss)
数据筛选:
- 平衡数学主题
- 排除多选题/判断题(避免假阳性)
- 仅选择 best-of-8 失败的样本
Kimi RL 算法:
- Reference-based reward model
- DPO-type derivation(非参数假设 + 解出 r)
- 使用 squared loss 作为 surrogate
长度控制:
- 每个 batch 有长度奖励
- λ 在 [0.5, -0.5],较长序列为负
- 正确答案鼓励短,错误答案鼓励比 rollout 中间值更短
额外细节:
- Curriculum:从易到难
- 奖励:代码用 ground truth + 新测试用例;数学用 800k 样本训练 CoT reward model
Ablation 结果: Expert iteration(仅从正样本学习)不如 RL-style negative gradients
Qwen 3
整体流程: RLHF 在 reasoning RL 之后,distillation 最后
SFT + Reasoning RL:
- 难度过滤(best-of-n)
- 移除无 CoT 即正确的样本
- 移除与验证数据太相似的样本
- 手动过滤 CoT 质量
- RL 仅用 3995 个样本
新特性:Thinking Mode Fusion:
- 混合 non-thinking 和 thinking 数据(带 tags)
- 通过特殊字符串提前终止
Test Time Scaling: 可控制 CoT 长度
阶段组成:
- Math/STEM 能力在通用 RLHF 后略有下降
Part 4: RL 基础设施
RL 效率挑战:
- On-policy = rollouts = 慢推理
- 训练和 rollouts 切换常涉及不同框架
- 长 CoT 使 batch 很不均匀
总结
核心要点:
- 过优化是问题 → 在狭窄领域用 RL 是解决方案
- GRPO 简单但有缺陷, enables RLVR
- 多个成功 recipe(R1, Kimi 1.5, Qwen 3)
算法对比:
| 方法 | 优点 | 缺点 |
|---|---|---|
| PPO | 经典、成熟 | 实现复杂、需要 value model |
| DPO | 无 reward model、offline | 数据需 pairwise、非 online |
| GRPO | 简单、无 value function | advantage 计算有偏差 |
关键洞察:
- 少量数据(1k-4k)即可有效 bootstrap 推理
- SFT 初始化很重要
- 语言一致性、长度控制是重要细节
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!