跳到主要内容

阅读笔记 — Post-Training AI (Ben Burtenshaw, O'Reilly Early Release 2026)

原文只有两个正章(Early Release,全书计划 9 章只出了 2 章):

  • text/04-ch01-chapter-1-introduction-to-post-training.txt(38,724 字符)
  • text/05-ch02-chapter-2-speed-run-post-training-from-first-pri.txt(36,220 字符)
  • 01/02 是书名页/版权页,03 是简目,06 是作者简介——导航章,不读不引(作者简介的内容记在下面,只用于总纲 §2)。

行号 = 段号。每章开头 L4–10 是 Early Release 通告,不引。

Chapter 1. Introduction to Post-Training

§1.1 What post-training is and isn't

  • L12:今天生产环境里每一个有用的语言模型都经过后训练;它们不是下一个词预测模型;被进一步训练来「听指令、拒绝危险请求、推理、匹配产品」。
  • L14:后训练 = 第二次训练;比预训练短、便宜,但决定用户体验的大半。
  • L24(预训练):吃数万亿 token(网页/书/代码/论文);目标 = 预测下一个 token;无监督;学到语言的统计结构 + 广而杂的世界知识。
  • L26(预训练贵):几千张 GPU 跑数周到数月,数据几十 TB;产物 = base model,能「像样地续写任何文本」但不会回应用户;问它问题,它可能回答、可能再生成五个问题、可能续写一段教科书。
  • L28(后训练):更小、更有针对性的训练;数据几千到几百万条(不是万亿 token);数据是策展过的、结构化的、为特定行为设计的。
  • L30:两个阶段优化的信号不同;只用策展数据从零训 = 更差(没有广泛表示);跳过后训练 = 有知识没纪律。
  • L38(SFT):输入-输出示例对;目标仍是下一 token 预测;教格式与风格(结构、列表、多轮、JSON/代码)。
  • L40:SFT 教模仿;没有区分「好答案 vs 平庸答案」的信号;不能超过示范水平
  • L42(偏好学习):同一 prompt 的成对回答,一标 preferred 一标 rejected;训练模型给 preferred 更高概率。经典 RLHF = 先训奖励模型再用 RL 优化;DPO 去掉奖励模型这一步。
  • L44(RLVR):正确性可自动核查的任务(有答案的数学题、带单元测试的代码、可验证结论的结构化推理);模型生成候选→验证器核查→更新;奖励信号来自任务本身。
  • L46:DeepSeek-R1 证明可验证奖励在数学/代码/多步推理上的提升是 SFT+偏好学习给不了的。
  • L48:不是每个模型都要三段全上:结构化抽取模型可能只要 SFT;通用助手要偏好学习;数学/代码模型要可验证奖励。
  • L54(不能加知识):基础模型权重里没有的医疗知识,后训练变不出来;SFT 能教医疗格式、偏好学习能教谨慎措辞,但会产出流畅、格式漂亮、可能错误的医疗文本。
  • L56(不能补能力):算术差,后训练只能改善训练时见过的题型,给不出通用算术能力;RL 也在预训练建立的表示能力之内工作。
  • L58(不能根除深埋行为):安全微调只在见过的格式上教拒绝;对抗用户总能找到新格式绕过;这不是技术失败,是「后训练在预训练定义的表面上调整行为」的后果;模式越深,少量数据越盖不住
  • L60(不能替代数据基建):坏 SFT 数据教坏习惯;噪声偏好数据训出失真的奖励模型;不可靠的验证器奖励错误答案。
  • L62(不能解决对齐):只在数据覆盖的分布内更安全;遇到没见过的情形无保证;是当前最佳实践,不是已解决问题。

§1.2 Why Post-Training Matters Now

  • L72(经济账):API 按 token 付费,大多数场景够用;但 token 成本、速率限制、治理约束、版本变更随规模变难接受。
  • L74:每月一百万通客服对话/百人团队编码助手/百万用户消费品 → API 成本随采用线性涨;需求侧没有规模经济;第一百万通对话的边际成本和第一通一样
  • L76:自有模型成本结构 = 前期训练投入 + 持续推理;优化后自托管推理的每 token 成本是 API 的零头;盈亏平衡点来得比多数团队预期的早。
  • L78:控制权:API 是你控制不了的依赖;供应商可改行为/定价/限制/条款/可用性;看不了权重、复现不了行为、改不了模型;提示工程相对训练是钝器
  • L80:自有模型:控制行为/响应/演进;可领域专精;可放自己基建、安全边界、数据治理内;可周更/日更。
  • L82-88(开源浪潮):瓶颈曾是好 base model 的获取(从零预训练 = 数百万美元工程);2023–2025 破局:Meta Llama(7B/13B/70B/405B 宽松许可)、Google Gemma、阿里 Qwen(Apache 2.0 + 完整配方)、DeepSeek(直到 R1)。
  • L92(Llama 3 配方):迭代式流水线:拒绝采样生成候选 → 用最好的候选做 SFT → DPO 对齐;跑了五轮,每轮输出当下轮的数据生成起点;训练数据是合成的(上一版模型生成 + 质量过滤)。
  • L94(Qwen 2.5 配方):SFT+DPO+GRPO,约 100 万条后训练样本;0.5B–72B 全家族 Apache 2.0,带训练配方、评测脚本、量化支持。
  • L96(DeepSeek-R1):GRPO(不需要单独 critic 网络)直接在可验证答案的任务上训;R1-Zero 完全跳过 SFT、纯 RL,自发涌现思维链推理;完整版 R1 加回 SFT + 迭代精炼,数学/代码/推理基准上与 OpenAI o1 竞争;权重+蒸馏版+代码 MIT 许可。
  • L98:剩下的工作是工程:为具体应用设计数据、奖励函数、训练配置。
  • L102-106(提示词的税):system prompt 每次请求都要重发重读;2000 token 的 system prompt = 每次 API 调用先付 2000 token;模型每次重新解读,遵循度随输入浮动;长 prompt 内部还会打架。
  • L108:RAG 在推理时注入文档,解决知识限制,不解决行为限制;指令还是每次重新解读。
  • L110:微调后行为进了权重:不占上下文 token、不用每次重新解读;指令变成学到的行为
  • L112-114:适合进权重的是要跨输入一致的行为:语气、格式约定、安全边界、领域术语、推理模式;生产常见三层组合:后训练管稳定行为,提示词管任务级变化,RAG 管动态知识。
  • L118-122(agent 转向):agent = 在环境里多步行动(写/跑/调代码;搜/读/综合;读账户/决策/执行);需要规划、纠错、工具、自验证——是学出来的行为,不是提示工程出来的;agent 行动的结果常可验证(代码编译与否、测试过否、文档答没答上),所以 RLVR 是自然匹配;trajectory = 动作与观察的序列,按结局给奖励;与 R1 同一循环扩展到多步。
  • L124(agent 训练三难):回合更长 → 信用分配更难(十步后失败,哪步错?);动作空间更大(工具/代码/结构化输出);需要环境(沙箱、API、模拟用户)。
  • L126:工具在演化;后面章节讲环境设计、多步奖励构造、agentic RL 配置。

§1.3 The Post-Training Stack

  • L132-136(SFT 机制):数据 = 对话或指令-补全对;例:user「用两句话讲 TCP 和 UDP 的区别」+ system 人设 + assistant 回答;只对 assistant 回答的 token 算损失,user/system 位置的 token 从损失里掩掉。
  • L138(chat template):用特殊 token 标记角色边界;各家族不同(Llama 一套、Qwen 一套);TRL 替你抽象;模板错 → 输出畸形或无视 system prompt
  • L140:SFT 是最快的阶段;数据质量压倒数量:一千条高质量 > 十万条噪声
  • L142:SFT 的效果立刻可见(输出变成 chat template 格式),但仍只是模仿;不会评估自己的输出。
  • L148(RLHF 三段):OpenAI InstructGPT 论文 2022;① SFT;② 人标注员比较成对输出 → 训奖励模型;③ 用 PPO 微调,同时贴近 SFT 起点防灾难性遗忘与奖励作弊。
  • L150(InstructGPT 结果):13 亿参数+RLHF 被人评为优于裸 1750 亿参数 GPT-3;小的不是知识多,是对知识的使用判断更好。
  • L152(PPO 的重):要同时养四个模型:policy、reference(KL 惩罚)、reward model、value model(优势估计);奖励模型可能失准;PPO 可能过拟合奖励模型的毛病;KL 惩罚太强不学习、太弱放任作弊。
  • L154(DPO 2023):数学洞见 = RLHF 目标下的最优策略有闭式解 → 直接在偏好对上做监督式训练;不要奖励模型、不要 RL。
  • L156(DPO 实践):只需内存里放两个模型(policy + 冻结 reference);更稳、更好实现、对超参不敏感;变体 IPO/KTO/ORPO;开源自训的默认偏好方法
  • L158:两个团队(Llama 3、Qwen 2.5)都没养四个模型也做出了competitive的模型;「内存装得下两个模型」的团队就能跑对齐阶段——这是开源后训练成熟快的主因
  • L160(边界):偏好学习依赖标注质量;标注员分歧,或偏好数据奖励表面特征(长度、格式),模型就学错。
  • L162-168(RLVR):正确性由自动系统核查;数学是正典(生成解→判分器对答案);代码(函数→测试套件);逻辑谜题/约束满足/规划也算。GRPO(DeepSeek 提出):每个 prompt 采样一组候选→验证器打分→相对组均值算优势→上调高于均值、下调低于均值;不需要学出来的价值函数/critic;组就是自己的基线;更简单、省显存、更稳。
  • L170(R1-Zero 涌现):从没见过推理示范;会一步步拆、自查、中间步失败就换路;推理行为涌现是因为被奖励:含仔细推理的解更可能答对,RL 放大了这个模式
  • L172:完整版 R1 = SFT + GRPO;开放权重;多个团队用开源工具复现。
  • L174:RLVR 把这一代模型和上一代分开:SFT+偏好 → 听指令、人评分高;RLVR → 解没见过解法的问题
  • L176(基建最重):每步要为每个 prompt 生成多条完整回答、跑验证器、算策略梯度;生成是瓶颈;长思维链 × 每批几千 prompt → 要 vLLM 这类专用推理引擎伴跑。
  • L182-186(环境):环境给观察(代码执行输出、检索文档内容、UI 状态),收动作(工具调用/代码/消息),返回可算奖励的结局;协议 = reset → action → observation(+可选 reward)→ 循环至 episode 结束;好环境:信号真实、变化足防背题、快到能出几千个 episode。OpenEnv:标准化协议 + 程序化生成(防记答案)+ 沙箱执行(隔离容器);已有网页导航/数据库/API 工具环境。
  • L188(多步奖励分解):单轮:奖励 = 输出的函数;多轮:结局(完成没)?效率(几步)?中间步质量(工具用对没)?安全(避开危险没)?分解+加权是个设计问题
  • L190-202(组装):流水线 = 一串检查点,每段从上一段最好的检查点出发;SFT 先行,SFT 后过评测就停;偏好学习可选(格式对但判断力差时加);RLVR 可选(任务结果可查且评测显示前面不够时加);也可以建了环境只用于评测、不做完整 RL;用能改变目标行为的最短流水线;提示词解决很多用例,SFT 更少,RL 更更少。
  • L194:典型起点 base model 如 google/gemma-4-E2B(疑为笔误,Gemma 实际型号是 3n-E2B——拆解以描述方式处理:总纲 §5 只说「疑似笔误、现役产品没有这个型号」,未点名型号、正文无引用点)。

§1.4 What You'll Build

  • L208-212:全书跟踪一个 4B 开源 base model 走完全程;章节规划:2 从零 PyTorch、3–6 各阶段 TRL、7 生产流水线、8 推理与 RLVR、9 安全/评测/实验运营。
  • L216-228(工装):TRL 是中心(SFTTrainer/DPOTrainer/GRPOTrainer),建在 transformers 上;PEFT 让小显卡能训:全量微调 4B 半精度 ≈28GB(权重+优化器状态+梯度);LoRA 往注意力层加小可训矩阵、冻结其余;QLoRA 量化版 → 4B 能在单张 12GB 卡上微调;Hub 存模型/数据集/检查点/model card;后面还用 vLLM、datasets、评测框架。
  • L230-234(硬件):单卡 ≥12GB(如 T4)+ QLoRA 够到 4B;云 GPU/HF Jobs/Colab 均可,成本不高。
  • L238:预告 ch2「加载 4B 模型」——实际 ch2 用的是 0.6B(Qwen3-0.6B),草稿前后不一致

Chapter 2. Speed Run Post-Training from First Principles

  • L14-16:目标 = 从第一性原理端到端跑通后训练;两个循环(SFT、GRPO)各 <100 行、单卡;「全书的一个纳米版」;刻意省掉基建,聚焦 token 与参数层面。
  • L18:配套仓库 [REPO URL]占位符,还没填
  • L22-24(Note,全章主旨):两个循环共享 base model 和优化器,只差一处:训练信号从哪来。SFT 复制你给的信号;RL 从你定义的奖励里自己发现信号——这是全章也是全书的贯穿线。
  • L30-45(设置):PyTorch(张量/autograd/优化器)+ transformers(模型/分词器)+ datasets;钻到 trl 底下:不调 trainer 类,自己写循环/损失/更新;模型 Qwen/Qwen3-0.6B(6 亿参数);单卡 16GB;bfloat16 减半显存;设种子;开发期生成长度调短。
  • L59-61:Tip:max_new_tokens 8–64。
  • L67-75(SFT 的监督信号):token = 分词器映射成整数的文本块;模型对词表里每个 token 输出一个分数(logit);softmax 把 logits 变成概率分布;长度 T 的序列产出 T 个分布;损失 = 交叉熵 = 模型分给正确 token 的概率的负对数;在示范上最小化它 = 最大似然估计。
  • L77:自信且对 → 损失近 0;自信且错 → 损失大。
  • L79:SFT 的全部学习信号就这个;没有「好答案/坏答案」概念;机制不变,只换数据
  • L81:teacher forcing:每个位置都拿真实前缀训练(不是模型自己生成的);一个 10 token 的回答给 10 个监督预测——这种密度是 SFT 高效的原因
  • L85-89(掩码):把 prompt 和 completion 拼一条序列喂进去;label 数组把 prompt 位置替换成 -100(PyTorch 交叉熵把它当「跳过此位」);标签要错一位读(位置 t 预测 t+1)。
  • L95-119(走查代码):对话 = user「用一词总结:回答永远保持简洁。」assistant「Concise.」;apply_chat_template(..., return_assistant_tokens_mask=True) 得 assistant_masks;labels[assistant_masks == 0] = -100
  • L124-148(循环五步):模型→logits;shift 对齐;交叉熵(ignore_index=-100);backward;step。AdamW lr=1e-5,30 步。交叉熵对 logits 的梯度 = 预测分布 − one-hot 目标 = 「预测减正确」。transformers 有捷径 model(input_ids, labels=labels).loss,本章手写为看清 shift/mask。
  • L156-190(前后探针):探针① = 示范的损失(训练前后各算一次);探针② = 贪婪解码的文本(do_sample=False, max_new_tokens=8)。训前:损失高、解码不是目标;30 步后:损失趋 0、贪婪解码收敛到目标词。这个「固定输入前后各测一次、看输出不只看损失」是全书要带走的习惯——抓「循环在跑但学错了东西」的最快办法。
  • L194-206(RL 侧):SFT 需要每条 prompt 有人写好并验证过的 completion;RL 只要一个给任意 completion 打分的奖励函数。三词:policy = 模型本身(prompt → 补全分布);reward = 补全 → 数;rollout = 从 policy 采样补全
  • L206(RL 为何能超越起点):SFT 教不了示范里没有的行为;RL 能把模型采样时偶然撞到的高奖励补全强化起来;两个前提:模型至少偶尔撞到、奖励得认得出。
  • L212-254(最小环境):任务 = 格式:把答案放进 <answer></answer> 标签;奖励函数分三级:<answer> 出现 +1、</answer> 出现 +1、正则配平再 +1 → 0/1/3 分;Table 2-1:空串 0 分;裸「42」0 分;「42」1 分;「42」3 分。打分要有区分度:组内大家同分 = 什么都学不到
  • L256-275(策略梯度/GRPO):要一条基线来比;GRPO 的基线 = 组自身均值:advantage = (reward − mean)/(std + eps);高于均值强化、低于压制;损失 = −(A × logprob)(REINFORCE 估计量 + 组基线,Williams 1992);A>0 最小化损失 = 抬该补全的对数概率;A<0 = 压;|A| = 力度。
  • L262(vs PPO):PPO 训第二个网络(critic)估期望奖励当基线——显存翻倍、自带训练问题;GRPO 拿现成的组均值替;代价 = 每 prompt 多采几条(生成时间);生成比第二个网络便宜时是划算的,这也是 GRPO 在推理模型上扩展好的部分原因。
  • L283-342(实现):prompt「说出一种原色。把答案放进 answer 标签。」;G=8、200 步、temperature=1.0、top_p=1.0、max_new_tokens=64;advantages = (rewards - rewards.mean()) / (rewards.std() + 1e-4);两笔账:①completion mask(长度参差,截到第一个 EOS);②逐 token 对数概率(序列回喂模型,gather 出采样 token 的 logp,按 mask 求和);loss = -(advantages * seq_logp).mean()
  • L343-345(运行行为):几百步内平均奖励爬升;早期靠运气:组里至少得有一条像样的,才有东西可强化;全组同分 → advantage 全 0 → 这一步白走——GRPO 卡住的最常见原因;奖励太易(全高分)或太难(全 0 分)都没方差;分级奖励 + 足够的采样温度保方差。
  • L347-357(裁剪代理):上面每 rollout 只走一步;示例脚本把一条 rollout 复用几步(生成慢,复用省钱);借 PPO 的 clipped surrogate:记录采样时的 logp,限制新旧概率比值每次复用最多挪 1±ε;单步时比值恰为 1,退化回纯策略梯度。
  • L359-369(两更新对比):SFT:写好 <answer>red</answer>,梯度推向那个精确字符串;RL:不写示例,模型自己采样,梯度推向组均以上的尝试SFT 最小化 −logprob(你给的目标);RL 最小化 −(advantage × logprob(模型自己给的样本));把 advantage 搁一边,RL 更新就是「朝模型自己的输出做 SFT」,advantage 按质量给这些自产目标重新加权。后果:SFT 稳、样本高效、但需要好数据、天花板是示范;RL 只要验证器、能发现没人示范的行为,但更吵、依赖撞到、奖励无方差或奖错就崩。
  • L377-381(心智模型一:模仿 vs 优化):SFT 天花板 = 数据(示范平庸→忠实学会平庸;示范优秀→逼近但不超越);RL 天花板 = 奖励 + 模型采样够不够得着;失败方式相反:模仿被数据封顶;优化只和它的奖励一样诚实(奖励能被绕过就一定被绕过);ch6 讲 reward hacking 及缓解。
  • L383-389(心智模型二:数据便宜、奖励贵):SFT 成本在数据(挖日志/雇标注/强模型生成+过滤);RL 数据只是 prompt(便宜、可复用),成本挪到奖励:奖励要抓真需求、防捷径、有方差,难建;可验证域奖励近乎免费(检查器现成);非可验证域得训奖励模型(又一个数据和建模问题)。这条不对称解释了领域形状:数学/代码 RL 进展最快,因为最贵的部分免费;开放域对话要偏好数据和奖励模型
  • L391-427(心智模型三:各自擅长 + Table 2-2):SFT 用于可示范:格式/风格/工具调用语法/cold start,快稳可预测,流水线几乎总从它开始;RL 用于可打分但难示范最优版:数学推理/过测试的代码/多步 agent;R1 配方 = 正典组合:SFT 给地板,RL 抬天花板
  • L429-435(总结 + 预告):SFT = 模板对话上的下一 token 预测 + 掩码;RL = 采样一组、按奖励推高组均以上者;下一章回到第一个循环,讲 SFT 数据从哪来、怎么清洗。
  • L437-471(参考文献,可作 ③ 出处):DeepSeek-R1 arxiv 2501.12948;PPO Schulman 2017 arxiv 1707.06347;DeepSeekMath(GRPO 出处)arxiv 2402.03300;Williams REINFORCE 1992;Alammar & Grootendorst HOLLM 2024;Géron HOML 2026;Tunstall NLP with Transformers 2022;Winder RL 2020。

全书地图(给切分用)

主旨一句话(L22-24):SFT 复制你给的信号,RL 从你定义的奖励里发现信号——两个循环、一个对比,贯穿全书。 三段流水线各教一样东西:SFT 教格式(模仿)、偏好学习教好坏(人的判断)、RLVR 教推理(任务的对错)。 实用结论:用能改变目标行为的最短流水线;SFT 铺地板、RL 抬天花板。

草稿瑕疵(拆解要如实交代)

  1. Early Release,9 章只出 2 章;第 2 章 7 张配图成图且图注齐全,第 1 章仅 1 处图注 TO COME(图已在);仓库 URL 是占位符。
  2. ch1 说 running example 是 4B,ch2 实际用 0.6B——前后不一致。
  3. 「google/gemma-4-E2B」疑似型号笔误(现役是 Gemma 3n E2B)。
  4. 1.2.2 标题列了 Mistral/Olmo,正文一个字没讲(只讲了 Llama/Gemma/Qwen/DeepSeek)。
  5. 两章各自开头重复的 Early Release 通告——导航噪声。