想象你要在颠簸的船上测量远处海岛的高度。如果你直接从船甲板往上量,船一浪一浪地晃,读数忽高忽低,你很难判断海岛到底多高。聪明的做法是先找一个稳定的“海平面”作为基准,再从海平面量起。策略梯度训练也面临同样的风浪:每次用一整条轨迹的回报去估计梯度,噪声极大,训练像在暴风雨里测高度。本文要讲的“基线”,就是强化学习里的海平面,它不会改变你的测量目标,却能大幅减少波浪带来的抖动,让策略梯度这只“小船”更快更稳地驶向收敛。
学会基线降方差,你才能把 REINFORCE、Actor-Critic 从“能跑”变成“跑得稳、收敛快”,这是策略梯度算法实用化的关键一步,也是面试和工程优化中的高频考点。
可视化演示
动态演示用基线降低策略梯度方差的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
用基线降低策略梯度方差:策略梯度 策略梯度高方差问题的根源 基线不改变梯度期望的数学证明 核心机制可视化 用基线降低策略梯度方差整体架构与关键组件
方差问题根源
想象你站在船甲板上测量海岛高度。每一次浪潮打过来,甲板都会上下起伏,你报出的数字可能相差几十米。策略梯度的原始估计也是如此:它用一整条完整轨迹的回报 \(G_i\) 当作打分器,而一条轨迹里有大量随机性——开局方式、动作选择、环境噪声全都会叠加进这个数字里。
原始策略梯度的蒙特卡洛估计可以写成:
船晃得越厉害,测量就越不准。高方差会让梯度方向忽左忽右,策略参数像醉汉走路,训练自然又慢又不稳定。
- 策略梯度目标我们要优化策略参数 \(\theta\),使期望回报最大,梯度方向由“对数策略 × 回报”构成。
- 蒙特卡洛近似真实期望无法精确计算,于是用 \(N\) 条轨迹的回报平均值来估计。
- 方差爆炸点每条轨迹的 \(G_i\) 彼此差异巨大,平均后仍带有明显噪声。
基线思想原理
聪明的测量员不会从晃动的甲板量起,而是先找一个稳定的水平面,再从水平面量到海岛。这个水平面就是“基线”。在策略梯度里,基线是一个只依赖状态 \(s\)、不依赖动作 \(a\) 的函数 \(b(s)\)。它像是给每个状态设定了一个本地零刻度,让梯度只关注“这次选择比平常好多少”。
加入基线后的梯度估计变为:
从甲板量改成从海平面量,海岛的真实高度并没有变,但读数稳定多了。同理,减去基线不会改变策略梯度的期望,却能让每一步更新更“靠谱”。
- 构造新读数每个样本的回报 \(G_i\) 都减去同一个状态下的基线 \(b(s_i)\)。
- 基线不取动作\(b(s_i)\) 只随状态变化,和当前选择了哪个动作无关。
- 新估计量把“回报”替换成“优势”,再用它加权对数策略梯度。
期望不变性
为什么基线没有改变测量目标?关键在概率论的一个小魔法:策略的各个动作概率加起来必须等于 1,而“加起来等于 1”的式子求导之后恰好是 0。这就像一整块蛋糕分成很多份,无论怎么分,总和始终是一整个;如果把分法扰动一下,总和的变化率也是 0。
严格写成公式:
这个恒等式告诉我们:任何与动作无关的项,乘到 \(\nabla_\theta\log\pi_\theta\) 上再求期望都是零。所以 \(b(s)\) 可以放心地加进去、减出来,它只会影响方差,不会污染期望。
- 对数梯度恒等式对数策略的梯度等于策略梯度除以策略本身。
- 按期望展开把期望写成所有动作的加权求和,\(\pi_\theta(a|s)\) 刚好约掉分母。
- 概率归一化求导\(\sum_a\pi_\theta(a|s)=1\) 是常数,对 \(\theta\) 求导必然为 0。
状态值函数基线
海平面不是随便一画,最好选一个能代表“平常水位”的位置。在强化学习中,最自然的“平常水位”就是状态值函数 \(V^\pi(s)\):从状态 \(s\) 出发,按当前策略继续走下去,平均能拿多少回报。它正是回报 \(G_t\) 的条件均值。
实际中我们不知道真实的 \(V^\pi\),但可以用一个神经网络或线性模型去近似它。近似得越好,这个“海平面”就越平稳,梯度估计的波动就越小。
- 状态值定义从状态 \(s\) 出发,以后所有折扣回报总和的期望。
- 条件均值视角它是在“当前处于状态 \(s\)”这个条件下对回报取平均。
- 作为中心趋势既然 \(G_t\) 围绕 \(V^\pi(s)\) 上下波动,用 \(V^\pi(s)\) 做零点,波动自然被“中心化”。
方差下降机理
为什么减去一个均值就能减少方差?想象你每次投飞镖,十次落点散布在一个大圆里;如果你先画一个中心点,再测量“偏离中心点有多远”,这些距离数字会比原始坐标更集中。关键原因是:回报 \(G\) 和基线 \(b\) 如果高度正相关,减法会抵消掉共同的随机起伏。
方差展开式揭示了这一点:
用值函数当地平线,相当于把“绝对回报”换成“超出预期的部分”。那些与状态本身相关的随机波动被提前扣除,留给梯度的只剩真正的决策信号。
- 方差展开两个随机变量相减的方差由各自方差和两倍协方差决定。
- 正相关才能降方差只有 \(\mathrm{Cov}(Q,b)>0\) 时,最后一项才真正“减掉”部分方差。
- V(s)是最佳近似\(V^\pi(s)\) 是 \(Q(s,a)\) 对动作求平均的结果,天然和 \(Q\) 正相关,所以效果最好。
REINFORCE实战
在 REINFORCE 算法中,我们要跑完一整条轨迹,拿到每一步的折扣回报 \(G_t\),然后让策略参数沿着“优势越大、动作概率越大”的方向更新。这里的优势 \(A_t=G_t-b(s_t)\) 就像是修正后的高度差。
更新公式写成:
实践中,基线的参数可以同步用最小二乘更新去逼近 \(V(s)\)。这一步相当于不断校准海平面,让测量基准一直贴合当前状态,训练稳定性会肉眼可见地提升。
- 折扣回报每一步的回报是当前奖励加上未来奖励的折扣和。
- 优势项回报减去状态值基线,得出“这次动作比平均好多少”。
- 梯度上升更新参数沿着优势加权的对数策略梯度方向走一步,步长为 \(\alpha\)。
Actor-Critic扩展
REINFORCE 要等整条轨迹结束才能更新,像一个每次都要等船靠岸才测量的人。Actor-Critic 则让“Critic”在航行途中就实时估计海平面,用一步之间的差值——也就是 TD 误差——来充当优势。这样不用等全部轨迹,方差进一步被压缩。
TD 误差定义为:
Actor 把 \(A_t=\delta_t\) 当成自己梯度更新的优势,Critic 则负责不断修正海平面。两个人配合,一个管“动作方向”,一个管“基准高度”,这就是现代强化学习中 Actor-Critic 家族的底层心脏。
---
- 单步预测差用下一个状态的价值加上当前奖励,和当前状态的价值做差。
- 减去当前估计这个差值衡量了“看到新状态后,对回报估计的修正量”。
- Critic 拟合\(w\) 沿着 \(\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 演示
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)
probs = softmax_pair(np.dot(theta, f))把线性得分转成两个动作的概率分布,相当于给“选动作”做决策。G = r + 0.9 * G从轨迹末尾倒着累加折扣回报,得到每一步的真实收益。advantage = G - np.dot(w, f)用当前价值网络当基线,算出“这次比平均好多少”。grad = f * (a - probs[1])对数策略梯度的简洁写法,动作越偏离当前概率,梯度信号越强。theta += lr_p * advantage * grad策略参数沿优势方向做梯度上升。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)\) 要满足什么条件才能保证策略梯度期望不变?
- A.与动作无关← 正确答案
- B.与状态无关
- C.与回报无关
- D.必须等于 Q
答案:A。只要 \(b(s)\) 不依赖当前动作,\(\sum_a\nabla\pi_\theta(a|s)b(s)=0\) 就成立,期望不变。依赖动作的基线会破坏这个恒等式,从而引入偏差。
Q2. 原始策略梯度方差大的直接后果是什么?
- A.梯度估计噪声很大← 正确答案
- B.梯度一定等于零
- C.回报必然变成负值
- D.策略必然原地不动
答案:A。每条轨迹的回报随机性很大,导致用蒙特卡洛算出的梯度方向忽东忽西。这不是梯度为零,而是梯度“抖动”,会让训练不稳定。
Q3. 用状态值函数做基线时,优势项通常写成什么?
- 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)\) 能有效降低梯度估计方差?
- A.与回报 G 正相关← 正确答案
- B.与回报 G 负相关
- C.与动作高度相关
- D.与状态完全无关
答案:A。\(V(s)\) 是 \(G\) 的条件均值,两者正相关,方差公式里的负数协方差项能抵消一部分公共波动,所以方差下降。
Q5. 如果基线 \(b(s,a)\) 依赖动作,会发生什么?
- A.引入估计偏差← 正确答案
- B.方差一定下降
- C.期望一定不变
- D.策略必定收敛
答案:A。基线要求与动作无关,否则 \(\sum_a\nabla\pi(a|s)b(s,a)\neq0\),期望中残留非零项,梯度估计就不再无偏。
Q6. 最优常数基线的表达式是哪一个?
- 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 的参数更新量是什么?
- A.alpha×优势×梯度← 正确答案
- B.alpha×G×梯度
- C.alpha×Q×梯度
- D.alpha×V×梯度
答案:A。更新量必须使用优势 \(A=G-b(s)\),而不是裸的 \(G\)、\(Q\) 或 \(V\)。优势才能让方差更小且期望不变。
Q8. 以下哪些可以作为合法的策略梯度基线?
- A.常数 0.5← 正确答案
- B.状态值函数← 正确答案
- C.动作值函数
- D.只依赖状态的函数← 正确答案
答案:ABD。合法基线必须只依赖状态 \(s\)。常数、状态值函数和任意状态函数都合法;动作值函数依赖动作,不能作为基线。
Q9. 加入状态值函数基线的好处有哪些?
- A.期望保持不变← 正确答案
- B.方差明显降低← 正确答案
- C.训练过程更稳定← 正确答案
- D.必然找到全局最优
答案:ABC。基线在期望层面是零贡献,但能压缩估计方差,让梯度更新稳定。它不能保证找到全局最优,只是让优化更安稳。
Q10. Actor-Critic 中 Critic 的作用包括哪些?
- A.估计价值函数← 正确答案
- B.提供低方差基线← 正确答案
- C.计算优势项← 正确答案
- D.直接生成动作
答案:ABC。Critic 负责估计 \(V(s)\) 或 \(Q(s,a)\),用 TD 误差提供基线并计算优势;生成动作的是 Actor,不是 Critic。二者分工明确才能稳定训练。