AI Hero Club

推理模型与强化学习 · 第 3 章

已自行标记完成0 / 8

仅保存在当前浏览器;完成标记不代表通过项目验收。

本章提纲 9 个小节
全课目录 8 章
完整课程计划 ↗
推理模型与强化学习 / 课程计划 ↗

CHAPTER 03 / 8建议学习 135 分钟

组内比较:哪些优势估计保持正确

减去同组平均奖励为何可能改变期望梯度,而留一平均在什么条件下保持无偏?

本章要解决的 3 个问题
  • 证明独立基线与留一基线的无偏条件
  • 精确算出含自身组均值的缩放偏差及标准差归一的变化
  • 在全零组、相关采样和不同任务难度下解释失效
课程项目 ZIP ↓

基线先是一个期望恒等式

第二章得到奖励乘score的梯度估计,但其方差可能很大。本章给回报减去基线;基线不是奖励真值,而是参照数。固定输入x,若基线 b(x)b(x) 不依赖当前抽到的轨迹,则它乘score的期望为基线乘零,减去后不改变期望梯度。基线即使数值估错也仍无偏;它影响方差而不是这个恒等式。允许基线由其他独立样本估计,条件是在给定x后与当前样本独立,并在计算score损失时停止梯度。

如果基线直接看当前动作再决定,就不能把它提出期望。极端例子是基线等于当前奖励,所有优势都零,梯度永远零;显然不再等于一般非零的目标梯度。另一个常见混淆是把“无偏”理解成每一批更新方向都好。无偏只描述固定参数时重复抽样的均值,某批估计仍可能很差;经过非线性优化器、裁剪和后续参数改变,参数轨迹也不是精确梯度轨迹的无偏复制。

E[(R−b(x))s∣x]=E[Rs∣x]−b(x)E[s∣x]=∇J(x)\mathbb E[(R-b(x))s\mid x]=\mathbb E[Rs\mid x]-b(x)\mathbb E[s\mid x]=\nabla J(x)
基线与当前轨迹独立,score条件均值零。

算例一:两个动作的最简单控制变量

令正确动作概率一半、奖励一,错误动作奖励零。对正确动作logit的score,正确时为一半,错误时为负一半。不加基线,估计器以一半概率取一半,一半概率取零,均值 E[G]=1/2×1/2+1/2×0=1/4;二阶矩 E[G²]=1/2×(1/2)²=1/8。方差的定义是 Var(G)=E[(G−E[G])²]=E[G²]−E[G]²,所以这里为 1/8−(1/4)²=1/16。减常数基线一半后,正确时 (1−1/2)(1/2)=1/4(1-1/2)(1/2)=1/4,错误时 (0−1/2)(−1/2)=1/4(0-1/2)(-1/2)=1/4,方差变零而均值不变。

这个例子不能推出基线取期望奖励总能使所有参数梯度方差最小。由于独立常数基线不改估计器均值,Var(G)=E[G²]−E[G]²中的均值平方与b无关,因此最小方差等价于最小二阶矩。对单个标量score s,最小化 E[(R−b)2s2]E[(R-b)^2s^2] 时,对b求导得到 b∗=E[Rs2]/E[s2]b^*=E[Rs^2]/E[s^2],前提分母正且矩存在。对向量 score,若目标是各坐标方差之和,同样展开平方范数,得到 b*=E[R‖s‖²]/E[‖s‖²];这不保证每个坐标各自都最优。只有score平方权重与奖励满足适当关系,才等于普通平均奖励。本项目使用可解释的留一组均值,不声称它是整个神经网络梯度方差的全局最优控制变量。

含自身的组均值为何少了一截

同一输入独立抽G条轨迹,令第i条奖励为 RiR_i、score为 sis_i,组均值为全部奖励之和除G。用 Ri−RˉR_i-\bar R 作为优势时,基线包含自己的奖励,因此不独立。展开期望:自身那项贡献原梯度的1/G,其他G−1项各因独立而乘零。减去后每项期望是原梯度的 1−1/G1-1/G,对组求平均仍是这个缩放。

这里结论针对不除标准差、同输入独立同分布、固定参数采样、每条相同权重的估计器。G 为八时缩小到八分之七(7/8);G为二时只剩一半;G为一完全零。正的常数缩放有时可以调整学习率吸收,但不能因此叫原目标的严格无偏估计。若任务组大小不一致,不同输入会被不同缩放,连任务权重也改变,不再是简单一个全局学习率可修正的问题。

E ⁣[1G∑i(Ri−Rˉ)si]=(1−1/G)∇J,AiLOO=Ri−∑j≠iRjG−1\mathbb E\!\left[\frac1G\sum_i(R_i-\bar R)s_i\right]=(1-1/G)\nabla J,\quad A_i^{\mathrm{LOO}}=R_i-\frac{\sum_{j\ne i}R_j}{G-1}
固定输入、IID采样、不除随机标准差时的精确关系。

留一组均值恢复独立性

定义第i条的留一基线为其他G−1条奖励的平均。给定输入和当前参数,独立采样保证其他轨迹与第i条独立,于是基线乘第i条score期望为零。对每条都这么做,再求平均,得到目标梯度的无偏估计。代数上它也等于含自身均值优势乘G除G−1,所以代码可以用总和减自身,高效地一次计算所有留一基线,而不用真的循环重建G份列表。

项目 run.py 的 loo_advantages 把扁平批次按组reshape,要求G至少二且总元素数能整除G。它先求每组和,减当前值再除G−1。所有任务的组必须连续放置;如果先把不同任务样本打乱却仍按八条一组,虽可能偶然形成独立基线,但就不再是约定的同输入控制变量,难度差异会提高方差,解释也与讲义不符。样本编号和输入记录比只存一个平均奖励更有用。

算例二:四条轨迹的优势逐项算

取组奖励 [1,0,0,0]。组均值0.25,含自身优势 [0.75,-0.25,-0.25,-0.25];留一基线分别为 [0,1/3,1/3,1/3],留一优势 [1,-1/3,-1/3,-1/3],恰为前者乘4/3。两组优势和都为零,但“优势和零”本身不能证明期望梯度正确,因为还要乘各自不同的score。零和只说明组内中心化的代数性质。

如果奖励变为 [0,0,0,0] 或 [1,1,1,1],两种中心化优势均为零。它们在本组没有相对信息,不等于整个策略梯度必为零:其他可能抽到的组仍可给非零贡献。项目实际还把采样对数概率比惩罚纳入回报,所以奖励相同但概率比不同的组,正则部分仍可能有信号;训练开始策略与参考完全一致,惩罚为零,若同时无成功,第一批确实可能完全不更新。

标准差归一不是免费操作

有些组相对方法把中心化奖励再除组标准差加小常数。标准差是当前整组随机变量,依赖当前轨迹,与score相关,因此前面的独立基线证明不能直接沿用。即便不含自身基线,也不能把随机分母当成常数提出期望。这样做可能控制尺度,但优化对象和任务加权会改变;必须把它当作不同估计器研究,而不是把“数值更稳定”当作保持原目标的证明。

例如同一输入的两组都只有一条成功,但一组奖励差值被人工缩放十倍。未经标准差归一的梯度也放大十倍;标准差归一后可能近似抵消。这不是哪一种必然正确,而是它们对奖励尺度有不同含义。DeepSeekMath提出的GRPO还涉及旧策略、裁剪、KL和具体优势定义,本课只借其组比较视角,真实项目实现明确的on-policy留一REINFORCE,不挂一个完整GRPO复现的名称。

独立采样条件可以被破坏

若同一组使用束搜索得到几条强相关路径,或抽一条后把它复制八份,其他轨迹不再独立,留一基线也会携带当前动作信息。复制情况下每条奖励相同,中心化完全零,无论真实梯度是否非零。无放回采样也需要重新计算条件分布,不能套用独立同分布证明。项目对每条轨迹独立使用同一模型的分类采样,没有去重、重排或按奖励过滤后再训练。

固定随机种子使实验可重放,不等于把同一随机数重复用于所有成员。torch.Generator控制连续随机数流,multinomial对批内每行产生各自的抽样。测试用同一初始种子重跑应得到同样轨迹,用来查实现漂移;训练中不会每个成员都重新设同一个种子而制造完全相关样本。数据生成、训练采样和评价采样的种子也分开记录。

BUILD THE MECHANISM

用精确枚举检查留一基线

实现无基线、含自身均值和LOO三种组score估计。 下载本课完整项目,在项目根目录运行;只编辑 learner/starter.py,已有构造框架由项目提供。

输入与输出 G>=2;LOO基线排除当前reward;组输出还需除G。
score视作已给定梯度向量,本函数不把基线对policy反传。

在课程项目目录运行待完成的学习任务
# estimate
def estimate(rewards,scores,mode='loo'):
    raise NotImplementedError('loo')
提示 1

给G=2写四种有序动作组,不用大样本近似。

提示 2

第i基线=(总reward−ri)/(G−1)。

提示 3

每组乘其联合概率;含自身均值应缩小(G−1)/G。

独立检查 .venv/bin/python -m learner.check --stage loo --output runs/learner-loo.json

迁移检验 改p=.3、G=3,用枚举和先写下的精确梯度比较;复制同一成员不再满足独立无偏前提。

参考实现与解释
在课程项目目录运行参考实现
# estimate
def estimate(rewards,scores,mode='loo'):
 n=len(rewards)
 if n<2 or len(scores)!=n:raise ValueError('at least two paired samples')
 if mode not in ['none','self','loo']:raise ValueError('unknown baseline')
 total=sum(rewards);out=[0.]*len(scores[0])
 for i,(reward,score)in enumerate(zip(rewards,scores)):
  baseline=0 if mode=='none'else total/n if mode=='self'else (total-reward)/(n-1)
  for j,s in enumerate(score):out[j]+=(reward-baseline)*s/n
 return out

本章交付是可枚举的偏差证据

stdlib lab.py 对三动作策略和G等于二、三、四的全部组枚举,总计分别九、二十七、八十一种组。每组概率是动作概率的乘积,累加每条优势乘score再按G平均;结果逐坐标验证留一估计等于解析梯度,含自身均值等于其固定缩放。这不是用大量蒙特卡洛样本近似一个漂亮结论,而是有限空间的精确加权求和,只受浮点舍入误差影响。

读者还应主动移除独立性条件:把组强制复制,就会得到零梯度反例。移除G大于一条件,留一分母为零,代码必须拒绝而不是加一个很小epsilon糊过去。对全零奖励,正确行为是保留零信息而不是偷偷补一个伪成功。下一章把参考策略惩罚加入回报,仍保持本章所有抽样、独立和停止梯度条件,才能把数学推导接到真实训练。

在课程项目目录运行可直接运行的检查
from lab import finite, group_expectation
z=[.3,-.2,.1];g=4
t=group_expectation(z,g);truth=finite(z)["gradient"]
assert max(abs(a-b) for a,b in zip(t["leave_one_out_gradient"],truth)) < 1e-12
print(t)

TRY IT YOURSELF

练习一:三条奖励的留一基线

奖励[1,1,0],计算留一优势与含自身均值优势。

提示 1
先算整组平均,再逐个排除自身计算其他成员均值。
提示 2
分别写两种优势向量,比较比例;优势和为零与对抽样期望无偏不是同一检查。
对照参考解答
均值2/3,含自身优势[1/3,1/3,−2/3]。第一、二条的其他奖励均值1/2,第三条其他均值1,所以留一优势[1/2,1/2,−1],是前者乘3/2。零和不是无偏证明;无偏来自其他样本在给定输入后的独立性。

TRY IT YOURSELF

练习二:相关采样反例

先抽一条,再复制成八条,用留一基线会怎样?

提示 1
复制后的其他成员还与当前样本独立吗?先比较所有奖励。
提示 2
逐项算排除自身均值,再问所得梯度能否匹配一般非零的真实梯度,定位失效的独立性前提。
对照参考解答
所有奖励相同,留一均值恰等于自身奖励,优势全零。真实策略梯度一般非零,所以估计有偏。问题不是G不够大,而是其他成员与当前样本完全相关,独立基线证明失效。

TRY IT YOURSELF

练习三:最小方差基线

对标量score s,最小化E[(R−b)^2 s^2],推导常数b。

提示 1
把目标展开成关于b的二次式,s²是权重。
提示 2
对b求导时R和s不随b变;检查E[s²]为正及为零两种情形,别直接猜均值奖励。
对照参考解答
对b求导得−2E[(R−b)s²]=0,若E[s²]>0,则b=E[Rs²]/E[s²];二阶导数2E[s²]>0保证唯一极小。若E[s²]=0,score几乎处处零,所有b相同。这个加权式一般不等于E[R]。

CHECK YOUR UNDERSTANDING

检验理解

先作答,再决定是否展开解析。选择题用于发现理解缺口;独立实现与迁移任务仍需另行检验。

1. G=8的含自身均值估计在本章条件下缩放多少?

查看解析自身奖励进入基线,减去原梯度的1/G。
2. 留一基线无偏需要什么?

查看解析给定输入和当前参数,其他成员独立才能把基线乘score的期望消掉。
3. 除以当前组随机标准差后能直接沿用无偏证明吗?

查看解析随机分母依赖当前样本,不是可提出期望的常数。
4. 零奖励组应如何处理?

查看解析零信息本来就是稀疏奖励问题的一部分。

自行标记用于记录学习进度,不代表通过项目验收。