Skip to content

前沿专题 · 强化学习理论基础:从一般 MDP 到策略梯度 ​

前置要求:第3章的概率与期望记号(条件期望、全期望公式),以及第11章 · 后训练与对齐中「生成过程是 MDP」小节的生成 MDP 特例记号(Gt、TD 残差 δt、概率比)。未读过第11章也能顺序读完本页,但对照着读,两边的记号会互相点亮。

第11章把一次生成写成了 MDP 的特例:状态是前缀、动作是下一个 token、转移确定、奖励只在序列结束时给一次、γ=1。它同时声明「动态规划网格世界和 DQN 留在原书」。本页就是那一半:一般 MDP 理论——形式化、Bellman 方程与价值迭代、TD 估计谱系、策略梯度定理的一般形式,以及 AlphaGo 一系的搜索与专家迭代。读完本页,第11章里「critic 的 V、GAE、PPO 概率比各是哪个量」的每个对象都能在一般层找到它的定理编号。

本页的一般理论框架与多处讲法顺序吸收自 Ernest K. Ryu 的研究生课程 RL of LLMs (Spring 2025) Chapter 1(Deep RL);课程页面公开提供讲义与 Cliff Walk 示例的链接。本仓只保留链接与归属,正文用自己的话重述,不复制其文本、图或代码。

边界声明:本页不实现 token 级 PPO——那是第12章 · DeepSeek 架构专题的 GRPO toy(python/llm_core/deepseek_toys.py 的 grpo_policy_update)与第11章 PPO 目标的知识边界所在。本页的动手实验停留在表格 RL:一个网格世界上的蒙特卡洛评估、价值迭代、线性代数精确解与表格 REINFORCE(见 python/llm_core/rl_basics.py)。表格 REINFORCE 是本课唯一一个「真的在跑的策略梯度训练循环」的最小版本;想自己从零写一遍这套流程,走 clean-room 第 9 模块 clean_room/tabular_rl.py(空接口 + 冻结签名,合同见 clean_room/contracts.json 的 tabular-rl 条目)。


本页目标 ​

学完后你能做到:

  • 写出一般 MDP 的五元组,并解释终态吸收化技巧为什么是后续一切推导的记号地基(随机终止时刻 T 上的期望号交换坑)。
  • 复述 Bellman 期望方程与最优性方程的证明结构,特别是「不动点存在唯一」与「不动点恰为最优」分开证明的两段式顺序。
  • 说明 γ=1 的三种病态,以及「奖励只在终止时给一次」为什么让 RL-LLM 的 γ=1 合法。
  • 沿 MC → 一步 TD → k-step TD 谱系解释偏差与方差的交换,指出 stop-gradient(PyTorch 的 .detach())在 TD 目标上切断的是什么。
  • 按无偏性逐级验证的顺序复述策略梯度定理的四个方差缩减增强,并解释没有 baseline 时 softmax 归一化在「硬推」什么。
  • 讲出 AlphaGo 四步训练中每一步「为什么还不够」,以及 test-time compute 的一句话数学辩护。
  • 在 Cliff Walk 上跑通五级实验:MC 评估 → 价值迭代 → 线性代数精确解 → 带 baseline 的表格策略梯度 → REINFORCE。

阶段 0:只有一个状态的赌场——bandit ​

(本阶段的叙事装置与知识框架源自 Pramod Goyal 的 Reinforcement Learning from scratch #1(2026);知识点对应 Sutton & Barto 第 2 章,正文全部用自己的话重述。)

先交代它在整页里的位置。k 臂老虎机 (k-armed bandit) 是 MDP 的单状态退化情形——只有一个状态、k 个动作可选、每个动作吐出一个奖励样本,没有「下一步到了哪」这回事。它同时是通往完整 MDP 的最缓坡道:估计、探索、利用这些核心难题在这里以最裸的形态出现,却还不背转移概率的包袱。把本阶段放在一切之前还有一个直接动机:第11章会把「terminal-only 奖励」的 LLM 生成设定称为 contextual bandit(上下文老虎机——状态由 prompt 给出的 bandit 变体);读完这里,那个命名里的每个词就都有了着落。

1. 问题:k 台老虎机,真实均值未知 ​

赌场里排着 k 台老虎机。每台机器 a 有一个未知的真实价值

q∗(a)=E[Rt∣At=a],

即在机器 a 上拉一次所得奖励的期望(At:第 t 次拉杆选中的动作;Rt:那次得到的奖励);每次拉杆得到的是 Rt 的一个样本——期望相同,单次结果有起伏。若首次见 E[⋅]:它是「长期反复取平均」的记号——均匀骰子的点数期望是 3.5,但没有任何一次能掷出 3.5;期望描述平均水位,不预言单次取值。

若 q∗ 已知,选择毫无悬念:永远拉均值最高的那台。困难在于它未知——智能体手里只有估计值 Qt(a),以及「拉一次、看一个样本、改一次估计」的学习回路。本阶段的每个装置都被这同一个缺口逼出。

2. 增量估计:一行公式的前世 ​

最朴素的 Qt(a) 是样本均值:把动作 a 上收到过的奖励全部存下、求平均。它正确,但每来一个新奖励都要重算整个和,而且「记住全部历史」在无限长的奖励流上不可行。均值其实可以只用两个数维护——当前估计与新样本。设动作 a 上前 n−1 次奖励的平均为 Qn,第 n 次拉杆得 Rn,新的平均是

Qn+1=R1+⋯+Rnn=(n−1)Qn+Rnn=Qn+1n(Rn−Qn).

第二步「乘除 n−1、把前 n−1 项之和认成旧估计 (n−1)Qn」是唯一的技巧——ML 论文常跳过这步推导,值得亲手走一遍。走完之后,均值从「存全部历史再求和」变成「只存当前估计,朝新证据挪一小步」。

最后一行的形状值得盯住,它有一般形式:

NewEstimate←OldEstimate+StepSize[Target−OldEstimate].

估计永远朝「目标与旧估计之差」修正一小步。把 Target 取为即时奖励、StepSize 取 1/n,就是上面的样本均值;把 Target 换成「即时奖励加对下一状态的折扣估值」、StepSize 换成常量,就得到阶段三的 TD 更新——那行更新不是新发明,是这里的一行公式换了目标。

3. 探索与利用:ε-greedy ​

估计有噪声,每个时刻于是都站在岔路口。只拉当前 Qt 最高的那台(利用 (exploitation)),可能永远锁死在「看起来最好、实际次优」的机器上;转去试其他机器(探索 (exploration)),又把筹码撒进当前估计偏弱的选项。这个两难没有根治、只有定价,而最便宜的定价方式可以先把动机想成一段独白:「要是永远只拉估计最高的那台,我可能一直错把第二好当最好;可每次都乱试,又在给差机器送钱——那这样:绝大多数时候贪心,偶尔(比如十次里一次)随机换一台?」这就是 ε-greedy:以概率 1−ε 贪心选 arg⁡maxaQt(a)(贪心 = 只认当前估计;若首次见 arg⁡maxaf(a):返回让 f 最大的那个输入 a,并列时任取其一——注意它交还的是「选项」而非最大值本身),以概率 ε 在全部 k 台里等概率随机选。ε 是探索量的旋钮:调小,平均回报趋稳但可能困在次优;调大,找到好机器更快、但持续为差机器付学费。样本均值配上 ε-greedy 还有一个温和的保证:只要 ε>0,每台机器终将被无限次拉到,Qt(a) 随之收敛到 q∗(a)——探索不只为了碰运气,它在把估计本身修对;估计修对之后,剩下那 1−ε 的利用自然落在真正最好的机器上。

4. optimistic initial values:用初值垫出探索 ​

样本均值需要一个初值 Q1。把它设成显著高于一切真实均值的数(比如一切 q∗(a)≤1 时设 Q1=+5),贪心规则会自动变成一台探索机器:任何被试过的机器,第一次真实奖励几乎必然低于初值,估计随之下跌;而未试过的机器还挂在高位——贪心规则总会先去「还没让我失望过」的那台。于是开局若干步自然铺满全探索,不需要任何显式的探索机制。它的局限同样清楚:这只解决「开头」。探索量由初值一次性预付、不随反馈调节;在会漂移的世界里(第 6 小节),这份乐观很快耗尽。

5. UCB:按不确定性下注 ​

ε-greedy 的探索是盲目的——随机等概率,不看哪台「还欠了解」。另一条思路同样可以先想再命名:「与其随机试,不如给『被试得少、还没把握』的机器发一点加成——估计分加加成分,谁高拉谁;被试多了,加成自然衰减。」形式化为置信上界 (upper confidence bound, UCB):

At=arg⁡maxa[Qt(a)+cln⁡tNt(a)],

逐项读:Qt(a) 是利用项;c>0 是探索强度旋钮;Nt(a) 是到时刻 t 为止动作 a 已被选的次数,它待在分母上——被选得越少加成越大,从未被选过(Nt(a)=0)的机器视为最优候选;ln⁡t 随总时长增长,若首次见 ln⁡t:先取自然对数再开方,t=100 时约 2.1、t=10,000 时也才约 3.0——自变量涨一百倍,它只涨四成。这个慢增长是设计的一部分:即便某台机器被反复选中,其加成仍随 t 缓慢爬升,长期看每台机器终将被无限次尝试——乐观面对不确定性;而确定性积累起来之后,探索自然让位于利用。

6. 非平稳:常量步长 α ​

样本均值的 1/n 隐含一个假设:q∗(a) 从不改变。若机器被人调过——均值在漂移——1/n 让每个新奖励的权重越来越小,估计对新世界的反应越来越迟钝,最终停在旧平均上不肯更新。修法是把步长从 1/n 换成常数 α∈(0,1]:

Qn+1=Qn+α(Rn−Qn),

展开后是指数加权的滑动平均:越近的奖励权重越大,按 (1−α) 几何衰减——「最近的样本最重要」。代价是估计不再收敛到定值、永远带一点抖动;α 越大跟得越紧、也抖得越狠。它与阶段三 TD 更新的亲缘关系在第 2 小节已经点过:TD 继承的正是常量 α 这一支。

7. 从一台到一组:通往 MDP ​

收拢本阶段的四个装置:

装置一句话机制代价
ε-greedy以小概率 ε 随机探索探索盲目,与「欠了解」程度无关
optimistic initial values高初值垫出开局全探索只管开头,非平稳世界后劲不足
UCB按不确定性发探索加成要额外记每台的拉杆次数,最优性论证依赖奖励分布条件
常量 α指数加权跟踪漂移估计不收敛到定值,永远轻微抖动

现在给每个状态配上它自己的一组老虎机,就得到了 MDP——这正是下一阶段要做的事。新增的只有两块拼图:拉哪个动作会决定下一步站在哪组机器前(转移),以及奖励跨步累积成回报(折扣 γ 登场)。第11章的 contextual bandit 设定与此直接对号入座:prompt 是状态、回答是一个动作、奖励只在序列结束时给一次——没有跨状态转移要规划的单步决策,正是本阶段知识的直系后代。


阶段一:一般 MDP——状态、动作、轨迹与吸收态 ​

1. 五元组与轨迹 ​

马尔可夫决策过程 (Markov Decision Process, MDP) 由五个对象构成:

成分记号含义
状态空间S(另设 S+=S∪{⟨term⟩})环境可能处的全部情形,⟨term⟩ 是终止状态
动作空间A智能体每步可选项
初始分布s0∼p0回合起点的随机性
转移核(rt,st+1)∼p(⋅,⋅∣st,at)给定状态与动作,奖励和下一状态的联合分布
时间指标t=0,1,…,TT 由 sT=⟨term⟩ 定义

马尔可夫性的含义就写在转移核里:下一步的分布只依赖 (st,at),不依赖更早的历史。策略 (policy) π(a∣s) 是状态到动作分布的映射;平稳策略不显式依赖 t。轨迹 (trajectory) 是

τ=(s0,a0,r0,s1,a1,r1,…,sT),

其概率按链式法则分解为「初始分布 × 每步策略 × 每步转移」的连乘。回报 (return) 从时刻 t 起算:

Gt=∑k=0T−tγkrt+k,γ∈[0,1].

T<∞ 的回合叫 episodic task;T=∞ 叫 continual task。γ<1 在无限时长下保证几何级数收敛。

2. 终态吸收化:先于一切推导的记号工程 ​

一个容易被略过、但每份严谨推导都会撞上的记号坑:T 是随机变量(由首次到达终态定义的停时),因此

E[∑t=0T(⋅)]≠∑t=0TE[(⋅)].

左边是一个「求和项数本身随机」的对象,右边假装 T 是固定的——两者根本不是同一个量。处理随机终止时刻的每次交换、求导、取期望,都得重新论证一遍。

工程上一次性解决这个麻烦的办法是吸收态 (absorbing state) 化:约定一旦 st=⟨term⟩,则 rt=0、且 st+1=⟨term⟩ 以概率 1 成立。此后名义上 T=∞,但终态之后贡献恒为零,所有「有限求和」都可以改写成「无限求和 + 尾项为零」,期望号的搬运回到常规轨道。同时硬性约定 Vπ(⟨term⟩)=0。

这个技巧在第11章的生成 MDP 上直接兑现:生成过程在采样出 <EOS> 时终止,终止时刻是随机的——「把终止时刻的随机性吸收进状态」正是那里的记账方式(讲法源自 Ernest Ryu, RL of LLMs (Spring 2025) Chapter 1)。

3. 状态与观测:LLM 为什么没有这个问题 ​

一般 MDP 假设全观测:智能体精确知道 st。当智能体只能看到观测 ot 而非真实状态时(经典的例子:老虎暂时躲到树后,「当前看不见」不等于「当前安全」),问题升级为部分可观测 MDP (POMDP),难度显著上升。这里的预埋桥是:LLM 的生成 MDP 不受此困扰——模型能看到全部对话历史,「历史即状态」,因此是全观测的。这条性质在第11章把「整个前缀」定义为状态时已经用上了。

4. 模仿学习与分布偏移:为什么 SFT 之后还需要 RL ​

模仿学习 (imitation learning) 的最简形式是行为克隆 (behavior cloning):收集专家的状态-动作对 Dexpert={(si,ai)},做监督学习

minθ∑iℓCE(πθ(⋅∣si),ai).

下一 token 预测本质上就是行为克隆:专家数据是语料,动作是下一个 token。SFT 也是行为克隆——对指令-回答对做条件化的下一 token 预测。

行为克隆的软肋是分布偏移 (distribution shift):训练数据来自专家(或旧策略)到访的状态分布,而部署时智能体用自己的策略行动,一旦走进专家没到过的状态,模型在该状态下没有任何监督信号,误差逐步累积。驾驶是这个机制的具象版:专家司机偶然轻微偏航时,一次熟练的方向盘修正就回到车道;行为克隆策略从未在「偏航状态」上见过示范,一旦漂出专家轨迹,没有任何信号告诉它如何恢复,误差像滚雪球一样放大。理论入口是:RL 中训练数据本身依赖策略——在别的策略(或旧的自己)产生的数据上训练叫 off-policy,在当前策略产生的数据上训练叫 on-policy;行为克隆是前者。DAgger 一类的算法试图用「让专家在 learner 的状态分布上补标注」来修复偏移,但让标注者覆盖模型实际会走到的所有状态,在 LLM 场景里基本不可行。更深一层的别扭在标注端:问人类「此刻你会把方向盘打几度」不是自然的示范方式;LLM 版同理——接续别人写了一半的段落也不是人类自然的写作方式。但「让模仿学习尽量 on-policy」的思想没有就此消失:RLHF 在当前策略的采样上训练、expert iteration(阶段五)让网络模仿被搜索增强后的自己,都是这一思想在后续范式里的回归。

为什么「观察会了」不等于「做会了」?Ernest Ryu 在该课程 Prologue 里给过一个体育类比(此处为转述):看会一个过人动作与亲自练出这个动作之间,隔着一个反馈回路——示范数据只记录了可见的动作序列,让动作成功的隐含前置步骤不会出现在数据里;只有带着环境反馈去试错,才能发现并修正这类被示范掩盖的缺失环节。具体版本:模仿球星「快速运球过人上篮」的整套动作,防守者却总跟得上;反复上场试错才发现,起手处的眼神假动作才是让过人成立的关键组件——仅靠观察示范,这一步不会自己显形。这是「SFT 记忆、RL 泛化」的直觉版:模仿复制可见行为,试错发现被掩盖的因果结构,也是从 SFT 走向 RL 的动机起点。


阶段二:Bellman 方程、压缩映射与两种迭代 ​

1. 值函数:Vπ 与 Qπ ​

给定策略 π,状态价值函数与动作价值函数定义为

Vπ(s)=Eπ[G0∣s0=s],Qπ(s,a)=Eπ[G0∣s0=s,a0=a],

约定 Vπ(⟨term⟩)=0。平稳策略给出时间平移不变性:从 t 时刻的状态 s 出发的期望剩余回报等于 Vπ(s)。最优值函数 V⋆(s)=maxπVπ(s);最优策略不必唯一,但所有最优策略产生同一个值函数。

2. Bellman 期望方程:压缩映射与不动点 ​

对固定 π,定义 Bellman 算子

(BπV)(s)=Ea∼π(⋅∣s),(r,s′)∼p(⋅,⋅∣s,a)[r+γV(s′)].

在 γ∈(0,1)、状态空间有限、奖励有界的条件下,Bπ 在上确界范数下是 γ-压缩映射 (contraction mapping):对任意 U,V 有 ∥BπU−BπV∥∞≤γ∥U−V∥∞(逐状态做差、放缩、公共因子 γ 提出)。Banach 不动点定理说:完备度量空间上的压缩映射有唯一不动点,且从任意初值起迭代收敛。于是 Bellman 期望方程

Vπ(s)=E[r+γVπ(s′)∣s]

的解存在、唯一、且恰为 Vπ——先按定义展开 Vπ 再用时间平移性收缩一步,就得到它。

把压缩性那一拍的放缩链拆成四步看全(对任意 U,V 与任意状态 s):

|(BπU)(s)−(BπV)(s)|=|E[γ(U(s′)−V(s′))∣s]|① 两式取差,奖励项相消=γ|E[U(s′)−V(s′)∣s]|② γ 是常数,提到期望外≤γE[|U(s′)−V(s′)|∣s]③ |E[⋅]|≤E|⋅|≤γ∥U−V∥∞④ 逐点差放大到上确界

①靠的是同一 (s,a) 下奖励分布相同(平稳环境);②是线性;③是绝对值与期望的次序交换;④把「对 s′ 的逐点差」统一抬到最坏情况——走完四步后仍留在系数上的那个 γ,就是折扣买来的全部收敛性。

3. Bellman 最优性方程:两段式诚实 ​

把算子里的「对 π 取期望」换成「对动作取 max」,得到最优 Bellman 算子 B⋆ 与最优性方程

V⋆(s)=maxa∈AE[r+γV⋆(s′)∣s,a].

这一步的证明顺序值得原样学走(讲法源自 Ernest Ryu, RL of LLMs (Spring 2025) Chapter 1):先用辅助引理 |maxau(a)−maxav(a)|≤maxa|u(a)−v(a)| 证明 B⋆ 同样是 γ-压缩,于是有唯一不动点——但此刻还不知道这个不动点是不是「最优值函数」,讲义在此处特意标注了这个悬念。补上第二段的是单调性:Bπ≤B⋆(逐状态),且 B⋆ 保序,于是任意策略满足夹逼链

Vπ=BπVπ≤B⋆Vπ≤B⋆2Vπ≤⋯→V⋆,

所以 Vπ≤V⋆ 对一切 π 成立——不动点确实是最优。「不动点存在唯一」与「不动点恰为最优」是两件事,分开证明、不倒果为因;Q 版本 Q⋆(s,a)=E[r+γmaxa′Q⋆(s′,a′)∣s,a] 与 maxaQ⋆(s,⋅)=V⋆ 同理。最优策略从值函数免费提取:π⋆(s)∈arg⁡maxaQ⋆(s,a)。

4. 价值迭代与策略迭代:两个「概念框架」 ​

价值迭代 (value iteration, VI) 就是不动点迭代 Vk+1=B⋆Vk。压缩性直接给出几何收敛速率 ∥Vk−V⋆∥∞≤γk∥V0−V⋆∥∞;γ=1 时压缩性消失,不保证收敛。换个视角看这场收敛(涟漪比喻化用自 Pramod Goyal 的 RL 教程):每个好状态的好消息每轮向外多传播一格,像水面涟漪,直到每个格子都知道自己离出口多远。

策略迭代 (policy iteration, PI) 交替两步:策略评估(精确解出 Vπk 或 Qπk)与策略改进(贪心 πk+1(s)=arg⁡maxaQπk(s,a))。Policy improvement 定理保证 Vπk+1≥Vπk,且有限 MDP 上有限步后到达 V⋆。

这两种迭代在深度 RL 里通常不以精确形式实现,但它们是两族实用算法的概念框架:VI 的「逐步对最优 Bellman 算子做一步展开」孕育了 Q-learning/DQN 一系;PI 的「评估-改进交替」孕育了 TRPO/PPO 一系(第11章的 PPO 目标是它的近似后裔)。本页阶段四会从 PI 这条线走到 PPO 的门口。

5. γ=1 的三种病态,与 terminal-only 的合法性 ​

折扣不是数学装饰。γ=1(无折扣)时分三种情形:

情形设定结果
1有限 MDP,且每个策略的 Vπ 有限良定——例如奖励只在回合结束时给一次没有病态,γ=1 合法
2存在正奖励环:某状态自环且 r>0Vπ=+∞,一切比较失去意义
3回报序列不可和(如 +1,−1,+1,−1,…)总回报没有定义

情形 2 有一个经典的游戏化样例:平台游戏里反复踩同一只龟壳即可无限得分、无限加命——只要存在一条能无限重复收割正奖励的回路,无折扣回报就是 +∞,「刷分」与「通关」在同一把尺子上失去比较意义。

情形 1 正是第11章生成 MDP 的位置:无 KL 惩罚的 RL-LLM 设定(terminal-only 奖励的 episodic MDP)在 γ=1 下良定。带 KL 惩罚的变体把 βDKL 项吸收进逐 token 的中间奖励后,出现了每步非零的奖励项——合法性论证要在改写后的奖励上重做,而 KL 项本身把策略拴在参考分布附近,恰好压制了「靠无限长回答刷奖励」这类情形 2 式的病态(古德哈特定律与 KL 安全绳在第11章有完整讨论)。

三种情形之外,工程实践的通行次序是:先在 γ<1 下完成严格分析——压缩性、存在唯一性、收敛速率全部有定理可用;分析闭合后,再把结论外推到 γ=1 的良定情形。外推这一步本身不是证明,情形 2、3 的边界条件必须逐一核对;但在情形 1 的保证之内,这是通行的工程折中(课程将其作为实践建议给出,此处为中性转述)。

本页到此的地图如下——精确算法、采样估计与概念框架的关系:


阶段三:从蒙特卡洛到时序差分——估计的谱系 ​

第11章只需要一步 TD 残差(为 GAE 服务);本节把整条谱系铺开。

读谱系之前先装一个评审镜头(课程反复使用、此处显式提炼):本节每个估计器都会推两遍——第一遍是理想化版本,数学性质干净(无偏、与 Bellman 方程精确一致),但依赖未知的 Vπ,不可执行 (not actionable);第二遍把 Vπ 换成当前近似 Vϕ,得到可执行但有偏的版本。谱系上的每个成员都能按「理想化形式是什么 / 可执行形式是什么 / 偏差从哪一步进入」三问归档;下文读到「拿它做估计,等于用被估计量自己估计自己」时,那里正标注着一次从第一遍到第二遍的换轨。

1. 蒙特卡洛评估 ​

最直接的估计:对每个状态采 N 条完整回合,用经验回报均值逼近期望回报,

Vπ(s)≈1N∑i=1NG0(i).

无模型 (model-free)、无偏,但每条样本要等回合跑完,且方差随回合长度增长。神经网络版把 Vϕ:S→R 拟合到这些目标上(MSE 损失 + SGD),终态价值硬编码为 0、不进网络。

2. TD 与自举 ​

Bellman 期望方程给出另一个估计途径:Vπ(s)=E[r+γVπ(s′)∣s]。它只有在 Vπ 已知时才可计算——拿它做估计,等于用被估计量自己估计自己。出路是用当前近似 Vϕ 顶替 Vπ,只展开一步就回收:

V^(st)=rt+γVϕ(st+1).

这个「用自身近似回填尾部」的动作叫自举 (bootstrapping)。它不必等回合结束、方差低,代价是目标里带上了 Vϕ 的误差。

3. stop-gradient:半梯度的实现级含义 ​

用 SGD 拟合 TD 目标时,想要的梯度是两个标量的乘积:

g=(r+γVϕ(s′)−Vϕ(s))∇ϕVϕ(s),

即只对被评估的 Vϕ(s) 求导,TD 目标里的 Vϕ(s′) 当常数。若让链式法则扫过目标里的 Vϕ(s′),得到的是另一个(错误的)梯度方向。数学上引入 stop-gradient 算子 sg[⋅],把损失写成

ℓ(ϕ)=12(r+γsg[Vϕ(s′)]−Vϕ(s))2,

PyTorch 里就是 target.detach()——前向数值照常参与,反向图在此剪断。第12章 GRPO toy 里冻结参考策略的做法、第11章 PPO 的旧策略概率比,都是同一个算子的不同宿主。

这一行真写进 PyTorch 时有三种候选写法,课程对三者逐一给过判定(此处转述):

写法判定依据
Option 1:把 TD 误差当标量系数,手动实现 g=(⋅)∇ϕVϕ(s)(系数与梯度分开算再相乘)正确但繁琐数值上就是想要的更新,但要手工拆排计算图,代码与内存都不省
Option 2:对 (r+γVϕ(s′)−Vϕ(s))2 整体反向传播错误链式法则同时扫过两处 Vϕ,比 g 多出一项含 γ∇ϕVϕ(s′) 的方向,回不到想要的更新
Option 3:对目标里的 Vϕ(s′) 套 sg[⋅](即 .detach())社区标准前向数值照常参与,反向图在目标处剪断,恰好实现 g

stop-gradient 在策略梯度侧同样在场(实现级细节,课程口述,此处转述):actor 的更新方向里,Q^t 与 baseline b(st) 都以常数身份出现——对它们套 sg[⋅] 后,梯度只从 log⁡πθ(at∣st) 一路反传,一次 backward 调用完成。还有一个符号细节:PyTorch 的优化器默认做最小化,而策略梯度是上升方向,实现上把目标取负再交给 optimizer。读第11/12章的 PPO 与 GRPO 实现时,可以带着这两个约定去对照。

4. k-step 谱系与 k=5 经验法则 ​

MC 与一步 TD 之间是一条回望窗口的插值轴。k-step TD 目标取 k 步真实奖励加自举尾项:

V^TD(k)(st)=∑i=0k−1γirt+i+γkVϕ(st+k).

k=1 是一步 TD,k=∞(尾项消失)是 MC。权衡是:训练早期 Vϕ 不准,自举把错误当目标,偏稳态但偏差大;训练后期 Vϕ 已准,等整段回合结束才更新则浪费,纯 MC 方差又大。实践的经验缺省值是 k=5(讲法源自 Ernest Ryu, RL of LLMs (Spring 2025) Chapter 1)——一个少见的敢给默认数的讲法,本页沿用这个缺省值并保留它的出处。

5. 诚实注脚:半梯度可证明不是梯度下降 ​

TD + 近似 SGD 的组合叫半梯度 (semi-gradient) 方法。「半」不是修辞:可以证明它不是任何目标函数的梯度下降(Barnard, 1993)——存在它时,你找不到一个 ℓ(ϕ) 使 ∇ϕℓ 恰好等于那个更新方向。直接最小化 Bellman 误差的「全梯度」方法 (gradient TD, Sutton 等 2008/2009) 理论上更纯洁,实证上反而表现更差。理论性质与工程效果在这里正面冲突,诚实的处理是把冲突摆上台面、按工程效果选边,同时保留理论标签——本课对 GRPO 偏置(第12章)的讨论沿用同样的纪律。

6. 为什么 DQN 不在本课主线里 ​

Q-learning / DQN 学 Qϕ≈Q⋆,策略隐式藏在 arg⁡maxaQϕ 里。它被本课与 RL-LLM 主线共同排除,理由是结构性的(讲义在此给出三条事实推出的完整选型逻辑):其一,LLM 的动作空间是有限词表,不是连续控制,DDPG/TD3/SAC 那一系没有用武之地;其二,强预训练初始策略至关重要,从零开始的 tabula rasa 训练不工作——方法必须能有效利用预训练好的 πθ,而 DQN 的「先学好 Qϕ 再贪心」没有好办法把一个现成策略作为起点;其三,在 DQN/SAC 系里奖励只通过 Qϕ 间接影响 πθ,PPO 系里奖励直接进入策略梯度的更新方向。这条选型逻辑在第11章的 PPO 目标处回收。


阶段四:策略梯度定理与四步方差缩减 ​

第11章推导的是序列级 REINFORCE 特例;本节给一般形式,并按每一步先证无偏、再谈方差的顺序走完四个增强(讲法顺序源自 Ernest Ryu, RL of LLMs (Spring 2025) Chapter 1)。

1. 一般形式 ​

目标 J(θ)=Eτ∼πθ[G0]。对轨迹概率的连乘分解取对数再求导,环境项(p0 与转移核)不含 θ 而消失,只剩策略项,得到策略梯度定理:

∇θJ(θ)=Eτ∼πθ[∑tγt∇θlog⁡πθ(at∣st)Qπθ(st,at)].

最粗的蒙特卡洛估计拿整段回报 G0 顶替 Qπθ(st,at)——无偏,但一条样本同时乘到所有时刻上,方差大到几乎不可用。四个增强都是在不动无偏性的前提下削方差。

2. 增强 #1:去掉过去奖励 ​

时刻 t 之前发生的奖励 r0,…,rt−1 不受动作 at 影响(因果),而 ∇θlog⁡πθ(at∣st) 只关乎「at 的采样概率怎么变」。把 G0 换成未来奖励 ∑t′≥tγt′−trt′:

∇θJ(θ)=E[∑tγt∇θlog⁡πθ(at∣st)∑t′≥tγt′−trt′].

过去奖励在这一项里的条件期望为零,只贡献多余方差;严格化用全期望公式(tower property)逐项验证。这正是第11章「REINFORCE 的 R(y) 可以逐步拆开乘」的一般形式。

3. 增强 #2:baseline ​

减去一个只依赖状态的基线 (baseline) b(st):

E[∑t∇θlog⁡πθ(at∣st)b(st)]=0.

每一项在给定 st 时对动作取期望为零(b 与动作无关,提出来乘上 Ea∼π[∇θlog⁡π]=0),期望保持无偏,方差下降。这就是第11章「advantage 记账」里 baseline 的一般定理。

4. 增强 #3:Q 估计统一定理与最优 baseline ​

两步增强可以合成一个定理:若 Q^t 满足条件期望齐性 E[Q^t∣τt,at]=Qπθ(st,at),则

∇θJ(θ)=E[∑tγt∇θlog⁡πθ(at∣st)(Q^t−b(st))].

增强 #1 的未来奖励、增强 #2 的 baseline 都是它的特例。Rao–Blackwell 定理(对更多变量取条件期望,无偏性不变、方差不增)说明 Qπθ(st,at) 本身——把 at 之后的一切随机性都平均掉——正是「对的形状」的估计。理论上最优的 baseline 是逐状态的加权条件均值 b⋆(s),但它在实践里不可用,于是用 b=Vϕ≈Vπθ 做合理代理;注意无论 Vϕ 拟合得多差都不破坏无偏性——偏差只在把 Q^t 也换成近似时才进入。

「不可用」三个字值得展开看(讲法源自同一课程的口述,此处转述):把 b⋆(s) 的公式真正写出来,分子分母都会出现 E[(∇θlog⁡πθ)2] 与 E[(∇θlog⁡πθ)2Q] 这类量——策略梯度推导里从未出现过的新对象,每一个都需要新的学习机制与额外计算。讲义在此的处理是把公式里的这些权重显式划掉:划掉之后剩下的恰好是条件均值,也就是 V,于是 b=Vϕ。讲者对这一步的自评是「这不是正确的计算,但作为一个启发式,道德上不算太冒犯」——理论最优不可得时,退到理论上次优、实证上被广泛检验的代理,并把这次妥协摆在明面上。这与阶段三「半梯度可证明不是梯度下降」的诚实注脚是同一种纪律:理论到工程的每一步显式让步都标注出处与代价,而不是假装没有让步。

5. 没有 baseline 时,softmax 在「硬推」什么 ​

许多 MDP 只有非负奖励。没有 baseline 时,Q^t≥0 意味着每个被采到的动作都在被推高——梯度的符号与「这个动作好不好」无关,唯一的相对信号来自 softmax 归一化:每个动作按自己的 ∇log⁡π⋅Q 被推,好动作被推得比坏动作狠,靠分母的重新归一化挤下别的动作。这是「没有 baseline 硬推」的机制。有 baseline 后才有干净的符号信号:优势函数 (advantage)

Aπ(s,a)=Qπ(s,a)−Vπ(s)

度量「该动作比该状态的平均水平好多少」:A>0 提概率,A<0 压概率,且 Ea∼π[Aπ(s,a)]=0。本页动手实验的故障注入一节会让这个机制现出原形。

6. 增强 #4:k-step TD 与 actor-critic 谱系 ​

统一定理要求精确 Qπθ——不可行动。第四步拿阶段三的 k-step 目标顶替:

Q^t=∑i<kγirt+i+γkVϕ(st+k).

只需学一个 Vϕ;即使 Vϕ 初始全错,前 k 步真实奖励仍携带关于 at 质量的信息。这笔冷启动账可以记细一点:随机初始化的 Vϕ(st+k) 对「状态好坏」完全不含信息,但它的错误贡献在估计器里乘着 γk 进入——前 k 步真实奖励是无偏信号、全权重在场;自举尾项的错误不含信息、却以折扣价在场。「可以冷启动」说的就是这笔不对称的账。到这一步,偏差正式进入——四个增强里唯一牺牲无偏性的一步,换来的是可实现性;bias-variance 的让步在无偏性框架内被精确定价。当 MDP 本身是 γ=1 的 terminal-only 设定(RL-LLM 正是),还可以人为在估计器内部引入 γ~<1——「估计器折扣」引偏差降方差,多数深度 RL 实践运行在这个约定上。

从一条轨迹到 SGD 的更新序列,还有一个实现层的选样问题,课程在 A2C 出场前先做了这组三方对比:

方案无偏性代价
整条轨迹随机抽一个时刻的梯度项做一步更新无偏(严格 SGD)每步只消耗一个样本,其余梯度信息全部浪费
全轨迹梯度求和后一次更新无偏更新稀疏——类比 full-batch SGD,样本利用率低
沿轨迹的循环序(t=0,1,…)逐步更新有偏(后段梯度在参数已被前段更新改变后计算)更新频繁、样本高效

A2C 的更新结构取第三方案:用「有偏」换「频繁」,与上一步「偏差换可实现性」属于同一笔交易的两个条款。

于是得到演员-评论家 (actor-critic) 结构:策略 πθ 是演员 (actor),价值 Vϕ 是评论家 (critic)。A3C(异步优势演员-评论家,Mnih 等 2016)用多个并行 worker 异步推送梯度;A2C 是去掉异步的同步版。本页对 A2C/A3C 停在正文级——不实现深度版;动手实验里的「表格 baseline 版」保留它的思想骨架。

7. 通向 PPO 的桥:surrogate 与 clip 的悲观界读法 ​

A2C 一条轨迹只够做一轮更新。想从同一批采样里学更多,把目标改写成重要性采样形式(对旧策略 πθ0 下的期望加概率比),得到代理目标 (surrogate objective)

K(θ;θ0)=Eτ∼πθ0[∑tπθ(at∣st)πθ0(at∣st)A^t]≈J(θ)−J(θ0)+C,

近似只在 θ≈θ0 时成立,且概率比离 1 太远时重要性采样失准——两个独立理由都要求信任域 (trust region)。TRPO 用 KL 约束加二阶优化求解。PPO 的替代走法可以先把动机想成一段独白:「KL 约束的解太贵,而失控只发生在概率比被推得太远的时候——那把『继续推远的激励』本身拆掉:概率比一旦越出 1±ε 的带子,无论优势多大,再多推也不给一分好处,会怎样?」把这段直觉写成式子就是 clip——回到一阶 SGD,用截断隐式实现信任域:

Lclip(θ)=Et[min(ρtA^t,clip(ρt,1−ε,1+ε)A^t)],ρt=πθ(at∣st)πθk(at∣st).

读法是悲观下界:min 在「未截断的代理项」与「截断后的最坏情况」之间取更保守者—— Advantage 为正时收益封顶在 1+ε 倍,为负时损失封底在 1−ε 倍;把概率比推得再远也没有额外激励,消除了把 θ 移离 θk 太远的动力。另一条独立的推导路径把 PPO 读作「近似策略迭代」:policy advantage 最小化 + 近似的贪心改进同样需要 proximal 机制兜底。完整的 PPO 目标(KL 惩罚、value head、entropy bonus)留在第11章;本页只修这座桥。


阶段五:AlphaGo、MCTS 与专家迭代 ​

0. 自博弈的数学执照:minimax 优化的不稳定谱系 ​

第 1 小节的第 2 步「自己和自己下」不是拿来即用的做法,它前面有两层论证:先说明朴素的双智能体训练为什么不稳,再证明单策略自博弈在什么条件下合法(讲法源自 Ernest Ryu, RL of LLMs (Spring 2025) Chapter 1)。

朴素方案为什么不稳。 双人零和博弈的目标是 maxθ1minθ2J(θ1,θ2)。最直接的并行实现是双方同时对各自参数走梯度(simultaneous gradient ascent-descent,下文简称 SimGAD):player 1 沿上升方向、player 2 沿下降方向。石头剪刀布是这个动力学的最小反例——它变成一台「针对对方的针对」的机器:我针对你的布加强剪刀,你针对我的剪刀加强石头,我再针对你的石头加强布;每一轮反制都在放大上一轮的偏差,策略概率的振荡逐轮加剧直至发散,动力学里没有任何内建阻尼。GAN 训练的不稳定属于同一族现象,「多智能体 RL 比单智能体更难稳定」是这一支的普遍经验。修复谱系主要有两支:extragradient 先想象双方各走一步、在那个展望点取梯度、再回到当前参数提交更新;anchoring(常与 weight decay 配合)把参数持续向锚点拉回,为振荡添加阻尼。两支都能恢复收敛。这族经验沉淀出一条工程直觉:监督学习天然稳定,把 RL 的组件尽量改造成监督学习的形态,是稳定训练的通用处方——后训练管线普遍从 SFT 起步再进入 RL(第11章的顺序),可以视作这条处方的执行。

反对称支付:为什么一个策略就够。 零和博弈的支付结构是反对称 (antisymmetric) 的:交换视角后,同一局面-动作序列的支付变号——对我有利的局面必然对对手不利,轮到谁走就按谁的视角计值。在这个结构下,若对称点 (θ⋆,θ⋆) 是 Nash 均衡,则把 SimGAD 中 player 2 的参数固定为 θ2=θ1=θ 后,双智能体更新坍缩为单智能体对 J(θ,θ) 的普通自梯度上升——player 2 就是 player 1 的一份拷贝,不需要第二个网络,也不需要第二套优化器。适用边界:围棋黑白双方的规则对称,一个网络打两边成立;规则本身高度不对称的游戏——例如双方的动作集都不同——才需要为每个玩家单独训练策略。

在这两条论证的光下,第 1 小节表格里第 2 步「与历史版本池对弈」是一个稳定化设计:对手取历史版本 θ− 而非当前参数,构成一个延迟稳定机制——对手稍弱、更新滞后,恰好为「针对对方的针对」的振荡提供了阻尼,与 anchoring 属于同一类工程手段。

动手对照(纯 numpy 可写,写清思路即可,不必追求工程完整):用 softmax 参数化石头剪刀布的双方策略(各三个 logits),按 SimGAD 更新——一方最大化、一方最小化各自的期望支付——记录三个动作概率随迭代的变化,预期看到振荡幅度逐轮放大;再实现一版带 anchoring 的更新(每步将 logits 向初始值拉回一个小系数),预期振荡被抑制、双方概率都收敛到 (1/3,1/3,1/3)——正是反对称支付下的 Nash 均衡。发散版与锚定版两条曲线并排,就是本小节全部抽象结论的最小可执行版本。

1. 四步训练,每一步都还不够 ​

AlphaGo(Silver 等,2016)的训练是四步递进,每一步都解决了上一步的不足、又各自留下新的不足(叙事源自 Ernest Ryu, RL of LLMs (Spring 2025) Chapter 1):

步骤做什么结果与不足
1. 监督策略网络 πθIL人类棋谱上学预测下一手(交叉熵)水平显著,尚不能击败人类专家——行为克隆的天花板
2. 自博弈策略网络 πθRL与历史版本池对弈,胜负 z=±1 做无折扣、无 baseline 的策略梯度 g=z∑t∇θlog⁡πθ(at∣st)对 πIL 胜率约 80%,仍不敌人类顶尖。理论上算力足够时应收敛到完美,实际预算下不够
3. 价值网络 Vϕ对最强策略做 MC 策略评估,拟合局面胜率只提供评估,不产生动作。围棋转移是确定的 s′=f(s,a),故 Q⋆(s,a)=−V⋆(f(s,a))(负号因为轮到对手)——学 V 而不是 Q 是这个结构的利用
4. 快速走子 πψfast轻量策略网络,单步推理快约三个数量级为搜索叶节点提供低成本的 rollout 评估

单靠任何一步都不行:裸网络原则上可用天价算力胜人类(换算经验律:棋力每 +120 ELO 约对应训练算力或测试时搜索算力翻倍;照此粗估,裸网络胜人类顶尖约需千倍训练算力,胜过含搜索的完整 Zero 级系统约需十万倍——经验律转述自课程引用的 Noam Brown 估计),纯 minimax 树搜索不需学习但随深度指数爆炸。人类棋手的参照恰好是两者相加:直觉给出候选与局面感(System 1,网络),审慎推演验证后果(System 2,搜索)——AlphaGo 用网络引导搜索聚焦相关区域,两个系统互为放大器。

2. MCTS 三原则 ​

蒙特卡洛树搜索 (Monte Carlo Tree Search, MCTS) 在算力预算内组织这场协作,三条原则:

  1. 逐步扩张:树随算力预算逐步加宽加深,每轮迭代选中一条路径改进它;
  2. 控宽度:只深入「好」动作——先验概率高、评估价值高、或尚未深思过的;动作选择用 UCT 型规则,形如 Qϕ(s,a)+ρπ(a∣s)/N(s,a)(探索项随访问次数衰减);
  3. 控深度:前瞻有限步截断,叶节点价值由价值网络 Vϕ 与快速走子 rollout 各半加权估计。

这三条原则形式化的对象是人类棋手深思时的一份典型剧本,课程口述里带有具体数字(此处转述):看到局面凭直觉列出约五个候选——控宽度的来源;对每个候选想象对手的几种可能回应,并清楚不可能穷举——逐步扩张时保留谁的选择压力;心中模拟 10–30 步而非推演到终局——控深度的来源;最后停在某个中间局面,凭局面感评估「走到这里是好是坏」——叶节点由 Vϕ 与 rollout 加权估值的对应。上一小节的 System 1 / System 2 映射在这份剧本里逐条落了地。

回溯给根节点各动作赋强度,提交最优的一步——考虑许多未来步,但只提交一步;到下一步重新规划。消融实验确认四个组件(IL 策略、RL 策略、价值网络、走子)全部必要:没有 πIL 的热启动,RL 阶段毫无进展。

3. AlphaGo Zero 与专家迭代 ​

AlphaGo Zero(2017)去掉人类棋谱依赖:残差网络共享底座、双头输出 fθ(s)=(πθ(s),Vθ(s));训练数据由带搜索的策略自己产生。核心循环叫专家迭代 (expert iteration):

Mn→ 搜索增强 Mn+→ Mn+1 模仿 Mn+ Mn+1⋯

给定网络,用「网络 + 搜索」增强它,再让下一代网络模仿增强后的策略。MCTS 的动作强于裸网络,所以每一次模仿都在向更强的教师学习;这个循环可视为模仿学习与策略迭代的双重推广,比纯策略梯度学得快得多(名称出自 Anthony 等 2017 的 "Thinking Fast and Slow with Deep Learning and Tree Search")。第12章的 test-time compute 讨论是这个循环在推理任务上的回声。

4. test-time compute 的一句话数学辩护 ​

为什么「推理时多花算力」能换来「训练时天文数字算力才买得到」的能力?因为两个问题的规模不同:预训练策略必须应对所有可能到达的局面——找到完美策略等于预先解完整盘棋;树搜索只处理从当前局面可达的局面子集——解一个严格更小的子问题。搜索在部署时把「全空间问题」折叠成「当前可达子空间问题」,这就是 test-time scaling 的性价比来源。


动手实验:Cliff Walk 五级阶梯 ​

Cliff Walk 是经典 4×12 网格世界:起点在角上,终点在其同排另一端,两者之间沿边排布一段悬崖;每走一步奖励 −1,坠崖重罚并回到起点,到达终点结束(网格尺寸与奖励的具体数值以 CliffWalkEnv 的定义为准)。最短安全路径恰好贴着悬崖边缘走 13 步——所以起点的 V⋆=−13,这是 python/tests/test_rl_basics.py 的确定性断言。本节用 python/llm_core/rl_basics.py 的四个入口(CliffWalkEnv / value_iteration / policy_evaluation_exact / reinforce_train)走完五级:前三级是精确端,后两级是采样端。参数名与返回结构的权威定义以该模块的 docstring 与其测试为准;以下片段给出调用形状。

先跑通整条链的最小命令(Windows PowerShell 与 bash 通用写法):

bash
cd <仓库根目录>
PYTHONPATH=python python -m pytest python/tests/test_rl_basics.py -q

第 1 级:表格蒙特卡洛评估 ​

目标:不动任何迭代理论,先用最朴素的方式估计「随机策略下每个状态值多少」。

python
# PYTHONPATH=python python -c "..."
from llm_core.rl_basics import CliffWalkEnv

env = CliffWalkEnv()
# 对每个起始状态采 N 条完整回合,用经验回报均值估计 V^pi(随机策略)。
# 预期信号:悬崖邻域状态价值明显更负(随机策略有概率坠崖)。

观察点:MC 估计无偏但抖——同一状态换 seed 重跑,估计值的波动直观展示「方差大」不是修辞。

第 2 级:价值迭代 ​

python
# PYTHONPATH=python python -c "..."
from llm_core.rl_basics import CliffWalkEnv, value_iteration

env = CliffWalkEnv()
V_star = value_iteration(env, gamma=1.0)
# 预期信号:起点 V*(start) = -13;对 V* 逐状态贪心提取的策略
# 恰好沿悬崖边缘走最短安全路径。

terminal-only 奖励结构(每步 −1 只在有限步内累积)让 γ=1 落在阶段二情形 1——VI 收敛不需要折扣。换一个 γ<1 重跑,收敛更快但最优路径可能变短视,这是折扣的偏置直观。

第 3 级:线性代数精确解对拍 ​

固定(贪心)策略 π 下,Bellman 期望方程是线性方程组 Vπ=rπ+γPπVπ,精确解为

Vπ=(I−γPπ)−1rπ

(对非终态子矩阵求解)。policy_evaluation_exact 给出这个解析值,用它对拍第 1 级的 MC 估计与第 2 级 VI 收敛值:MC 估计应在精确解附近抖动,VI 序列应单调逼近。迭代算法的正确性由一个不迭代的算法裁决——这是本课「对拍」纪律在 RL 上的用法。

第 4 级:表格策略梯度——baseline 的作用(A2C 思想骨架) ​

深度 A2C 用神经网络扮演 actor 与 critic;表格版把两者都退化为查表:策略是每状态的 softmax 概率行,critic 是每状态的价值标量。更新循环即阶段四的公式直译——沿回合逐步算未来奖励,减去 baseline b(st),乘 ∇θlog⁡π 推表格 logits。reinforce_train 的带 baseline 用法就是这一级(课程 notebook 在同位置留了一行注释掉的「去掉 baseline」损失,邀请学生亲手复现失败——下一节故障注入做同一件事)。

第 5 级:REINFORCE 完整训练循环 ​

python
# PYTHONPATH=python python -c "..."
from llm_core.rl_basics import CliffWalkEnv, reinforce_train

env = CliffWalkEnv()
report = reinforce_train(env, episodes=3000, seed=42)
# 预期信号:固定 seed 下,训练后期望回报显著优于随机初始化策略,
# 学到的路径趋向悬崖边缘的最短安全路径(与 V* 对应的 -13 同方向)。

这是本课唯一一个「真的在跑的策略梯度训练循环」:采样、算回报、减 baseline、推 logits、重复。它与第12章的 grpo_policy_update 共享策略梯度定理的数学结构,但不共享优化景观——表格 Cliff Walk 的收敛数字不能外推到 LLM 规模的 PPO/GRPO 训练动态。


故障注入与预期信号 ​

两处注入分别攻击阶段四与阶段二的两根支柱。

注入 1:关掉 baseline ​

把第 4/5 级更新里的 baseline 项去掉(reinforce_train 为此提供的无 baseline 用法,参数见模块 docstring),固定 seed 重跑同样轮数。

  • 预期信号:期望回报相对带 baseline 版明显退化——曲线更抖、收敛更慢,甚至在低回报区长期徘徊。课程讲义对同一实验的标注是「没有 baseline,这训练不动——目标方差太大」(Ernest Ryu, RL of LLMs (Spring 2025) Chapter 1 对 Cliff Walk 设定的原话转述)。机制即阶段四第 5 小节:全负奖励下每个被采到的动作都被压概率,只剩 softmax 归一化的相对挤压在提供信号。
  • 对照:同样的无 baseline 更新放到「奖励有正有负」的环境上,退化会减轻——符号信号部分回来了。

注入 2:正奖励环上的价值迭代 ​

手搓一个两状态 MDP:状态 s0 上有动作保持自环且奖励 +1。对它跑价值迭代:

  • γ=1:预期信号为 V(s0) 逐轮线性增长、不封顶,数值上以溢出或 inf 告终——压缩性消失,Banach 定理的前提整个不成立。这正是阶段二情形 2 的可执行版本。
  • γ=0.9 对照组:收敛到解析值 1/(1−γ)=10。折扣把无限累积折成有限几何级数,病态消失。

故障矩阵 ​

注入场景攻击的机制预期失败信号对应理论
关 baseline方差缩减增强 #2 被移除固定 seed 下回报退化、曲线抖动加剧策略梯度定理 + softmax 归一化硬推
正奖励环 + γ=1 的 VI压缩映射前提被移除V 逐轮增长至 inf/溢出Banach 不动点;阶段二情形 2
正奖励环 + γ=0.9(对照)折扣恢复压缩收敛到 1/(1−γ)几何级数
MC 评估换 seed 重跑高方差的无偏估计同一状态的估计值显著波动Rao–Blackwell 论证「平均掉更多随机性」的动机

追遗:跑得快的地方(Loose Ends) ​

(本节的补遗结构装置源自 Pramod Goyal 的 Reinforcement Learning from scratch #1(2026);三笔补遗对应 Sutton & Barto 第 4 章。)

正文为了推进速度略过的严格性,集中补三笔欠账。

VI 为什么收敛。 一句话回指:B⋆ 是 γ-压缩映射,Banach 不动点定理保证从任意初值起的几何收敛——阶段二第 2、3 小节已完整证明。补一个几何注脚:每轮全状态扫掠让最优 Bellman 算子多展开一步动态。在 terminal-only 奖励、γ=1 的网格设定里可以精确地说——离终态 k 步以内的状态在第 k 轮后已拿到精确值;一般情形则是「离得越近越先定型,误差按 γk 收缩」。每轮扫掠把最优性向外传播一格,涟漪一圈一圈扩到每个格子(阶段二涟漪比喻的格数版)。

policy improvement 定理。 阶段二第 4 小节引用了它(「Policy improvement 定理保证 Vπk+1≥Vπk」),这里补上论证。定理:若 π′ 在每个状态都满足 qπ(s,π′(s))≥vπ(s)——「按 π 的价值表看,π′ 选的动作不差」——则 vπ′(s)≥vπ(s) 处处成立。贪心改进自动满足前提,因为平均不超过最大:

vπ(s)=∑aπ(a∣s)qπ(s,a)≤maxaqπ(s,a)=qπ(s,πgreedy(s)).

紧凑三行论证收尾:其一,贪心动作的 q 值是全部动作 q 值的 π 加权平均的上界(上式);其二,从 s 出发先走一步 π′(s)、之后处处交回 π,这个混合回路的期望已不低于 vπ(s),对后续状态逐个套用同一不等式即得 vπ′≥vπ;其三,有限 MDP 的确定性策略只有有限个,每次非最优的改进都严格抬升 V——严格抬升的链条有限步内必停,停点满足 Bellman 最优性方程 vπ=maxaqπ(s,a),故 vπ=V⋆。

GPI(generalized policy iteration,广义策略迭代)。 把「评估」与「改进」看成两个同时在场的过程:改进改的是 π,评估赖以做加权平均的权重随之换底;评估改的是 V,改进赖以贪心的那张表也随之换底——两个过程互为对方改地面,唯一的共同稳定点是「一个对自己的值函数贪心的策略」,在那里两个过程同时静止。policy iteration 与 value iteration 是这个连续谱的两个端点:前者每轮把评估跑到底,后者每轮只让评估扫一遍;中间任何截断比例都合法,而实践形态几乎总在中间。这里补阶段二欠下的点睛句:策略评估与价值迭代只差一行——把 Bellman 期望方程里的「π 加权平均」换成 max,评估循环就翻成最优性循环。此后几乎每个 RL 算法都是 GPI 的某个版本:actor-critic(阶段四)是两个过程的网络化并发,expert iteration(阶段五)是把「改进」这一半交给搜索的 GPI。


本页验收 ​

闭卷口试题(每题 5–10 分钟自测):

  1. T 是随机变量时 E∑t=0T(⋅)≠∑t=0TE(⋅) 错在哪一步?吸收态技巧如何让生成 MDP 的 <EOS> 终止复用同一套记账?
  2. Bellman 最优性方程的证明为什么必须分两段?第一段结束时我们知道什么、还不知道什么?夹逼链 Vπ≤B⋆kVπ→V⋆ 用了 B⋆ 的哪两条性质?
  3. 列举 γ=1 的三种病态。为什么「奖励只在终止时给一次」让无 KL 惩罚的 RL-LLM 在 γ=1 下合法?KL 惩罚吸收进逐 token 奖励后,这个论证要在哪个对象上重做?
  4. 半梯度为什么「可证明不是梯度下降」?.detach() 在 TD 目标上切断的是前向计算还是反向图?切断错了会得到什么?
  5. 四个方差缩减增强中,哪几步保持无偏、哪一步引入偏差?引入偏差的那一步换来了什么?Vϕ 拟合得差为什么不破坏统一定理的无偏性?
  6. 全正奖励、无 baseline 的策略梯度更新里,「好动作被推高」的信号从哪来?构造一个直觉反例说明「全正 Ca 却把最优动作概率推低」为何可能发生。
  7. PPO 的 clip 目标按「悲观下界」怎么读?为什么说它「消除了把 θ 移得太远的激励」,这与信任域是什么关系?
  8. AlphaGo 四步训练中,第 2 步的无 baseline 策略梯度为什么在围棋上能工作,而第 4/5 级 Cliff Walk 实验里去掉 baseline 会退化?(提示:z=±1 的对称奖励 vs 全负的步惩罚。)
  9. 用「预先解整盘棋 vs 只解当前可达子集」解释 test-time compute 的性价比;这个论证对第12章的多数投票与更长 CoT 各对应哪一半?
  10. 4×4 网格世界,出口在左上角与右下角,每步奖励 −1、γ=1、转移确定;随机游走策略(四方向等概率)下某格的 vπ=−14,其正下方一格 vπ=−6(下方更靠近出口)。站在该格,「先刻意向下走一步、之后一切交回随机游走」这条路的第一步值多少?它与全程随机游走的 −14 相比说明什么?(答案:qπ(s,↓)=−1+1×(−6)=−7,一步前瞻法——即时奖励加 γ 倍下一状态值;−7 远高于 −14,对当前价值表贪心一步即可大幅优于策略平均水平,正是追遗节 policy improvement 的单步版本。)

论文与延伸 ​


资源 / 成本 / 隐私 ​

本页动手实验全部为 CPU 上的表格计算:五级实验与两个故障注入合计运行时间在秒级,网络带宽与费用为 0。python/llm_core/rl_basics.py 及其测试不依赖任何外部服务; Cliff Walk 环境参数(网格尺寸、奖励数值)以该模块定义为准。


Evidence ​

学习者提交模板(待填写,不是当前机器证据) ​

复制下面模板并填写自己的真实运行结果。所有 <...> 都是未填写状态;actual 必须替换为本次运行的真实记录。

yaml
schema: learn-llm.evidence.v1
module: rl-foundations
commit: <learner-commit-sha>
verified_at: <iso-date>
environment: <sanitized-python-device>
seed: 42
commands:
  - PYTHONPATH=python python -m pytest python/tests/test_rl_basics.py -q
metrics:
  - name: cliff_walk_v_star_start
    expected: -13
    actual: <recorded-value>
  - name: vi_matches_exact_solution
    expected: true
    actual: <recorded-value>
  - name: reinforce_beats_random_init
    expected: true
    actual: <recorded-value>
  - name: no_baseline_degrades_return
    expected: true
    actual: <recorded-value>
  - name: gamma_one_loop_diverges
    expected: inf-or-overflow
    actual: <recorded-value>
artifacts:
  - python/llm_core/rl_basics.py
cost:
  gross_usd: 0
  credit_usd: 0
licenses:
  - source: Ernest K. Ryu, RL of LLMs (Spring 2025), Chapter 1
    license: link-only-attribution
  - source: Pramod Goyal, Reinforcement Learning from scratch #1 (2026)
    license: link-only-attribution
known_failures:
  - none

表格 Cliff Walk 的收敛数字只描述固定 seed 下的本仓库 fixture,不外推到 token 级 PPO/GRPO 训练动态;两者共享数学结构(策略梯度定理、Bellman 算子),不共享优化景观。


下一步 ​

一般理论就位后,两条路都已铺好:回到第11章,把 PPO 目标、GAE 与 KL 安全绳逐项挂到本页的定理编号上;或直接进第12章,在 grpo_policy_update 的 toy 循环里认出本页的策略梯度结构——再往后,第22章 Capstone 的验证式自提升正等着 expert iteration 的回声。

私有学习站 · 原理从零构建 · 勿提交个人隐私或密钥