精读|浅谈 Post-Training 的前世、今生、未来

转载 + 精读批注
- 原文:《浅谈Post-Training的前世,今生,未来》
- 平台:知乎专栏,发布于 2026-09-10(文末标注”To Be Continued”,作者称还要写 2–3 个月)
- 链接:https://zhuanlan.zhihu.com/p/2081167589028401987
- 版权归原作者所有,本文仅为个人学习笔记,批注部分是我写的,与原文作者无关。
- 原文公式的 LaTeX 有个别处抓取时被截断,我按上下文补全,批注中会说明。
我的导读
这篇的核心是一条论证链,把它记住,整篇的骨架就立起来了:
1 | SFT:给模型一个"标准答案",让它模仿 |
作者写到 GAE 就停了,后面 TRPO / PPO / InstructGPT / RLHF 局限 全是空标题。所以这篇是”从原理出发重建脉络”的上半部,目前最主流的 DPO、GRPO、RLVR 都还没出现——这点读的时候要清楚,别以为看完就覆盖了全貌。
我的批注分三种:【校】 事实/概念勘误、【补】 背景知识补充、【评】 我的评价。以引用块标出,方便和原文区分。
Part 1:前史:从 Pre-Training 到 Fine-Tuning
原文
重新学习概率论的同时再开一个新坑吧。如果说 Scaling Law 主导了人工智能浪潮的第一章,把大家都推上了卷更多的参数,堆更多的算力上,那么如今的第二章,在单纯继续扩大 pre-training compute 的边际收益下降,训练成本迅速上升,同时高质量数据成为约束之一之后,Post-Training 将会成为,或者应该是已经成为了十分重要的一环。从 SFT 到 Preference Optimization,再到百花齐放的 RL-Based Post-Training,再到面向 Agent 的训练,以及未来可能的 Self-Improvement 等发展,Post-Training 到底从何而起,经历了什么,现在怎么样,未来还有多少发展潜力,是一个很重要,也是我想要学习,了解,思考并投身的方向。
这篇文章大概会按照时间顺序来组织,主要会围绕 Preference 和 Reasoning 两条主线来讲……整个写作的周期可能会持续 2-3 个月,我的目标是在年底之前把这个坑填完吧,希望我能做到。
我们正在拥抱未来。
【补】 作者这句”pre-training 的边际收益下降”背后是两场著名争论,值得知道名字:
- Kaplan scaling law(2020,OpenAI):性能随参数量幂律提升,当时认为数据不是瓶颈。
- Chinchilla(2022,DeepMind):指出 GPT-3 一类模型其实训练严重不足,模型比数据大太多;算力最优配比下两者该同步增长。
- 后续 Llama-3 用 15T tokens 又把”compute-optimal”的边界推得很宽——说明”最优”本身也在动。
作者真正想说的趋势我概括为:**堆参数的边际收益在跌,注意力转向”怎么用好已有模型”**。这也正是 Post-Training 变成主战场的原因。
在今天看来,业内对于 LLM 训练的共识,都是我们要先做 Pre-Training,再做 Post-Training。但是如果我们回看 2018 年的 NLP,大家可能不是这么想的。当时固然已经有一些通用的底座,Word2Vec、GloVe 这类 pretrained word embeddings 已经很常见,但是人们还是倾向于对每个不同的问题都重新用它们做监督训练,然后直接部署。
所以在当时,如果训练好一个模型之后,要解决另一个问题怎么办?重新训练另一个模型。
这就跟现在很不一样了,我们都知道 GPT、Claude 这样的模型已经可以做到一个模型解决很多不同领域的任务。而这种转变的萌芽,恰恰就发生在 2018 年前后。那一年几乎连续出现了三种关键路线:ELMo、ULMFiT,以及最接近今天 LLM 训练范式的 GPT-1。我们后续会逐一拆解。而年底的经典之作 BERT,更进一步证明了一个预训练模型只加很小的 task head,就可以 fine-tune 到大量完全不同的 NLP 任务上。
【补】2018 年这四篇的准确出处(考据用):
| 工作 | 出处 | 关键数字 |
|---|---|---|
| ELMo | Peters et al., AllenAI, arXiv 1802.05365 | 双向 BiLSTM,层间加权求和 |
| ULMFiT | Howard & Ruder (fast.ai), arXiv 1801.06146, ICML’18 | 100 条标注数据 |
| GPT-1 | Radford et al., arXiv 1806.04832 | 117M 参数 |
| BERT | Devlin et al., arXiv 1810.04805 | 双向 Encoder + MLM |
作者说的”三种关键路线”其实对应两种世界观:**ELMo 是”抽特征喂给下游”,ULMFiT 和 GPT-1 是”直接微调模型本身”**。后者赢了,这就是今天的范式。
“风暴前夜——Semi-supervised Sequence Learning”
早在 2015 年,其实已经有人提出了先预训练 LSTM,再把参数作为 supervised task 的初始化这一条道路。作者在实验中发现这样预训练后的 LSTM 更稳定……因此已经提出了”语言模型可以不作为最终任务,而作为下游监督学习的参数预训练阶段”这一理念。
但是在当时,这一理念还受到诸多限制……其次,LSTM 本身的架构决定了它的训练存在沿序列方向的递归依赖,难以并行化,因此随着语料和模型规模增长,训练成本会越来越难以承受……
【补】 这里说的是 Dai & Le, Semi-supervised Sequence Learning, NIPS 2015(Andrew Dai 和 Quoc Le)。它历史地位重要,因为它第一次把 “LM 预训练 → 下游微调” 这条路跑通了。
作者点出的三个限制(LSTM 难并行、下游微调会灾难性遗忘、微调技术不成熟)都很准。其中”灾难性遗忘”这一条,一直延续到了今天的 LLM post-training——这也是为什么后面会有 KL 惩罚、reference model、以及各种对齐税(alignment tax)的研究。这是个很好的历史伏笔。
“初道惊雷——ELMo:Contextual Representation”
我们前文已经提到,2018 年之前已经有 Word2Vec、GloVe 这类通用的预训练词表示底座,但是局限性也很明显,他们会给每个词分配一个固定的向量……ELMo 认为一个词的表示应该是上下文化的,并且可以由一个 deep BiLM 不同层的表示的 task-specific 加权和作为最终表示……
论文还做了一个很关键的分析,它发现不同层确实学到了不同层次的信息,较低层对于 syntax 更有帮助,较高层对于 semantics 更有帮助……
【评】 ELMo 的分层结论(低层句法、高层语义)是个有效的启发式,在今天依然成立。现在看 Transformer 的 interpretability 研究(logit lens、residual stream 分析),基本都会观察到类似的分层现象。作者点出论文强调 “deep” 的原因(因为不同层真的不一样),这个细节抓得好。
“跨过遗忘——ULMFiT 与稳定 Fine-Tuning”
ULMFiT 做的事情就是在一个预训练的模型上继续 fine-tune……第一步是在大规模通用语料上训练一个 LM,第二步则是用目标任务自己的文本继续做语言模型训练,让模型适应目标领域的分布,第三步才是在上面加分类头……这已经有点今天 continued pretraining 和 SFT 分阶段适配的味道了。
……如果模型在小规模下游数据上直接大步更新,可能会忘记自己预训练阶段已经学到的通用知识……因此论文使用了一些技巧,比如不同层使用不同学习率……同时不是一开始就允许修改所有参数,而是逐渐解冻。
而 ULMFiT 最漂亮的一个结论是它可以只在很少的数据上做 fine-tune,也可以达到接近甚至超过大量监督数据从头训练的效果。ULMFiT 原论文报告只用 100 个 labeled examples 就可以匹配从头训练时使用 100 倍标注数据的性能。
【评】 这段是全 Part 1 我最想让人注意的地方。
ULMFiT 在 2018 年就发现的事情——“少量高质量数据就够”——和 2023 年 LIMA 的结论、和今天”高质量指令数据比垃圾量更重要”的共识,是同一个现象的不同年代版本。 八年过去,结论没变,变的是规模。
作者提到的”分层学习率 + 渐进解冻”现在确实不重要了,但背后的思想换了马甲还在用:今天的 LoRA 冻结主干只训低秩增量、以及各种参数高效微调,本质上都是”小心地改、别把预训练学到的弄坏”。
“范式成型——GPT-1”
ULMFiT 已经把 pre-train 到 fine-tune 这条线搭建的非常基础了。GPT-1 更重要的地方是把这套范式和 Transformer + task-agnostic architecture 结合起来。作者明确希望尽量不为不同任务修改模型本体,而是改变输入的表达方式,让同一个 Transformer 去处理不同任务。
对于不同的任务,它们之间可能有差异很大的原始结构,GPT-1 通过 task-aware input transformations 把它们统一转换成 token sequence……形成了”把任务本身文本化”的早期雏形,并且离后来的表示只差了一步,现在的模式是用户直接用自然语言表达任务,GPT-1 是人为规定了一种输入格式来表达任务。
【补】 作者这个观察很有价值,值得单独记住:
GPT-1 的 task-aware input transformation 和今天的 chat template 是同一件事。
- GPT-1:人工设计「Translate to french: english text」这种前缀 + 分隔符
- InstructGPT / 今天:
<|system|>...<|user|>...<|assistant|>,同样是任务描述文本化
GPT-1 论文里那个 [CLS] 式的分隔符、把蕴涵/相似度/问答都拍平成序列的套路,就是今天 prompt template 的直系祖先。从”人设计输入格式”到”人用自然语言提要求”,中间隔的是几年数据和规模,不是范式革命。
在预训练阶段,GPT-1 使用了 decoder-style Transformer……论文对此还专门做了 ablation,把 Transformer 换成 LSTM 后,平均表现明显下降,而完全移除 pretraining 后下降更严重,在他们的分析中,不做预训练相对完整模型平均下降约 14.8 个百分点。
……而在我们要重点关注的 SFT 阶段,GPT-1 不仅优化 Loss,同样要求模型把语言建模做好,不希望模型 SFT 之后失去已有的语言建模能力。这和 ULMFiT 面临的问题是相通的……不过论文对此也做了 ablation,表示这个优化并非对于所有任务都有用。
我认为真正值得重点理解的也就是 Zero-Shot Behavior……
【评】 GPT-1 的 auxiliary LM loss(SFT loss + LM loss)和 ULMFiT 的抗遗忘是同一个问题的两个答案。今天这个问题叫 alignment tax / 对齐税——模型对齐后基础能力下降。
顺带一提,今天 PPO/DPO 里的 KL 惩罚项(拉住在策略模型不要离 reference model 太远)在思想上和这个 auxiliary loss 完全同源:**都是”允许你适应新目标,但不许忘了本行”**。
作者花大段讲 Zero-Shot Behavior 是对的,这是全 Part 1 最重要的一处伏笔——**GPT-1 已经隐约看到”预训练本身就带来任务能力”**,这个直觉一路通向 GPT-2 的标题。
GPT-1 的作者正是在训练中发现,即使还未进行 SFT,LM 在某些任务上的性能也会随着 pre-training 的进行而提高。对此,他们提出了一个假设……他们认为语言模型为了把 next-token prediction 做好,在训练过程中就不得不学习一些下游任务本身需要的能力。
……其意义在于 pre-training 让模型获得了一部分解决下游任务的能力,但并不能因此否定 SFT 的重要作用。我们反而可以引出一个重要的问题,如果 pre-training 已经让模型学到了通用语言表示和部分解决问题的能力,那么 post-training 到底是”继续教会模型新的能力”,还是”选择并释放模型已有的但未展现的能力”……
【评】 作者自己标出来的这个问题,就是整个 post-training 领域最核心的争议,而且到今天没有定论。
顺便说,作者这个提问本身就说明他抓到要点了:这不是历史问题,是当代问题。 下文 Part 2 讲 SFT 时他会给出自己的答案(倾向”释放”),而 Part 3 讲 RL 时会给出另一半答案。带着这个问题往下读,比顺着读收获大得多。
“旧日高潮——BERT”
年底,经典之作 BERT 再次验证了 pre-training + fine tune 范式的有效性。BERT 在文本上使用基于双向 Transformer Encoder 的 Masked Language Modeling 进行 pre-training……BERT 无疑把”预训练大规模语言模型,然后对不同下游任务做 fine tuning 适配”推成了 NLP 的主流范式……不过 BERT 的模式仍然需要对不同任务做专门的微调,离后来统一任务接口还有一定的距离。
不过,既然一个模型已经可以适配这么多任务,加之 GPT-1 已经展现出 zero-shot 能力,我们真的还有必要对每个不同的任务都去做微调吗?
【评】 作者用”我们真的还有必要对每个任务做微调吗”这一句完成了历史叙事的关键转折,手法干净。
历史事实上 BERT 赢到了 2019–2020,之后 encoder-decoder/decoder-only 和 GPT 路线靠生成能力和 in-context learning 翻了盘。BERT 的”每个任务一个微调副本”和 GPT 的”一个模型吃所有任务”,是两条范式路线的竞争,不只是架构竞争。 作者这个潜台词埋得不错。
“GPT-2:只需要预训练就够了……吗?”
(起不出来标题了)
Language Models are Unsupervised Multitask Learners,这句话是 GPT-2 论文的标题,也很好的概括了他们的核心观点……比如在采访文本中,”Q:”后面通常跟随着问题,而紧随其后的”A:”后面通常就跟随着答案。模型如果学习了足够多这样的文本,为了预测好下一个 token,就有可能需要学到”前面有了’Q:问题’之后,后面的’A:’应该跟随着答案”这样的经验。
【补】补一个关键细节,作者没提但很重要:GPT-2 论文的核心主张其实是 **”no task-specific training, no architecture changes”**——他们认为自然语言里已经隐含了无数任务的 (input, output) 对。作者讲的”Q:/A:”例子就是论文原文的论证。
这也解释了为什么 GPT-2 之后大家会转向 instruction tuning:因为”任务指示天然存在于文本中”这个假设,在真实用户身上不成立——用户不会说”Q: 中国的首都是哪里 A:”,他们只会问”中国首都是哪”。这个”预训练以为的世界”和”用户真实行为”之间的裂缝,就是 Instruction Tuning / SFT 要填的。
对此,GPT-2 诞生了。这是一个有 1.5B 参数的模型,相比 GPT-1 的 117M 增长了超过十倍,训练数据规模也增加了十倍,他们的数据来自约 8M 的网页,40G 的数据。
他们还专门训练了不同规模的模型,并观察 zero-shot performance 随模型容量增加如何改善,而他们发现的结果是这些任务上的性能随模型规模呈近似 log-linear 改善。这是一个非常重要的历史信号,GPT-2 已经发现模型的能力会随着规模增长而增长,这正是后来所有人都会跟着 Scaling Law 猛烈推进的方向。
【评】 “log-linear 改善”这个细节抓得准。这是 Scaling Law 实证化的重要一步——GPT-2 (2019) 已经在模型尺寸上扫了 range 并报告了规律的提升,Kaplan (2020) 只是把它做成了严格的形式化。
顺便纠正一个容易混淆的点:GPT-2 的 WebText 是人工从 Reddit 高赞链接抓的,做过质量筛选,不是原始 Common Crawl。这一点关系到”数据质量”叙事的起点,作者这里没展开,但”高质量数据成为约束”这个开篇判断,源头就在这里。
GPT-2 无疑已经通过 pre-training 产生了相当程度的 task-relevant behavior……不过,站在今天的角度来看,由于缺乏预训练之后的微调,GPT-2 展现出一些问题比如答非所问……GPT-2 已经通过大规模预训练学到了一定语言能力,但是不知道用户想让他干什么,因此可能在用户想要它回答问题时继续续写这个问题。这也是后来 Instruction Tuning 最重要的动机之一。
【评】 这一段是整篇 Part 1 的落点,也是全篇论证的枢纽。 请把它和 Part 2 的”为什么 SFT 有效”连起来读:
- Part 1 这里说:模型有能力,但不知道用户要它干什么(分布不匹配)
- Part 2 会说:SFT 做的事就是把这个分布推向”回答问题”
这两处隔了几万字,但说的是同一件事。这是我在整篇里见到的最好的一处结构呼应。
“T5:万物皆可’Text to Text’”
T5 没有提出新的架构,但是它将所有 NLP 任务统一表述为”文本到文本”的格式……不过 T5 并没有改变模型仍然需要对不同下游任务做不同适配这一点。除此之外值得一提的是,T5 的实验同样发现模型性能随着参数量的增加而持续提升,他们最终的 T5-11B 模型在多个基准上取得了 SOTA。Scaling Law 初具雏形,不过甚至还没有到最凶猛的阶段……
【补】 T5 论文全名 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer(Raffel et al., JMLR 2020)。它真正被后世继承的思想不是 text-to-text 格式本身,而是**”把一切任务都变成序列到序列,架构完全不动”**——这个思想上承 GPT-1 的 input transformation,下接今天所有 instruct 模型。
T5-11B 确实是当时的 SOTA,但它仍然是 multi-task fine-tune per task 的范式,所以作者说它”没改变需要适配这件事”是对的。
“GPT-3:更大!更大!更大!或许在加上一点提示……”
Language Models are Few-Shot Learners,同样的,来自 GPT-3 论文的标题。这篇 2020 年的论文被很多人认为是现代大语言模型的开端,对此我并不完全认可,我的想法会留到这部分的最后说明。
……它表明模型规模的提升不止作用于基础生成能力,也让模型利用 prompts 完成任务的能力更强。某种意义上,后者才是 GPT-3 最有意义的 scale 现象。
【评】 作者的保留意见(”GPT-3 不完全是开端”)我猜是想说现代 LLM 的起点应该算 InstructGPT/ChatGPT:让模型真正可用的是对齐,不是 few-shot 能力本身。他说明显留到 Part 末尾,但 Part 3 结尾是空的标题,所以这个判断最终没写出来。读到这里你会发现这篇”To Be Continued”卡住的正是最有料的地方。
作者说”后者才是最有意义的 scale 现象”这句很准:in-context learning 能力本身随规模涌现,而不是底子好了顺便会了。这是 GPT-3 相对 GPT-2 的真正增量。
比如我本来要让模型把”中国”翻译成”China”,但是我先给出一些例子:”美国-United States of America;日本:Japan;……”最后再给:”中国-?”模型就很有可能输出 “China”。这已经很像今天的 post-training……不过这个时候的 in-context learning 并不改变模型参数,只是临时根据少量示例改变了输出的概率分布,但是也取得了很好的解决问题的效果。
【评】 这里可以补一条硬核的来龙去脉,作者没提但极其重要:
in-context learning 为什么能给模型”临时改分布”而不改参数?
学界到现在也没有共识,主流假说有这些:
- 隐式梯度下降(Akyürek et al. 2022 等):前向传播内部实现了类似梯度更新的计算
- 隐式贝叶斯推断(Xie et al. 2022):ICL 是在 prompt 里做后验推断,location 是 latent concept
- 检索 + 模式匹配:其实是在训练集里找最相似片段
这个问题的意义在于:ICL 和 SFT/RL 的关系是当代研究热点。如果 ICL 是隐式微调,那”对齐”是不是也能在 context 里完成?这正是现在 context engineering / prompt-based alignment 一类工作的立足点。作者说 ICL”很像 post-training”是敏锐的,因为它们在分布层面做的可能是同一件事。
前言部分到这里就要告一段落了,下一部分将会出现一定的数学知识,我们将会深入了解 SFT……GPT-3 已经证明,仅仅通过在上下文中提供任务描述和少量示例,就能够让一个固定参数的模型临时表现出符合特定任务要求的行为,而 SFT 则更进一步,通过监督训练把这种”按照我们的要求完成任务”的行为稳定地写入模型参数之中。
【评】 这个过渡写得很漂亮,我给原文的衔接手法打个高分:
- GPT-3 / ICL:不改参数,靠 context 临时改分布
- SFT:改参数,把这个行为永久写死
同一个目标(”按我的要求做”),两种实现路径——这是理解整个 post-training 训练体系的顶层框架。 后面 PPO/DPO 所做的一切,都还是在”改参数”这条路上,只是监督信号从”一个参考输出”变成了”一个相对好坏”。
Part 2: SFT
原文
是什么?
SFT,即监督微调,Supervised Fine-Tuning。是利用一系列 prompt/instruction - response 对组成的数据集,对预训练大模型进行进一步训练,使其学会理解并遵循人类指令的能力。它通常位于预训练阶段之后,是将预训练模型的通用语言能力转化为具体任务或领域处理能力的桥梁。
我们前面提到 GPT-2 生成回答牛头不对马嘴,或者 GPT-3 中使用的 In-context Learning,就是对 SFT 诞生的铺垫。可以说是 SFT 把”按照人类想要的方式生成回答”这个理念写进了模型的参数里面。
假设我们有训练数据,即 prompt - response 对:
SFT 要做的事情就是要尽可能对这些正确回答赋予尽可能高的概率。对于自回归模型来说,我们有如下的似然函数分解:
因此目标是找到
由于对数函数单调递增,取对数可以把连乘变成求和的形式,避免了数值下溢的问题,同时让反向传播更容易。取对数之后得到的部分被称作对数似然(log-likelihood)……即
最后对所有样本求和
如果要进一步展开:
这就是 SFT 的数学基础,实际上相当简单清晰。相比于 DPO、PPO、RLHF 等我们后面会提到的强化学习策略,可以称得上是眉清目秀了。
【评】这段推导本身没问题,但值得补一句绝大多数教程不会说的:上面这个公式是完整版,工程上几乎没人这么算。
实际训练时你会看到的形态是:
1 | loss = -1/T * Σ_t log P(y_t | x, y_<t) ← 只在 response 的 token 上求和 |
也就是必须做 loss mask:prompt 部分的 token 不参与 loss。作者在下文”怎么做”里确实提到了”通常我们只在 response 上计算损失,即 response-only loss”,但没有强调这是工程上的默认必需项——如果不 mask,就等于在教模型复读用户的提问,这是新手最常踩的坑。
另外作者对比说 SFT”眉清目秀”而 RLHF 复杂,这个感受是对的,但要补一句为什么复杂:不是因为数学难(PPO 的目标函数也不神秘),而是因为 RL 引入了采样、奖励模型、KL 约束、advantage 估计四个额外部件,工程链路长一个数量级。作者后面会讲清楚这些部件。
怎么做?
在 InstructGPT 早期,人们大量收集 human-written demonstrations,也就是让人工标注者写出一个 prompt 和一个代表”理想情况下模型应该怎么回答”的 response。这就是最纯粹的 SFT 数据,然后用这些数据对预训练的 GPT-3 做 SFT。
除此以外,已有的监督学习训练集也能被拿出来重复使用。比如情感分类任务里,我们要判断某句话
代表了 positive 还是 negative 的情绪,就可以把它改写成: “判断下列言论代表了消极还是积极的情绪:s”
然后给一个答案,positive 或者 negative。
FLAN 和 T0 这两篇论文很大程度上就是在系统做这件事情。
到后来,我们甚至可以让当前模型自己产生数据,经过筛选之后加入数据集,即 synthetic data……现代 SFT 往往就是由包含但不限于上述的几种数据混合起来的。训练数据覆盖什么行为,质量如何,比例怎么样,是决定 SFT 质量的重要因素。
【补】数据这条线的谱系补全(作者列了三条,实际有四代):
| 代际 | 数据来源 | 代表 |
|---|---|---|
| 1 | 人工写标准答案 | InstructGPT |
| 2 | 已有监督数据集包装成指令 | FLAN、T0 |
| 3 | 强模型生成 + 筛选 | Alpaca、Self-Instruct、(今天所有合成数据) |
| 4 | 强模型生成 + 推理过程/可验证反馈 | OpenThoughts、OpenR1 一类 |
作者说的第 3 条就是第 3 代。但 2024–2026 真正的生产力在第 4 代:用推理模型造带思维链的数据,SFT 得动。这解释了为什么现在”造数据”几乎等于”用大模型造数据”。
作者最后一句”比例怎么样,是决定 SFT 质量的重要因素”——这句比前面所有具体方法都重要。数据配比(domain ratio)失调导致的能力塌陷,是工业界最常见的翻车点,而且很难事后修。
有了数据以后,通常会先对数据做清洗……同时保证不同类型的数据之间的比例不要特别失衡。在这之后,我们还要将数据编码成 token 序列:
[SYSTEM] s [User] x [Assistant] y这里
是 system prompt。比如”You are a helpful AI assistant.”
就是我们的 prompt - response 对。实际训练中,模型看到的就是这样的由特殊 token 和普通 token 组成的序列。 模型在训练中仍然做 next-token prediction。这里做的是 teacher-forcing,即计算当前 token 的时候用的是真实数据,而不是模型自己前一步训练出来的数据,和预训练阶段是一样的,因此可以并行。通常我们只在 response 上计算损失,即 response-only loss……不过也存在对整个 conversation 求 loss 的,因此不算一个公认的行业标准。
至于参数更新,最经典的做法是 full-parameter fine-tuning,即所有参数都可以更新,但是现代训练也经常采用 LoRA,通过训练两个低秩矩阵作为更新的部分,也能取得很好的效果。
【补】teacher forcing 这里值得补一个它带来的核心问题,因为这是后面整个 RL 的动机之一:
exposure bias(曝光偏差)——训练时模型永远看到正确答案上文(ground truth),推理时它看到的是自己生成的上文。一旦自己生成错了,后面就全歪。SFT 完全不处理这个问题,因为训练里根本不存在”自己生成”的场景。
记住这一条,等读到 Part 3 作者自己总结的 SFT 四大不足之三”对模型自己会生成什么缺乏直接针对性”,说的就是它。这和 RL 的关系是:RL 天然在自己生成的轨迹上学习,所以没有 exposure bias。
作者说 response-only loss”不算公认的行业标准”——这句略保守了。事实是 response-only loss 就是事实标准,全 conversation 求 loss 的极少见。我猜作者这么说是因为不同开源框架的默认行为有差异,但从我看到的训练代码看,都对 assistant turn 做 mask。
为什么?
为什么这一部分主要回答为什么 SFT 有效的问题。我比较赞成的说法是 SFT 激活了模型的能力,但是不能否认 SFT 本身也可能带来新知识,但是前者是主要的原因。
一个很强的现象是,SFT 只用很少的数据,就可以在很大程度上提升模型的性能,并且甚至展现出泛化能力。LIMA 这篇研究用了 1,000 条精心筛选的 prompt-response 数据对 65B LLaMA 做普通 supervised fine-tuning,就获得了很强的 instruction-following 表现,而且还能泛化到训练中没有出现过的一些任务。FLAN 在 60 多个 instruction-formatted NLP tasks 上训练后,对未见过的 task types 的 zero-shot performance 也显著提升,并且在 25 个评测任务中的 20 个上超过了 zero-shot GPT-3 175B。
SFT 当然有可能让模型学到新的东西,但是这不太可能是主要的原因……我赞成的观点也是 SFT 激发出了模型已经拥有的能力。
具体地说,我们知道 LLM 是从概率分布之中选择输出的……对于一个未经 SFT 的 model,巴黎当然有可能在候选里面……但是模型也可能因为见过很多其他的数据,导致候选里面可能还有继续续写等操作。
当我们做了 SFT 之后,这种概率分布被改变了,SFT 会把概率分布往”回答问题”这个方向推……模型就更有可能直接输出”巴黎”。
【评】这是全 Part 2 的核心论述,也是我认为最值得深挖的地方。
作者的论证是清晰的,但它略过了对立面最强的一份证据。补上才平衡:
支持”SFT 只释放能力”的证据(作者引用了)
- LIMA(arXiv 2305.11206):1000 条数据,65B LLaMA,效果显著。论文正式提出的假说叫 superficial alignment hypothesis——“知识全部来自预训练,对齐只是教模型用哪个子分布”
- FLAN / T0 的未见任务泛化
反对的证据(作者没提,但很重要)
- **Ghosh et al., “How much does SFT learn?”**(2024):发现 SFT 确实学到了预训练里几乎没有的新知识,且 on-policy SFT 比 offline 更有效
- **Gudibande et al., “The False Promise of Imitating…”**(2023):证明纯模仿式 SFT 泛化差,加入真实能力来源才有提升
- Qwen/DeepSeek 的长思维链数据:这些东西预训练里根本不存在,显然不是”释放”出来的
我的判断:两边都不全对。 现在的共识更接近”分工”——
- 行为格式、风格、指令遵循 ← 主要是释放(预训练里有大量对话文本)
- 复杂推理、特定领域能力 ← 确实是 SFT 教进去的
而作者的”法国首都”例子选得特别好,因为它属于第一种情况(事实知识预训练里就有),所以”释放”论在他举的例子上完全成立。这不是作者论证的问题,是例子本身的偏向性。
作者后面说”LIMA 的作者也提出’SFT 更多的教会了模型如何调用这些能力生成回答’这一观点”——这句转述是准确的。
这同样指出,模型在很多情况下都知道问题的答案是什么,这样的能力就是通过大规模预训练得到的,只是没有很好的表现出来……并且模型展现出来的泛化性说明模型并不只是记住了训练数据,而是学习了训练数据背后的模式。
这也可以解释为什么 LoRA 这样的方法是有效的。模型本身就处在一个很强的参数范围里面,那么我们并不需要做太多太大的改变,只需要在某一些还不够好的方向上微调,以尽可能保留模型的大多数能力,但同时激发出其他的能力。LoRA 让模型学习两个低秩矩阵也正是”寻找在什么方向上微调”的过程。
【评】”预训练里已经有答案,只是没表现出来”这个判断,值得过一个更严格的审视。
作者用它解释 LoRA 有效,逻辑链是:模型已在强参数邻域 → 不用大改 → LoRA 够了。
这个解释部分成立但不够完整。LoRA 有效的真实原因更接近”任务相关的改动本质上是低秩的“——Hu et al. 原论文(arXiv 2106.09685)的动机是从”预训练权重具有很低的 intrinsic rank”这个经验观察出发,而不是从”参数邻域好”出发。两者相关但不是一回事。
不过作者的直觉在方向上是好的,而且比”低秩所以省参数”这种常见解释更深:他真正想说的是对齐是个小扰动问题。这个视角对理解后面 RL 里为什么要加 KL 惩罚也有帮助——**都是在控制”别改动太大”**。
接下来我们会讨论 SFT 的优点和不足,然后就自然衔接到 preference 这一部分。因为不得不承认 SFT 虽然很有用,但是确实没什么能讲的。
SFT 的优点其实很好总结,第一是简单稳定,因为本质上还是标准的 next-token prediction,监督学习,交叉熵损失;第二是监督信号直接……第三是数据效率高……第四是可控性强……第五是 instruction tuning 还能带来一定的 unseen-task generalization。
但它的不足才更重要,这也正是下一章 preference 线真正登场的背景。最核心的不足是,SFT 只告诉模型”一个好答案长什么样”,却没有告诉模型”在你见到的这些答案里面哪个答案谁更好”……而进一步讲,让人亲自写一个完美回答,往往比让人比较两个回答更难。
这就意味着 preference data 可能是一种更容易提供,也更贴近”优化质量差异”的监督信号。
【评】作者这条”写答案比比较答案难”的论证,是 SFT → Preference 整条逻辑链的支点,值得停下来验证一下。
它是直觉上成立、但实际有大量 OK,可是这个反例:
- 安全性 / 有害输出判断:比较两个回答哪个更安全,人类标注者之间一致性很低,甚至比”写一个安全回答”更难
- 创意写作 / 代码风格:哪个更好高度主观,标注间一致性(Cohen’s kappa)常常低到不可用
- 数学/代码正确性:这个反而不需要比较,直接可以程序化验证——这正是 RLVR 出现的原因
所以**”比较更便宜”有明确适用边界**:开放式生成任务成立,客观可验证任务上比较信息反而是浪费(直接打分就行)。
作者自己在下一段就承认了这个限定,这点很诚实:
不过这里要留一个很重要的限定,preference data 并不无条件比 demonstration data 便宜或者信息更多,有些问题中比较两个答案本身就很困难,人类之间也可能存在偏好分歧,而单次”A 比 B 好”的信息实际上传达的还不如一整段高质量 demonstration 多。所以它真正的优势是,在许多开放式生成问题上,comparison 往往提供了一种更容易扩展的监督接口,而不是所谓的 Free Lunch。我们都知道世界上是 no free lunch 的。
【补】这里可以补一个作者没展开但极其重要的点:为什么”可扩展的监督接口”比”信息更多”更关键。
因为 post-training 的成本瓶颈从来不是”人类标注员有多贵”,而是人类能不能规模化地提供信号。
- SFT 要人写完整回答 → 标注员产能有上限
- Preference 要人选 A/B → 产能高一个数量级
- RLVR 要程序判对错 → 产能无限,成本趋近于零
这条”监督信号成本递减”的线,就是整个 post-training 演进的内在动力。作者讲的”更可扩展”,和后面 RLVR 的爆发,是同一个逻辑的不同阶段。这篇文章写到这里停更,恰好停在整个领域下一步要爆炸的前夜。
第二个不足是 SFT 的上限很依赖 demonstration quality……第三个不足是 SFT 对模型自己会生成什么缺乏直接针对性,训练时它一直看 ground-truth trajectory,但推理时它走的是自己生成的 trajectory,如果模型容易在某些地方偏离,SFT 本身并不会直接针对这些”模型自己常犯的错误”优化。
第四个不足是 SFT 更多的是优化概率质量分布,而我们仍然可以尝试在 post-training 的时候让模型生成更好的输出,而不是只是增加好的输出的概率。
【评】这四个不足列得很漂亮,可以做个内部结构分析(这就是我在开头导读里说的”论证链”):
| 不足 | 对应的解法 |
|---|---|
| 只给一个好答案,不给比较 | → Reward Model(Bradley–Terry) |
| 上限受限于 demo 质量 | → 用模型自己生成候选 + 人类比较 |
| 不针对模型自己的错误 | → RL:在自己生成的轨迹上学 |
| 只提高概率,不优化质量 | → RL 最大化期望 reward |
这张表是整篇 Part 2 → Part 3 的接口。 作者写四个不足不是为了凑数,每个都精确对应后面一节。看懂这一层,这篇文章的组织能力就看得见了。
“第三个不足”就是我在上面批注里提到的 exposure bias——作者用大白话(”训练看 ground-truth,推理走自己的”)讲清楚了同一件事,这个表述比我上面引的术语更容易懂,原文这里写得好。
Part 3:Preference
原文
从 Demonstration 到 Preference:为什么我们需要比较
书接上回,SFT 固然已经很好……但是当我们提供数据的时候,我们发现很难写出一个唯一的标准回答,或者说这样的回答根本就不存在,但是比较哪个回答更好往往更容易。因此我们的想法自然地变成了,在模型已经学会怎么回答问题之后,让它回答得更好。而”怎么让模型回答得更好”,自然就是要让模型学习那些更好的回答。这就是我们为什么需要 Preference,以及它和 SFT 最本质的区别。一个提供一个参考答案,一个提供一个偏好关系。一个让模型模仿回答,一个告诉模型哪个更好。
我们当然可以自己生产数据。比如我们希望模型回答的详细,就写一点简略回答 vs 详细回答的样本……不仅仅可以自己写,现在我们还可以让模型生成数据,然后我们评价哪一个更好……但是在这里,我们可以更多地让模型自己承担生成答案,人类评价这个过程,这也就是后来 RLHF 所利用的分工。
同时,由于我们可以让模型自己生成答案候选,而我们通常关心的也正是模型自己会输出什么,于是监督信号就开始直接围绕模型自己的输出建立,这也是一个优势。
回顾一下,现在我们手上拥有的是一大堆数据:
我们现在只知道一个排序关系,怎么把它们转化成训练信号呢?
一个自然的想法是我们给更好的答案打分 1,给不好的答案打分 0,让模型去学习。但是我们这样实际只训练了一个分类器。或许给它两个答案,它能判断哪个更好,但是它其实没有办法评价某一个单独的答案”到底怎么样”。而后者是相当重要的。如果以后我们希望模型自己生成答案——打分——优化,即我们今天熟知的强化学习,那么一个好的打分函数是必不可少的。
【评】这一节有一处极其重要的转折,作者的铺垫做得非常好,值得标出来。
他把问题从”怎么把排序变成训练信号”逼到了死角:
- 直接分类(赢家=1,输家=0)→ 只能得到 pairwise 分类器,不能给单个答案打分
- 而 RL 需要的是:给我任何一个 answer,告诉我它值多少分
这个”必须从 pairwise 跨越到 pointwise”的要求,就是 Reward Model 存在的全部理由。作者没有明说,但他这段问答把动机铺得比大多数教程清楚。
【补】一个关键概念提前:作者说”我们只看重排序,不关心中间分数”,这个设计的名字和后果后面很快就会用到——
RM 的 loss 用的是分数差
- 分数可以整体加一个常数不变(translation invariance,作者下一节点名了)
- 但分数的尺度(scale)会漂移,而 RL 对尺度极其敏感
这就是后面”reward hacking”和”KL 惩罚”的技术根源。作者后面会自己走到这里。
怎么给答案打分:Reward Modeling
我们希望得到一个实值函数
,输入 prompt 和 response ,输出一个关于”这个 y 有多好”的打分。如果回答 1 的分数比回答 2 高,我们就可以说回答 1 更好。 那么问题是,只有两个回答之间的排序,怎么学到这样一个函数呢?一个自然的想法是建模成概率模型。因为本来谁是更好的答案就没有固定标准。我们不该把谁更好写成一个确定的判断规则,同时 human preference 本身就具有噪声和不确定性,那么概率模型就是自然的切入口。
假设我们已经有对回答 1 和回答 2 的打分,为了写成概率,考虑 softmax:
这里
是 sigmoid 函数。因此这就是一个我们非常熟悉的 Logistic Model。沿用经典 ML 理论里面的做法……损失函数写作
对于整个数据集就是:
【补】Bradley–Terry 的谱系,值得记住的跨学科脉络:
| 年份 | 来源 | 做了什么 |
|---|---|---|
| 1952 | Bradley & Terry(统计学) | 提出 pairwise comparison 的概率模型,原本用于分析实验动物选择 |
| 2004 前后 | Ziebart et al.(机器学习) | 把 BT 和最大因果熵结合起来,成了 Inverse RL 的核心工具 |
| 2017–2019 | Christiano et al.(DeepMind/OpenAI) | 用 BT 从人类偏好学 reward,RLHF 成型 |
| 2022 至今 | InstructGPT 之后 | 成为所有对齐流水线的标准件 |
这条脉络本身就是”一个好想法能用多久”的最佳注脚:一个 1952 年的统计模型,因为 LLM 需要把”人类比较”变成”可微目标”,直接复活成了整个 AI 对齐的地基。作者讲 BT 时只讲了数学,没讲这段历史,我补上。
**【评】关于”为什么用 softmax 而不是别的”**,作者一句”考虑 softmax”带过了,但这里值得多说一句:
选 softmax 不是随意的。它满足一个关键性质:两个选项的比较概率只依赖分数差。这个性质保证了”给全部分数加常数不改变预测”,也就是下一段的 translation invariance。如果换成别的 linkage function,这个漂亮的性质就没了。
从 Reward 到 Policy:什么是强化学习?为什么我们需要强化学习?
在上一节中,我们解决了如何评价一个答案好不好的问题。现在的问题自然是,怎么让模型更多的输出更好的答案。Reward model 并不能自己解决这个问题,因此我们希望模型能够根据 reward model 相应的调整自己的生成策略,即输出的概率分布,来输出更好的答案——这就引出了强化学习。
强化学习的设定就是一个 Agent 不断地和 Environment 交互……一般来讲,这个过程可以概括为
我们通常假设环境具有 Markov 性质,具体地,我们假设
这里的一个误区是当前状态与过去状态无关,不应该这么理解,而是上一个时间的状态已经包含了之前状态的所有信息,因此更早的状态不会增加额外信息。
比如在 LLM 中,我们有非常自然的状态:
其中
是 prompt, 是已经生成的 token。那么更早的状态的信息已经被包含在更晚的状态的信息里面了。 因此在经典强化学习中,我们也会将环境建模成一个 Markov Decision Process,MDP。
其中
是状态空间, 是动作空间…… 是奖励函数, 是 discount factor……因此我们定义 discounted return,
因此直觉上,
越小,策略越容易靠向贪心。如果 靠近 1,模型可能学到如何平衡短期和长期收益。
【校】这里有一处概念性歧义,虽然不影响后面的推导(因为 LLM 里
作者说”
准确表述:
越小 → 折扣越重 → 越”短视”(myopic),即只看眼前奖励 → 越有远见,会为长期收益放弃眼前利益
“贪心”(greedy)在 RL 里有专门含义,指”每步选当前最优动作”,跟折扣因子是两个维度的事。作者真正想表达的是”越近视”,用”贪心”这个词容易和 greedy policy 混淆。
【补】LLM-RL 的
强化学习学习的核心对象是 Policy,策略。一个 stochastic policy 可以写成
即在状态
下采取动作 的策略。LLM 天然是一个 policy,因为 LLM 实际上是在计算
条件是当前状态,下一步动作就是输出哪个 token。
有了 agent、environment、policy 之后,我们称 agent 从开始到结束的一整条路径为 Trajectory,轨迹。一般写成
对于 LLM 而言,一段 trajectory 可以简单理解为整段生成过程。
现在我们可以正式定义强化学习的目标了。Policy 会跟环境相互作用诱导出一系列的 trajectory,所以我们定义 Expected Return
因此我们的目标是找到最好的参数:
这就是强化学习的数学意义。
【评】”LLM 天然是一个 policy”是整个 Part 3 的支点论断,值得停下来确认它有多强。
这个类比之所以有力,是因为它是精确的、不是比喻的:
| RL 概念 | LLM 对应 |
|---|---|
| state | |
| action | 下一个 token(从词表里选一个) |
| policy | 模型本身 softmax 后的分布 |
| trajectory | 一条完整生成(prompt → response) |
| reward | RM 给整条回答打的分 |
| horizon | 回答的最大长度 |
这张表的意思是:训练语言模型的一切方法,本质上都是在某种监督信号下改变这个 policy。 SFT 用的是固定数据集上的 CE,RL 用自己采样的轨迹 + RM 打分。作者讲完这张隐含的对应表,后面所有的公式都不新鲜了——只是同一个 policy gradient 换着花样降方差。
相比于 SFT 在固定的数据集上告诉模型该生成什么样的答案,RL 让模型自己生成答案,打分,再修改策略/参数让模型多生成高分答案,少生成低分答案。只要我们有一个足够好的 Reward Model,模型理论上就可以通过自己学习达到很好的效果。某种意义上,今日的 R1、RLVR 等算法也是建立在这个思想之上的,无非是 Reward Model 和 Verifier 的区别。
但是 RL 也不是随便探索,模型的探索会强烈的受到当前 state 的限制。这也是为什么我们一般不随机初始化 RL,而是先 SFT,在一个已经相对合理的状态上继续 RL。
【补】作者这里说的”RM 和 Verifier 的区别”,是当代最重要的分野之一,值得展开成一张表:
| 范式 | reward 来源 | 代表工作 |
|---|---|---|
| RLHF | 人类偏好训的 reward model | InstructGPT、Anthropic 的早期工作 |
| RLVR | 程序化验证器(数学对答案、代码跑测试) | DeepSeek-R1 的 RL 部分 |
| RLAIF / Constitutional AI | 另一个 AI 模型当 judge | Anthropic CAI、各类 LLM-as-judge |
| self-rewarding | 模型自己给自己打分 | 各类 self-play(作者前言提到的 Self-Improvement) |
作者点出这点说明他的视野是到 2026 年的。**”self-rewarding / self-improvement” 就是他在前言里列的最后一个方向**,而这条线是目前最热也最不可靠的方向——模型给自己打分,很容易走进 reward hacking,这本身是个大问题。
Policy Gradient:怎么根据 Reward 修改一个随机 Policy?
在上一节中,我们已经把强化学习的目标定为最大化
其中
。那么一个自然的做法就是做 Gradient Ascent。
所以问题变成求梯度。
我们介绍一个简单但重要的技巧,log-derivative trick:
移项得
于是上述梯度变成
这样做的好处是这又变成了一个期望:
于是
【评】log-derivative trick(又叫 REINFORCE trick)为什么是这一节的神来之笔,值得单独说。
它解决的是一个根本性障碍:
这个技巧的妙处是:把不可微的部分从梯度里摘出去,塞进期望里当权重。
- 不可微的
→ 变成期望里的系数 - 可微的
→ 变成真正要算梯度的部分
于是采多少样本、怎么算梯度、怎么更新,全部交给标准深度学习框架。没有这个技巧,整个 RL for LLM 都不存在。 它也是”score function estimator”这个名字的由来。
继续展开 trajectory 的概率,一条 trajectory 的概率是:
我们要对
求梯度,而注意到求和号里面的部分中的第二项只取决于环境,与 无关,于是
代回
这就是最原始的 Policy Gradient。这个公式其实完美印证了我们上一章结尾时的直觉,即一条轨迹如果好,就多生成,如果差就少生成。
REINFORCE 就是建立在这条公式之上的。它采用 Monte-Carlo Sampling,用采样的均值近似期望然后做梯度更新,就是最原始意义上的 REINFORCE。
**【补】补一个 LLM 场景下这个公式的具体长相,因为从这里开始内容才真正”可跑”**:
在 LLM 里展开成 token 级别:
也就是:整条回答共享同一个 reward
这个”reward 在整条回答上广播给所有 token”的机制,就是 REINFORCE 用在 LLM 上的全部。 而后面所有的改进(baseline、advantage、GAE、PPO importance ratio),改的都是”乘在梯度前面的那个系数”怎么算。作者最后一节的总结会明确说这一点,可以提前带着这个预判去读。
当然有一个很显然的改进。我们相当于对每一个动作赋予了相同的权重
,但是它们不应该拥有相同的权重。如果 因为第二步做了一个很好的选择导致很高,而后面的选择都平平无奇……我们显然不应该因为第二步的好给后面的选择也增加权重。因此我们可以考虑用 替换 。这样公式改写为
我们把过去的 reward 扔掉,这是严格成立的。考虑任意的
,令 为直到 的所有历史,有
因此我们可以严格的推导出经典的 Policy Gradient:
REINFORCE 就是在这条公式的基础上跑多条轨迹,然后用均值近似期望进行参数更新。
【评】这段推导是全文技术含量最高的一处,作者的写法非常干净,值得逐行看懂。
它证明了:从
关键那一步是倒数第三行:
核心在于”对所有可能动作求和等于 1 这个归一化约束”。这个恒等式会在全文出现第三次(baseline 那一节又是一次),是 policy gradient 的通用武器——所有”给梯度乘一个不改变期望的系数”的技巧,根源都在这里。
【补】一个作者没提但很重要的 LLM 特化点:
在 LLM-RLHF 里,
它真正开始起作用,是从 process reward / step-level reward 开始的——也就是把 reward 细分到每一步。作者推导得很严谨,但读者要意识到:这步改进在 LLM 主流管线里,要到 PRM 时代才兑现。
到这里,问题也随之出现了——REINFORCE 用几次 rollout 得到的
来评价一个 action,但 只是一次充满随机性的未来样本。如果我们想进一步理解一个 state 或一个 action 在期望意义上究竟有多好,就需要从随机的 走向它的条件期望。而这正是下一章 Value Function 和 Q Function 要解决的问题。
【评】这一句过渡是全文结构最漂亮的地方。 它精确地定义了下一章要解决的全部问题:
从”一次采样的随机估计”走向”条件期望下的理论真值”
方差是 REINFORCE 的病灶,而期望是解药。后面降方差的整条技术线(V/Q → baseline → A2C → GAE)都是这句话的展开。
Value,Q,Bellman Equation,Q-learning
书接上回,我们讨论了
的局限性,它是一条随机轨迹上得到的结果,我们希望衡量一个动作或者状态到底有多好,用一条轨迹上的 return 显然是不科学的。这引出了我们今天的主题,Q Function 和 Value Function。 定义也非常自然,我们考虑 return 的期望,因而定义 Value function
为
的状态下,按照策略 继续行动的期望回报。同理定义 Q function
为在状态
下,下一步选择动作 ,之后按照策略 继续行动的期望回报。 我们如果稍微展开,其实可以很自然的看出这两个函数间的关系……考虑所有可能的下一步动作,有
也就是
至于 Bellman Equation,无非就是进一步再展开,得到纯 V 或者纯 Q 的式子:
合并起来得到 state-value Bellman equation
以及 action-value Bellman equation
**【评】到这里作者完成了一次漂亮的”问题升级”**,值得标出它的逻辑:
1 | G_t(一次采样的随机数) |
Bellman 方程的真正含义一句话:它把”无限未来的期望”压缩成”一步奖励 + 下一步的自己”。没有这个递归,V/Q 只是定义,算不出来;有了它,才有后面一切算法。
【补】一个作者没点名但应该知道的背景:这套东西(MDP、Bellman、value/policy iteration)全部来自 Sutton & Barto《Reinforcement Learning: An Introduction》(1998 初版,2018 第二版)和更早的 Bellman(1957,动态规划)。LLM 对齐用的 RL,数学地基是 70 年前的动态规划。 这不是”老东西新用”的感慨,而是一个实用提示:凡是 policy gradient 里看不懂的,先去翻 Sutton & Barto 对应章节,基本都有。
目前为止我们已经有足够的标准评价一个 state 或者 action 怎么样了。回到强化学习,我们希望找到最好的 policy 使得 return 最大。由于 policy 只直接决定 action,所以最优策略就是选择每一步期望回报最大的 action。我们定义最优 state-value function 以及最优 action-value function
最优策略
那么这个时候 Bellman equation 会发生一个关键变化,之前我们算的都是下一步动作,下一个状态的期望,现在我们每一步都选择最优的策略,因此下一步的期望会变成下一步的最大值。从而有
如果我们把第一个式子看成作用在
上的一个算子,这是一个压缩映射,那么可以通过反复迭代找不动点算出最优的 。这就是所谓的 Value iteration。 我们同时也有 Policy iteration。具体地,这个过程分为 evaluation 和 improvement 两个部分。Evaluation 部分在给定当前策略的情况下求出价值函数,即解 Bellman equation。Improvement 部分在算出价值函数之后,在每个状态上重新选一个当前看起来最优的动作,即贪心地更新策略,可以严格证明这样得到的策略不比旧策略差……
具体来看,对于当前策略
,我们已经知道
也就是说,
本质上是当前策略在状态 下对不同动作的 做加权平均。因此一定有
于是我们总可以构造一个新的策略
使得对任意状态
都有
这会进一步推出
因此,每次对当前
做 greedy improvement,都不会让策略变差。如果某个状态上存在严格不等式,那么新策略在至少一些状态上的价值会严格提高。 反过来,如果对于所有状态,都已经不存在比当前策略更好的动作,即
那么当前的
已经满足 Bellman optimality equation,因此当前策略已经是最优策略。
【评】policy improvement theorem 的证明,作者写得比很多教材清楚。 核心就三步,抽出来:
是 的加权平均 → 最大值一定 ≥ 平均值- 按最大值构造新策略 → 新策略处处不差
- 无处可改进 ⟺ 已满足 Bellman 最优方程 ⟺ 已是最优
【补】但要补一个作者没说的关键限定:上面这一整套(value iteration、policy iteration)的前提是状态动作空间小到能列表(tabular)。LLM 的状态空间是”所有可能的 prompt + 已生成前缀”,动作空间是整个词表——这套精确方法在 LLM 里一个都跑不起来。它们在这里的价值是思想地基:后面所有近似方法(TD、Q-learning、actor-critic)都是”把这里的精确计算换成采样近似”。带着”这是理想情况,现实要近似”去读,下一节的 transition 才顺。
到这里为止,我们讨论的方法都有一个重要前提:环境模型是已知的,即我们知道
因此能够显式计算 Bellman equation 中关于下一状态和 reward 的期望。但是实际问题中,我们往往并不知道完整的 transition model,只能够与环境交互:给定当前状态
和动作 ,环境返回一个新的状态 以及 reward 。 这就引出了 Model-Free Reinforcement Learning。
一个最直接的想法就是回到 Value Function 最原始的定义……虽然我们无法直接计算这个期望,但是可以通过采样来近似它。从状态
出发,按照策略 运行许多条完整 trajectory……用这些 return 的平均值近似 Value Function:
就是 Monte Carlo Policy Evaluation……
不过这种最原始的 Monte Carlo 方法存在一些明显的问题。首先,必须等一整条 episode 结束以后才能得到
并进行更新;其次,一整条 trajectory 中包含大量随机性,因此 的方差通常较大,并且 episode 越长越明显。 更重要的是,我们其实已经知道 Bellman equation:
它告诉我们,要估计当前状态的价值,并不一定非要等整条 trajectory 结束。因此我们有了 Temporal Difference,TD。
假设当前处于状态
,按照策略选择动作之后,环境给出了 reward 并转移到状态 。根据 Bellman equation,
可以作为当前
的一个新的估计。因此可以进行更新
这就是 TD 方法。定义
为 TD error,那么更新可以简单写成
这里
是在观察到下一步结果之前,对未来 return 的预测,而
是在观察到新的 reward 和下一状态之后得到的新预测。TD 所做的就是让旧的预测向新的预测靠近。
TD 和 Monte Carlo 最大的区别在于它们的目标不同。Monte Carlo 使用实际完整 return:
而 TD 使用一步之后的估计:
Monte Carlo 不依赖当前的 value estimate,因此没有 bootstrapping,即用一个估计值更新另一个估计值,但是必须在结束以后才能更新。TD 则使用当前的
来更新 ,因此 TD 可以在每一个 time step 都进行更新,通常 variance 更低,但由于当前的价值函数本身也是估计出来的,因此不可避免会引入一定偏差。
【评】”bootstrapping”这个词作者解释得很到位(”用一个估计值更新另一个估计值”),值得记住,因为它是理解 TD 全部优缺点的钥匙:
| Monte Carlo | TD | |
|---|---|---|
| 目标 | 真实完整 return | 一步 reward + 自己对未来的估计 |
| 偏差 | 无(unbiased) | 有(bootstrap 引入) |
| 方差 | 大(整条轨迹的随机性) | 小(只看一步) |
| 更新时机 | episode 结束 | 每步都能更新 |
这张表和前面的 bias-variance 主线是同一个故事:GAE 那一节会把这张表变成一个连续谱(
【补】TD error
在 LLM-RL 里
这个直觉直接通向下一节的 Advantage——TD error 本质上就是 advantage 的单样本估计。作者下一节会严格证明这一点。
同样的 TD 思想也可以作用到 Q Function 上。对于固定策略
,action-value Bellman equation 为
因此,我们可以按照当前策略实际进行一次交互,得到
然后利用这个 sample 更新
这就是 SARSA。这个名字来自一次更新过程中使用的五个量:
其中
是在状态 下按照当前策略真正采样出来的动作。因此,用来收集数据的 policy 和我们正在评估、改进的 policy 是同一个,SARSA 是一个 on-policy 方法。 但是我们的最终目标并不只是评价一个给定的策略,而是找到最优策略。前面已经得到 Bellman optimality equation:
和 TD 一样,我们可以使用一次真实环境交互得到的
来近似其中的 expectation,于是得到
这就是 Q-learning。Q-learning 本质上就是 Bellman optimality equation 在不知道环境模型时的 sample-based implementation,也可以理解为 Q-value iteration 的 model-free 版本。
跟 SARSA 不同,我们用来评估模型的策略和实际更新的策略不一定是同一个,因为这里出现了
所以 Q-learning 是一个典型的 off-policy 方法。
【评】SARSA vs Q-learning 的区别,作者用一句话点透了:差就差在更新式里有没有那个
- SARSA 用实际采样到的
→ 评估的是”我现在这个策略” → on-policy - Q-learning 用
→ 评估的是”最优策略会怎么做” → off-policy(行为策略和目标策略可以不是同一个)
【补】为什么 off-policy 在 LLM 时代变得极其重要(作者没提,但这是理解 DPO 的钥匙):
on-policy 要求”数据必须来自当前策略”,采一条扔一条,贵。off-policy 允许复用旧数据(replay buffer)甚至用别人的数据。DPO 之所以能火,一个重要原因就是它完全不需要在线采样——直接拿现成的偏好对做 supervised loss,sample efficiency 高一个量级。作者这篇停在 GAE,所以没讲到,但 SARSA/Q-learning 这一节正是 DPO 的思想前置。
到这里,我们可以把这一整条路线串起来。最开始,我们使用一条 trajectory 上的 return
衡量结果,但是单条轨迹具有很强的随机性,因此定义
和
用期望来描述状态和动作的长期价值。Bellman equation 又进一步揭示了这种价值的递归结构。如果环境模型已知,可以直接利用这一递归关系进行 Value Iteration 或 Policy Iteration。如果环境模型未知,则必须采样去近似其中的期望。采样完整轨迹就得到了 Monte Carlo 方法,而只向前采样一步并利用当前 value estimate 做 bootstrapping,就得到了 TD 方法。把 TD 用于固定策略下的 Q Function,得到 SARSA;把 TD 用于 Bellman optimality equation,则得到 Q-learning。
因此这一节本质上一直在解决同一个问题:如何估计一个 state 或 action 的长期价值,并利用这个价值不断改进 policy。
在下一节中,进一步的,我们希望进一步降低 variance,因此我们将会讨论 Baseline 和 Advantage,进而引出后面的 Actor-Critic 等算法。
【评】这个收束段是全文”串线”手法的又一次示范。 如果只记一条,记这句:
采样完整轨迹 → Monte Carlo;向前采样一步 + bootstrap → TD;TD + 固定策略 → SARSA;TD + 最优方程 → Q-learning。
四个算法一句话摆平,而且每个都是上一个的自然变体。这就是好教程和堆砌公式的区别。
Baseline 与 Advantage:怎样降低 Policy Gradient 的方差?
我们之前提到,
给出的是一个绝对回报水平,而这个值往往受到状态本身好坏以及轨迹采样随机性的影响,因此 Policy Gradient 的 variance 很大,并且我们无法通过 来区分到底是这个状态好,还是这个动作好。 最自然的第一步想法是用期望替代,因此我们很挺容易的联想到 Q function。改写后的 Policy Gradient 写作:
这样我们消除掉了采样随机性的影响,但是我们还是无法区分到底是这个状态好,还是这个动作好。
下一步一个很自然的想法是,考虑用某个相对好坏替代这个绝对水平。即选定
,这个 可以在某种程度上表示了 这个状态的好坏,然后用 作为相对 return 来更新,这样 Policy Gradient 更新式变为
我们希望期望不变,因此
假设
与动作选择无关,展开左边得到
于是我们只需要
与动作选择无关。一个自然的选择是 。此时我们记 ,这就得到了最经典的 Baseline 和 Advantage。Value function 作为 Baseline 自然表示当前状态下的期望回报,因此 自然表示当前状态下选择这个动作比平均好多少。减去均值之后,包含的信息完全一样,但是一方面我们除去了状态本身对动作回报的影响,另一方面降低了数值尺度,从而降低了方差。 把 baseline 取成
之后,Policy Gradient 就变成
到这里自然的我们会问,这个式子固然好,但是现实中
和 本身并不知道,那么 Advantage 到底怎么估计?我们将在下一节讨论这个问题。
【评】注意这个证明和前面”扔掉过去 reward”用的是同一个恒等式(
(扔掉过去)- baseline 不改变期望(减去均值)
- (后面 GAE 也会用到类似思想)
同一个数学把戏解决三个不同问题——这就是 policy gradient 理论的美感所在,也是作者没有明说但结构上一直在展示的东西。
【补】Advantage 的直觉,作者讲清楚了定义但可以再给一个更落地的版本:
回答:”在这个状态做这个动作,期望能拿多少分”(绝对) 回答:”这个状态平均能拿多少分”(基准) 回答:**”这个动作比平均水平好多少”**(相对)
RL 只关心相对好坏:好动作多做、差动作少做,”好”是相对于当前状态的平均而言的。这就是为什么 advantage 比 raw return 更适合做梯度权重——它自动把”状态本身很好”这个 confounding factor 扣掉了。
作者最后抛的问题(”
从 Baseline 到 Actor-Critic 和 GAE
在上一节的最后,我们提到了现实中
和 是未知的,所以虽然理论公式漂亮,但目前还不是一个真正可以直接运行的算法。那么如何得到强化学习所需要的 advantage 呢?想法是自然的,既然不知道,就训练一个网络去学习它。我们如果学习一个 去近似 ,那么 policy gradient 变成
在这个更新式中,有两个部分需要我们学习:策略
和 评价函数 ,这就对应了标题中所说的 actor 和 critic,自此模型变成了我们所说的 Advantage Actor Critic,A2C。Actor 在行动,Critic 在评价,Critic 的评价再指导 Actor 学习,这就是整体的逻辑。 但是如果我们还得精确学习一个
再减一个 ,事情还是比较麻烦。于是有了很精妙的一步。 定义 TD error
我们尝试计算一下其条件期望。
这样我们就不需要又学习 Q 又学习 V 了。我们只需要学习一个
去近似 就能实现这个预测。 但是这也同样有问题。一步 TD 太”短视”了,它只看真实的
,然后立刻用 去猜剩余的所有未来,而如果 Critic 现在还不准,这个误差就会直接污染 Advantage。GAE 的核心思路就是多看几步真实的 reward,再用 critic 估计剩下的部分。定义 k-step Advantage
并用其替代之前的
。对于 和 的两个极端,我们可以发现这就对应 A2C 和 完整的 Monte Carlo。GAE 是把这两个方法连接起来的中间桥梁。 但是这还不是 GAE 的全部。如果只取某个固定的
,不可避免地要在 bias 和 variance 之间做抉择,这也是一个经典的问题,叫做 bias-variance tradeoff。 于是 GAE 说,我全都要!
定义
即对不同 k-step Advantage 做指数加权平均。进一步代入所有的 k-step Advantage 可以得到最常见的 GAE 公式:
读者可以自行验证,这里的
刚好对应了 A2C 和 Monte-Carlo。 GAE 通过衰减远期权重,在 Monte Carlo 和 one-step TD A2C 之间提供连续的 bias-variance tradeoff,不过它并没有完全避免这个问题。实际应用中,比如 PPO,我们通常取
这种中间值,以求尽量取得 bias-variance balance。 到这里,我们已经可以把整个 policy gradient 串成一条线了。我们可以发现 policy gradient 的骨架完全没有变化:
我们所做的只是不断优化
,以求保持良好预测的同时降低方差。最开始我们用 Monte-Carlo 采样整条轨迹的 reward ,后来因为当前行动不能改变过去换成了 ,并且我们发现这确实不改变期望。在意识到 无法区分当前效果有多少来自状态,多少来自策略选择的行为之后,我们给出了 V 和 Q,并发现用 Q 正是 Monte-Carlo 的期望,并用之降低方差。进一步,我们以 V 作为 baseline,定义 advantage 为 Q-V,进一步降低方差,同时让语义更明确的表示当前 action 相对基准到底有多好。进一步,这一章我们发现这个式子不能作为现实算法,于是介绍了 A2C,并进一步扩展到 GAE。我们一直在寻找一个更适合实际估计、更低方差、更容易在线计算的量,来估计当前选择到底有多好。
【评】作者这个收束段是全文最值得背下来的一段。 它把 policy gradient 的演进史压缩成一句话:
骨架(
)从来没变过,变的只是乘在前面的系数 : → → → → GAE。
每次改进都在回答同一个问题:**”用什么量来衡量当前这个选择有多好,又好算、方差又低?”**
【补】GAE 的出处和它在 LLM 里的实际地位:
- 出处:Schulman et al., “High-Dimensional Continuous Control Using Generalized Advantage Estimation”, ICLR 2016(arXiv 1506.02438 是 TRPO,GAE 是 arXiv 1509.02971… 准确说是 Schulman, Moritz, Levine, Jordan & Abbeel, 2015)。注意 GAE 最早是为连续控制(机器人)设计的,不是为 LLM。
- 在 LLM-RLHF 里,GAE + PPO 曾是 InstructGPT 的标准配置(
)。 - 但今天的主流已经变了:DeepSeek-R1 带火的 GRPO(Group Relative Policy Optimization)干掉了 critic——用同一 prompt 采样一组回答,以组内均值做 baseline,连
都不学了。作者这篇停在 GAE,所以没讲到,但这是 2024–2026 最重要的一次”返璞归真”:**baseline 的思想还在,只是实现从”学一个 V”退化成”算一组平均”**。
作者说”
为什么 Policy Gradient 还不够:从 TRPO 到 PPO
回到历史:强化学习偏好优化的发展
InstructGPT:完整 RLHF Pipeline 成型
RLHF 的局限
(To Be Continued)
【评】原文到这里就断了。 四个标题全是空的,(To Be Continued) 是作者原话。结合前言”写作周期 2-3 个月、年底前填完”,这篇目前是上半部。
我按作者的 outline 推测下半部他会写什么(纯属推测,原文没有):
- TRPO → PPO:Policy Gradient 步子太大 policy 会崩 → TRPO 用 trust region 约束 KL → PPO 用 clip 把它变成一阶方法(Schulman et al. 2017)。这是”怎么让 PG 更新稳定”的故事。
- 回到历史:大概是从 RLHF 的完整时间线(Christiano 2017 → InstructGPT 2022 → Anthropic HH → DPO 2023)。
- InstructGPT:SFT → RM → PPO 三段 pipeline 成型(Ouyang et al. 2022)。
- RLHF 的局限:reward hacking、分布偏移、RM 过拟合、人类偏好本身的不一致——这些正是 DPO / RLVR / GRPO 要解决的。
我的总评
这篇好在哪。 三点:
- 论证链完整:每个新概念的出场动机都交代了。从”我只会给一个好答案”到”我要比较”,从”只有排序”到”我要打分函数”,从”有分数”到”我要改策略”,从”方差太大”到”我要降方差”——读者永远知道”为什么需要这个东西”。
- 数学是完整的:从 SFT 的 CE 到 BT 的 sigmoid,从 log-derivative trick 到 policy improvement theorem 的证明,从 SARSA/Q-learning 到 GAE,关键推导一个没跳。很多教程讲 RLHF 是讲故事,这篇是讲数学。
- 历史感是准的:2018 四篇的定位、GPT-2/GPT-3 的承接、ULMFiT 和 LIMA 的呼应,时间线和因果都没错。
缺什么。 也是三点:
- 停在 2023 年以前:DPO(2023.5)、KTO、ORPO、GRPO(2024)、RLVR/R1(2025)、一切 agent 训练,统统没有。按今天的标准,这篇覆盖的是”RLHF 1.0”,而工业界已经在”RL 2.0”。
- 工程细节偏少:KL 惩罚怎么写、PPO 的 clip 到底 clip 什么、RM 怎么防过拟合、instruct 数据配比——这些决定成败的东西都没展开。不过作者定位是”讲原理”,这不算错。
- 个别概念表述可再严谨:
那处”贪心”的用词(正文已校)、response-only loss 的行业地位(正文已补)。
适合谁读。 已经懂 SFT、想真正理解 RLHF 在干什么的人。不适合零基础(Part 1 的历史部分可以跳着看,Part 2 的数学是热身,Part 3 才是本体)。
一句话。 这是一篇”从原理出发重建 post-training 脉络”的学习笔记,不是 survey。它最大的价值不是覆盖面,而是让你看到每个方法为什么必然出现。等作者把下半部(PPO/DPO/RLVR)写完,我会继续跟进批注。
参考
- 原文:https://zhuanlan.zhihu.com/p/2081167589028401987(连载中)
- Sutton & Barto《Reinforcement Learning: An Introduction》(第 2 版,2018)—— Part 3 对应的权威教材,符号体系与本文一致
- Schulman et al., GAE (2015) / TRPO (2015) / PPO (2017)—— policy gradient 三部曲
- Ouyang et al., InstructGPT (2022, arXiv 2203.02155)—— RLHF pipeline 定型之作
- Zhou et al., LIMA (2023, arXiv 2305.11206)—— “superficial alignment hypothesis” 出处
- Rafailov et al., DPO (2023, arXiv 2305.10500)—— 原文没写到,但读完 Part 3 应该直接去读这篇
- 创建于 : 2026-10-10 20:30:00
- 更新于 : 2026-10-11 17:26:35
- 版权声明: 本文章采用 CC BY 4.0 进行许可。