想象你要在颠簸的船上测量远处海岛的高度。如果你直接从船甲板往上量,船一浪一浪地晃,读数忽高忽低,你很难判断海岛到底多高。聪明的做法是先找一个稳定的“海平面”作为基准,再从海平面量起。策略梯度训练也面临同样的风浪:每次用一整条轨迹的回报去估计梯度,噪声极大,训练像在暴风雨里测高度。本文要讲的“基线”,就是强化学习里的海平面,它不会改变你的测量目标,却能大幅减少波浪带来的抖动,让策略梯度这只“小船”更快更稳地驶向收敛。

岗位关联

学会基线降方差,你才能把 REINFORCE、Actor-Critic 从“能跑”变成“跑得稳、收敛快”,这是策略梯度算法实用化的关键一步,也是面试和工程优化中的高频考点。

目录
  1. 可视化演示
  2. 方差问题根源
  3. 基线思想原理
  4. 期望不变性
  5. 状态值函数基线
  6. 方差下降机理
  7. REINFORCE实战
  8. Actor-Critic扩展
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示用基线降低策略梯度方差的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

用基线降低策略梯度方差:策略梯度 策略梯度高方差问题的根源 基线不改变梯度期望的数学证明 核心机制可视化 用基线降低策略梯度方差整体架构与关键组件

方差问题根源

想象你站在船甲板上测量海岛高度。每一次浪潮打过来,甲板都会上下起伏,你报出的数字可能相差几十米。策略梯度的原始估计也是如此:它用一整条完整轨迹的回报 \(G_i\) 当作打分器,而一条轨迹里有大量随机性——开局方式、动作选择、环境噪声全都会叠加进这个数字里。

原始策略梯度的蒙特卡洛估计可以写成:

船晃得越厉害,测量就越不准。高方差会让梯度方向忽左忽右,策略参数像醉汉走路,训练自然又慢又不稳定。

∇J^(θ)=1N∑i=1N∇θlog⁡πθ(ai∣si) Gi\displaystyle \widehat{\nabla J}(\theta)=\frac{1}{N}\sum_{i=1}^{N}\nabla_\theta\log\pi_\theta(a_i|s_i)\,G_i
  1. 策略梯度目标我们要优化策略参数 \(\theta\),使期望回报最大,梯度方向由“对数策略 × 回报”构成。
    ∇θJ(θ)=E[∇θlog⁡πθ(a∣s) G]\nabla_\theta J(\theta)=\mathbb{E}[\nabla_\theta\log\pi_\theta(a|s)\,G]
  2. 蒙特卡洛近似真实期望无法精确计算,于是用 \(N\) 条轨迹的回报平均值来估计。
    ∇J^(θ)=1N∑i=1N∇θlog⁡πθ(ai∣si)Gi\widehat{\nabla J}(\theta)=\frac{1}{N}\sum_{i=1}^{N}\nabla_\theta\log\pi_\theta(a_i|s_i)G_i
  3. 方差爆炸点每条轨迹的 \(G_i\) 彼此差异巨大,平均后仍带有明显噪声。
    Var(∇J^)=1N2∑iVar(∇θlog⁡πθ(ai∣si)Gi)\mathrm{Var}(\widehat{\nabla J})=\frac{1}{N^2}\sum_i\mathrm{Var}(\nabla_\theta\log\pi_\theta(a_i|s_i)G_i)

基线思想原理

聪明的测量员不会从晃动的甲板量起,而是先找一个稳定的水平面,再从水平面量到海岛。这个水平面就是“基线”。在策略梯度里,基线是一个只依赖状态 \(s\)、不依赖动作 \(a\) 的函数 \(b(s)\)。它像是给每个状态设定了一个本地零刻度,让梯度只关注“这次选择比平常好多少”。

加入基线后的梯度估计变为:

从甲板量改成从海平面量,海岛的真实高度并没有变,但读数稳定多了。同理,减去基线不会改变策略梯度的期望,却能让每一步更新更“靠谱”。

∇J^base(θ)=1N∑i=1N∇θlog⁡πθ(ai∣si) (Gi−b(si))\displaystyle \widehat{\nabla J}^{\mathrm{base}}(\theta)=\frac{1}{N}\sum_{i=1}^{N}\nabla_\theta\log\pi_\theta(a_i|s_i)\,(G_i-b(s_i))
  1. 构造新读数每个样本的回报 \(G_i\) 都减去同一个状态下的基线 \(b(s_i)\)。
    Gi−b(si)G_i-b(s_i)
  2. 基线不取动作\(b(s_i)\) 只随状态变化,和当前选择了哪个动作无关。
    b(si)=b(s)只依赖 sb(s_i)=b(s)\quad\text{只依赖 } s
  3. 新估计量把“回报”替换成“优势”,再用它加权对数策略梯度。
    ∇J^base(θ)=1N∑i=1N∇θlog⁡πθ(ai∣si)(Gi−b(si))\widehat{\nabla J}^{\mathrm{base}}(\theta)=\frac{1}{N}\sum_{i=1}^{N}\nabla_\theta\log\pi_\theta(a_i|s_i)(G_i-b(s_i))

期望不变性

为什么基线没有改变测量目标?关键在概率论的一个小魔法:策略的各个动作概率加起来必须等于 1,而“加起来等于 1”的式子求导之后恰好是 0。这就像一整块蛋糕分成很多份,无论怎么分,总和始终是一整个;如果把分法扰动一下,总和的变化率也是 0。

严格写成公式:

这个恒等式告诉我们:任何与动作无关的项,乘到 \(\nabla_\theta\log\pi_\theta\) 上再求期望都是零。所以 \(b(s)\) 可以放心地加进去、减出来,它只会影响方差,不会污染期望。

Ea∼πθ[∇θlog⁡πθ(a∣s)f(s)]=f(s)∑a∇θπθ(a∣s)=0\displaystyle \mathbb{E}_{a\sim\pi_\theta}\left[\nabla_\theta\log\pi_\theta(a|s)f(s)\right]=f(s)\sum_a\nabla_\theta\pi_\theta(a|s)=0
  1. 对数梯度恒等式对数策略的梯度等于策略梯度除以策略本身。
    ∇θlog⁡πθ(a∣s)=∇θπθ(a∣s)πθ(a∣s)\nabla_\theta\log\pi_\theta(a|s)=\frac{\nabla_\theta\pi_\theta(a|s)}{\pi_\theta(a|s)}
  2. 按期望展开把期望写成所有动作的加权求和,\(\pi_\theta(a|s)\) 刚好约掉分母。
    ∑aπθ(a∣s)∇θπθ(a∣s)πθ(a∣s)f(s)=∑a∇θπθ(a∣s)f(s)\sum_a\pi_\theta(a|s)\frac{\nabla_\theta\pi_\theta(a|s)}{\pi_\theta(a|s)}f(s)=\sum_a\nabla_\theta\pi_\theta(a|s)f(s)
  3. 概率归一化求导\(\sum_a\pi_\theta(a|s)=1\) 是常数,对 \(\theta\) 求导必然为 0。
    ∇θ∑aπθ(a∣s)=∇θ1=0\nabla_\theta\sum_a\pi_\theta(a|s)=\nabla_\theta 1=0

状态值函数基线

海平面不是随便一画,最好选一个能代表“平常水位”的位置。在强化学习中,最自然的“平常水位”就是状态值函数 \(V^\pi(s)\):从状态 \(s\) 出发,按当前策略继续走下去,平均能拿多少回报。它正是回报 \(G_t\) 的条件均值。

实际中我们不知道真实的 \(V^\pi\),但可以用一个神经网络或线性模型去近似它。近似得越好,这个“海平面”就越平稳,梯度估计的波动就越小。

b(s)=Vπ(s)=Ea∼π[Gt∣st=s]\displaystyle b(s)=V^\pi(s)=\mathbb{E}_{a\sim\pi}\left[G_t\mid s_t=s\right]
  1. 状态值定义从状态 \(s\) 出发,以后所有折扣回报总和的期望。
    Vπ(s)=Eπ[∑k=0∞γkrt+k∣st=s]V^\pi(s)=\mathbb{E}_\pi\left[\sum_{k=0}^{\infty}\gamma^k r_{t+k}\mid s_t=s\right]
  2. 条件均值视角它是在“当前处于状态 \(s\)”这个条件下对回报取平均。
    Vπ(s)=E[Gt∣st=s]V^\pi(s)=\mathbb{E}[G_t\mid s_t=s]
  3. 作为中心趋势既然 \(G_t\) 围绕 \(V^\pi(s)\) 上下波动,用 \(V^\pi(s)\) 做零点,波动自然被“中心化”。

方差下降机理

为什么减去一个均值就能减少方差?想象你每次投飞镖,十次落点散布在一个大圆里;如果你先画一个中心点,再测量“偏离中心点有多远”,这些距离数字会比原始坐标更集中。关键原因是:回报 \(G\) 和基线 \(b\) 如果高度正相关,减法会抵消掉共同的随机起伏。

方差展开式揭示了这一点:

用值函数当地平线,相当于把“绝对回报”换成“超出预期的部分”。那些与状态本身相关的随机波动被提前扣除,留给梯度的只剩真正的决策信号。

Var[Q−b]=Var[Q]+Var[b]−2Cov(Q,b)\displaystyle \mathrm{Var}[Q-b]=\mathrm{Var}[Q]+\mathrm{Var}[b]-2\mathrm{Cov}(Q,b)
  1. 方差展开两个随机变量相减的方差由各自方差和两倍协方差决定。
    Var[Q−b]=Var[Q]+Var[b]−2Cov(Q,b)\mathrm{Var}[Q-b]=\mathrm{Var}[Q]+\mathrm{Var}[b]-2\mathrm{Cov}(Q,b)
  2. 正相关才能降方差只有 \(\mathrm{Cov}(Q,b)>0\) 时,最后一项才真正“减掉”部分方差。
    Var[Q−b]<Var[Q]当 Cov(Q,b)>0\mathrm{Var}[Q-b]<\mathrm{Var}[Q]\quad\text{当 } \mathrm{Cov}(Q,b)>0
  3. V(s)是最佳近似\(V^\pi(s)\) 是 \(Q(s,a)\) 对动作求平均的结果,天然和 \(Q\) 正相关,所以效果最好。
    Vπ(s)=Ea[Qπ(s,a)]V^\pi(s)=\mathbb{E}_a[Q^\pi(s,a)]

REINFORCE实战

在 REINFORCE 算法中,我们要跑完一整条轨迹,拿到每一步的折扣回报 \(G_t\),然后让策略参数沿着“优势越大、动作概率越大”的方向更新。这里的优势 \(A_t=G_t-b(s_t)\) 就像是修正后的高度差。

更新公式写成:

实践中,基线的参数可以同步用最小二乘更新去逼近 \(V(s)\)。这一步相当于不断校准海平面,让测量基准一直贴合当前状态,训练稳定性会肉眼可见地提升。

θ←θ+α∑t=0T−1∇θlog⁡πθ(at∣st) (Gt−b(st))\displaystyle \theta\leftarrow\theta+\alpha\sum_{t=0}^{T-1}\nabla_\theta\log\pi_\theta(a_t|s_t)\,(G_t-b(s_t))
  1. 折扣回报每一步的回报是当前奖励加上未来奖励的折扣和。
    Gt=∑k=tT−1γk−trkG_t=\sum_{k=t}^{T-1}\gamma^{k-t}r_k
  2. 优势项回报减去状态值基线,得出“这次动作比平均好多少”。
    At=Gt−b(st)A_t=G_t-b(s_t)
  3. 梯度上升更新参数沿着优势加权的对数策略梯度方向走一步,步长为 \(\alpha\)。
    θ←θ+α∑t∇θlog⁡πθ(at∣st)At\theta\leftarrow\theta+\alpha\sum_t\nabla_\theta\log\pi_\theta(a_t|s_t)A_t

Actor-Critic扩展

REINFORCE 要等整条轨迹结束才能更新,像一个每次都要等船靠岸才测量的人。Actor-Critic 则让“Critic”在航行途中就实时估计海平面,用一步之间的差值——也就是 TD 误差——来充当优势。这样不用等全部轨迹,方差进一步被压缩。

TD 误差定义为:

Actor 把 \(A_t=\delta_t\) 当成自己梯度更新的优势,Critic 则负责不断修正海平面。两个人配合,一个管“动作方向”,一个管“基准高度”,这就是现代强化学习中 Actor-Critic 家族的底层心脏。

---

δt=rt+γVw(st+1)−Vw(st)\displaystyle \delta_t=r_t+\gamma V_w(s_{t+1})-V_w(s_t)
  1. 单步预测差用下一个状态的价值加上当前奖励,和当前状态的价值做差。
    rt+γVw(st+1)r_t+\gamma V_w(s_{t+1})
  2. 减去当前估计这个差值衡量了“看到新状态后,对回报估计的修正量”。
    δt=rt+γVw(st+1)−Vw(st)\delta_t=r_t+\gamma V_w(s_{t+1})-V_w(s_t)
  3. Critic 拟合\(w\) 沿着 \(\delta_t\nabla_w V_w(s_t)\) 更新,让价值网络越来越准。
    w←w+β δt∇wVw(st)w\leftarrow w+\beta\,\delta_t\nabla_w V_w(s_t)

AI 应用场景

机器人灵巧手抓取

阶段:策略训练与优化

解决的问题:机械臂用 REINFORCE 学习抓取时,单次试错回报噪声极大,动作稍有不稳梯度就震荡。引入状态值函数基线后,每个状态都有了“当前平均抓取水平”作为参照,梯度只关注“这次抓取比平时好多少”,方差明显下降,训练更稳。

具体案例:一个抓取仿真任务中,无基线训练 5000 轮仍未收敛,加入 \(V(s)\) 基线后 1500 轮成功率就超过 90%。工程师还能用基线曲线监控策略是否在进步。

大模型 RLHF 中的 PPO

阶段:模型对齐与评测

解决的问题:大模型生成式策略的奖励稀疏且波动大,直接用 REINFORCE 式更新容易让生成质量剧烈抖动。PPO 使用价值网络作为基线,配合优势估计裁切更新,把“这次回复比平均好多少”作为信号,训练稳定得多。

具体案例:训练对话助手时,用 Critic 输出每个输入 prompt 的预期奖励基线,再结合 KL 惩罚计算优势。奖励方差降低后,人工评测分数从 72 分稳步提升到 84 分,不再出现“前一天好、后一天崩”的问题。

Python 演示

python43 行
import numpy as np def sigmoid(x):    return 1.0 / (1.0 + np.exp(-x)) def softmax_pair(logit):    p1 = sigmoid(logit)    return np.array([1.0 - p1, p1]) def run_episode(theta):    traj = []    s = 0.0    for _ in range(4):        f = np.array([1.0, s])        probs = softmax_pair(np.dot(theta, f))        a = np.random.choice([0, 1], p=probs)        r = 1.0 if a == 1 else -0.5        traj.append((f, a, r))        s += 0.25    return traj def reinforce_baseline(episodes=3000, lr_p=0.1, lr_v=0.1):    theta = np.zeros(2)    w = np.zeros(2)    for _ in range(episodes):        traj = run_episode(theta)        G = 0.0        for f, a, r in reversed(traj):            G = r + 0.9 * G            advantage = G - np.dot(w, f)            probs = softmax_pair(np.dot(theta, f))            grad = f * (a - probs[1])            theta += lr_p * advantage * grad            w += lr_v * advantage * f    return theta, w if __name__ == "__main__":    np.random.seed(0)    theta, w = reinforce_baseline()    print("learned theta:", theta)    print("learned baseline w:", w)    start_prob = sigmoid(float(np.dot(theta, np.array([1.0, 0.0]))))    print("action=1 prob at start:", start_prob)
目的:用一个小型 4 步环境演示 REINFORCE + 状态值函数基线,策略与价值网络同时更新,最终学到倾向选择动作 1 的优化策略。
  1. probs = softmax_pair(np.dot(theta, f))把线性得分转成两个动作的概率分布,相当于给“选动作”做决策。
  2. G = r + 0.9 * G从轨迹末尾倒着累加折扣回报,得到每一步的真实收益。
  3. advantage = G - np.dot(w, f)用当前价值网络当基线,算出“这次比平均好多少”。
  4. grad = f * (a - probs[1])对数策略梯度的简洁写法,动作越偏离当前概率,梯度信号越强。
  5. theta += lr_p * advantage * grad策略参数沿优势方向做梯度上升。
  6. w += lr_v * advantage * f价值网络同步逼近真实回报,让基线越来越准。

常见误区

误区我觉得基线一定要用精确的 \(V^\pi(s)\),否则会引入偏差,甚至让训练失效。

正解只要基线不依赖动作,任何 \(b(s)\) 都不会改变梯度期望,偏差始终为零。价值函数只是个“更聪明的海平面”,近似得越准,方差降得越多,但就算用常数 0.5 当基线,期望也完全正确。

为何常见:刚接触时容易把“效果好”和“数学上正确”混在一起,误以为非最优不可用。

误区把回报 \(G\) 减去一个数,最终学出来的策略不就不是原来那个最优策略了吗?

正解不是。因为 \(\sum_a\nabla\pi_\theta(a|s)=0\),减去的部分在期望层面完全消失。目标函数没变,变的只是每次更新的噪声大小。

为何常见:直觉上“少了一个数”总觉得吃亏了,忽略了概率分布的归一化约束。

误区既然基线不影响期望,那我随便取一个很大的负数,方差是不是也能降?

正解不一定。方差公式里有 \(+\mathrm{Var}[b]\) 这一项,基线本身太离谱反而会放大整体方差。只有选择与回报正相关、贴近回报中心趋势的基线,才能有效抵消公共波动。

为何常见:只记住了“期望不变”,没记住“方差如何变化”的完整公式。

误区Actor-Critic 里已经有 Critic 网络,所以它和基线没关系。

正解Actor-Critic 的核心优势项 \(A=Q-V\) 本质上就是“回报减基线”,TD 误差也是对优势的一种单步估计。Critic 存在的意义就是提供一个更及时、更低方差的基线。

为何常见:把“基线”理解成一个单独的取消项,而不是价值函数在梯度估计中扮演的通用角色。

面试题

Q1. 基线项 \(b(s)\) 要满足什么条件才能保证策略梯度期望不变?

单选题 · easy

  • A.与动作无关← 正确答案
  • B.与状态无关
  • C.与回报无关
  • D.必须等于 Q

答案:A。只要 \(b(s)\) 不依赖当前动作,\(\sum_a\nabla\pi_\theta(a|s)b(s)=0\) 就成立,期望不变。依赖动作的基线会破坏这个恒等式,从而引入偏差。

Q2. 原始策略梯度方差大的直接后果是什么?

单选题 · easy

  • A.梯度估计噪声很大← 正确答案
  • B.梯度一定等于零
  • C.回报必然变成负值
  • D.策略必然原地不动

答案:A。每条轨迹的回报随机性很大,导致用蒙特卡洛算出的梯度方向忽东忽西。这不是梯度为零,而是梯度“抖动”,会让训练不稳定。

Q3. 用状态值函数做基线时,优势项通常写成什么?

单选题 · mid

  • A.G 减 V(s)← 正确答案
  • B.Q 减 R_t
  • C.V(s) 减 G
  • D.R_t 减 V(s)

答案:A。优势 \(A=G-V(s)\) 表示“这条轨迹的实际回报比该状态的平均期望好多少”。其他组合要么方向反了,要么把不在同一时刻的量相减。

Q4. 为什么 \(V^\pi(s)\) 能有效降低梯度估计方差?

单选题 · mid

  • A.与回报 G 正相关← 正确答案
  • B.与回报 G 负相关
  • C.与动作高度相关
  • D.与状态完全无关

答案:A。\(V(s)\) 是 \(G\) 的条件均值,两者正相关,方差公式里的负数协方差项能抵消一部分公共波动,所以方差下降。

Q5. 如果基线 \(b(s,a)\) 依赖动作,会发生什么?

单选题 · mid

  • A.引入估计偏差← 正确答案
  • B.方差一定下降
  • C.期望一定不变
  • D.策略必定收敛

答案:A。基线要求与动作无关,否则 \(\sum_a\nabla\pi(a|s)b(s,a)\neq0\),期望中残留非零项,梯度估计就不再无偏。

Q6. 最优常数基线的表达式是哪一个?

单选题 · hard

  • A.E[w²G] / E[w²]← 正确答案
  • B.E[wG] / E[w]
  • C.E[w²] / E[wG]
  • D.E[wG] / E[w²]

答案:A。令 \(w=\nabla\log\pi\),最优常数基线是回报关于 \(w^2\) 的加权平均 \(b^*=E[w^2G]/E[w^2]\)。它保证方差对基线求导为零。

Q7. REINFORCE with baseline 的参数更新量是什么?

单选题 · hard

  • A.alpha×优势×梯度← 正确答案
  • B.alpha×G×梯度
  • C.alpha×Q×梯度
  • D.alpha×V×梯度

答案:A。更新量必须使用优势 \(A=G-b(s)\),而不是裸的 \(G\)、\(Q\) 或 \(V\)。优势才能让方差更小且期望不变。

Q8. 以下哪些可以作为合法的策略梯度基线?

多选题 · mid

  • A.常数 0.5← 正确答案
  • B.状态值函数← 正确答案
  • C.动作值函数
  • D.只依赖状态的函数← 正确答案

答案:ABD。合法基线必须只依赖状态 \(s\)。常数、状态值函数和任意状态函数都合法;动作值函数依赖动作,不能作为基线。

Q9. 加入状态值函数基线的好处有哪些?

多选题 · mid

  • A.期望保持不变← 正确答案
  • B.方差明显降低← 正确答案
  • C.训练过程更稳定← 正确答案
  • D.必然找到全局最优

答案:ABC。基线在期望层面是零贡献,但能压缩估计方差,让梯度更新稳定。它不能保证找到全局最优,只是让优化更安稳。

Q10. Actor-Critic 中 Critic 的作用包括哪些?

多选题 · hard

  • A.估计价值函数← 正确答案
  • B.提供低方差基线← 正确答案
  • C.计算优势项← 正确答案
  • D.直接生成动作

答案:ABC。Critic 负责估计 \(V(s)\) 或 \(Q(s,a)\),用 TD 误差提供基线并计算优势;生成动作的是 Actor,不是 Critic。二者分工明确才能稳定训练。