设想一位登山者小明,口袋里只有一本“择路心法”:每次遇到岔路口,往左还是往右,全由这本心法按概率决定。第一次试走,他在一处斜坡选择了右路,成功攀上新高度;第二次遇到相似的坡,他选左路,却滑了下来。回到营地复盘时,他在心底默默记下:“右路值得多试,左路要少走。”这里,“择路心法”就是强化学习里的策略,“攀到的高度差”就是回报,而“根据这次表现调整心法”的过程,就是 REINFORCE 算法的全部秘密。它不画地图、不求捷径公式,只靠一次次的真实尝试和事后复盘,让“选路的偏好”逐渐朝着更高的海拔爬升。这篇文章会带你从登山者的视角,一步步理解策略梯度直觉、回报采样、方差与基线,以及它和 Q-Learning 等值函数方法的根本区别。
掌握 REINFORCE 是理解 PPO、Actor-Critic 等现代策略梯度算法(包括大模型 RLHF)的第一块基石,也能帮你在实际工作中快速上手“直接优化策略”类的强化学习任务。
目录
可视化演示
动态演示REINFORCE最简单的策的核心机制,通过架构/数据/状态/性能四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
REINFORCE最简单的策:一策略梯 一、策略梯度定理的推导逻辑 二、REINFORCE的蒙特卡 核心机制可视化 REINFORCE最简单的策整体架构与关键组件
策略梯度直觉:择路心法决定登山风格
小明登山时最重要的不是某一次具体选择,而是那本“择路心法”——在遇到相似地形时,他更倾向于左还是右。强化学习里,这本心法被称作策略,记作 π_θ(a|s)。参数 θ 是心法里的旋钮:调整它,就会改变“在这个状态下选那个动作”的概率。第一次尝试右路爬得高,他就在心里把右路的概率调高一点;左路摔得惨,就把左路的概率调低一点。这就是策略梯度最朴素的直觉:好动作概率上调,坏动作概率下调。
从数学上把这些直觉抽象出来,登山者要解决的其实是一个优化问题:找到一组心法参数 θ,让“平均海拔增幅”最大。这个平均表现被称为目标函数 J(θ)。由于登山路线充满随机性——风向、落石、脚滑都会影响结果——我们只能把所有可能路线的表现做加权平均,权重正是当前策略生成这条路的概率。
所以,REINFORCE 的第一步只是把“想爬得更高”这件事数学化:定义平均海拔代表心法的好坏,之后每一次更新,都是在朝着提高这个平均值的“上坡方向”迈步。
- θ(策略参数)登山者心法里的可调旋钮,改变它就会改变选择岔路的偏好。
- π_θ(a|s)由参数 θ 决定的择路概率——在状态 s 下选择动作 a 的可能性有多大。
- 期望 E对随机路线求平均,相当于想象很多次平行宇宙里的登山尝试,把结果汇总。
- R(τ)一条完整路线 τ 的总回报,即把整段路程里每一步的即时奖励加起来。
策略梯度定理:把复盘变成数学
复盘时小明遇到一个难题:这次攀到高处,究竟是“岔口选右”的功劳,还是“后面那段碎石路”本来就好走?他需要一套规则,把“结果好坏”归因到“当时的选择”上。数学上,这种归因靠的是对数概率梯度:对选中的动作概率取对数,再对参数求梯度,得到一个指示方向——如果想让这次的选择更容易被再次做出,参数该往哪边推。
为什么是“log”而不是直接求概率的梯度?因为直接使用 ∇π 会让期望里多出概率本身,导致采样时权重不均;而 ∇log π = ∇π / π 正好抵消了这个权重,让每个样本的贡献变得干净。这就是策略梯度定理里的对数技巧。它把“复盘”变成了一句可执行的话:用这次选择对参数的敏感度,乘以这次爬升的高度,再取平均,就得到了心法应该调整的方向。
小明终于有了自己的复盘公式:不是简单记“左路好”或“右路差”,而是用“这次爬升带来的总高度”乘以“心法对这次选择的敏感度”,再把多次尝试的结果平均。这个公式就是 REINFORCE 的更新引擎。
- ∇θ(梯度符号)表示“朝哪个方向调整参数能提高目标”。就像指南针,指着上坡的方向。
- G_t(折扣回报)从时刻 t 之后累积的总收益,代表“这次选择后续带来的总回报”。
- ∇log π_θ(a_t|s_t)对数概率梯度,回答“想提高这次选择的概率,参数怎么动”。
- 外层的期望无法穷举所有路线,于是用多次真实尝试的采样平均来近似。
蒙特卡洛采样:用有限次尝试估计期望
期望的精确计算需要枚举这座山的所有可能路径,路径数量随步数指数爆炸,根本做不到。小明的解决办法很朴素:多试几次,把实际看到的海拔增幅记下来,取平均。这就是蒙特卡洛采样——用随机样本的平均值去逼近真实的期望。“试一次完整的山”在强化学习里叫一个回合,回合结束时我们才把累计奖励算清楚。
由于后续奖励距离当前时刻越远越不确定,登山者会给它们打一个折扣。折扣因子 γ 介于 0 和 1 之间,好比“远处的风景对今天的决策影响要弱一些”。于是从时刻 t 开始的折扣回报 G_t 写成:
蒙特卡洛给了小明“用有限次尝试做统计”的能力,但每次尝试都被风向、偶发落石扰动——这就是方差偏大的来源,也顺理成章引出了下一节的基线技巧。
- G_t(折扣回报)站在时刻 t 回头看,后面所有奖励按折扣累加的总值。
- r_{t+k+1}(即时奖励)第 t+k+1 步得到的单步奖励,比如登山时迈出一步后脚下新海拔带来的收益。
- γ^k(折扣系数)γ 的 k 次幂。γ 越接近 1,远期奖励越受重视;γ 越小,越只看眼前。
- 求和区间从下一步一直加到回合结束,一个都不能漏。
基线降方差:不看绝对海拔,看相对进步
雾天里测得海拔 1000 米与 900 米,差距可能只是阵风造成的噪声。小明想到一个更聪明的参照:不比绝对海拔,而比“这次成绩比常规路线平均成绩高出多少”。这个“常规路线的平均成绩”就是基线 b(s)。它只与所在位置有关,与具体选择哪个动作无关。
数学上,从回报里减去基线后,梯度期望并不会变,因为 b(s) 与动作无关,在对动作做加权求和时会被抵消。换句话说,基线只是把“绝对海拔”换成了“相对进步”,不会改变爬坡方向,却能显著压缩样本间的抖动幅度。这就是“只降方差、不伤无偏性”的由来。
小明把“比常规路线高多少”作为修正信号后,天气噪声不再淹没真实进步,心法迭代变得更稳、更快。在下一节的 Python 演示里,我们也会用一个滑动平均基线来直观看到这个效果。
- b(s_t)(基线)只依赖状态的参照值,典型的取值是该状态的平均价值 V(s)。
- G_t − b(s_t)(修正信号)表示“这次尝试比该位置的平均水平好多少”,是真正值得学习的差异。
- 期望不变因为 b(s) 与动作无关,在期望中对动作求和时,多减的部分被自然抵消。
- 方差降低每次样本从围绕大数字波动,变成围绕一个小得多的“相对进步”波动。
算法流程:训练营的日常循环
把前面几块拼起来,REINFORCE 的训练流程就像登山训练营的例行日程:早上带心法上山尝试,傍晚根据成绩调整心法,第二天再试。这个循环简单到可以写进一个 for 循环,但它必须等整座山爬完才能复盘——因为回报 G_t 要等到回合结束才能结算。
完整的算法分为五步:第一步,随机初始化策略参数 θ;第二步,按当前策略采样一个完整回合,记录下每一步的状态、动作和奖励;第三步,计算每一步的折扣回报 G_t;第四步,对回合里每一步用“修正后的回报乘以对数概率梯度”累加出梯度;第五步,用学习率 α 缩放后更新参数,然后回到第二步。更新公式就是 REINFORCE 的核心规则:
训练营日复一日,小明的择路心法从“哪边都行”逐渐变成“斜坡偏右、碎石靠左”,海拔纪录不断被刷新。这就是策略梯度爬坡最直观的画面:每调整一次,心法就沿着上坡方向前进一小步。
- ←(更新符号)把右边的计算结果赋给左边的 θ,相当于“根据今天的复盘改写心法”。
- α(学习率)控制每次调整的幅度,是训练营里“今晚改多少心法”的强度。
- (G_t − b(s_t))(修正回报)决定这次更新的“大小与正负”——比平均好就正向推,比平均差就反向推。
- ∇log π(更新方向)决定往哪个旋钮方向拧,让好的选择更有可能被再次选中。
对比值函数法:制图派 vs 直接派
山脚下还住着另一派登山者——制图派。他们不直接改心法,而是先画一张“高程地图”:每个岔路口标上“从这里出发的预期海拔”,也就是价值。选路时,挑地图上数字最大的岔口走。这张地图在强化学习里就是值函数,最经典的制图派算法是 Q-Learning。
Q-Learning 的更新式把“下一步的期望”记录在单元格里,决策时对动作取最大值:
REINFORCE 属于“直接派”:不画地图、不取 max,用试走和梯度直接调策略。它天然支持连续动作,也天然具备随机探索能力;代价是样本效率低、方差大。制图派适合小清单式岔路,直接派适合广阔荒野——理解这一点,就理解了 REINFORCE 在强化学习家族中的独特位置。
- Q(s,a)(动作价值)地图上“从状态 s 做动作 a 之后的预期海拔”。
- r + γ max Q(时序差分目标)当前这一步奖励,加上下一步能拿到的最大预期价值。
- −Q(s,a)(时序差分误差)新信息和旧地图的差距,用来修正地图。
- max 的代价要枚举所有可能的 a′,所以在连续动作空间里不可行。
改进方向:从独自复盘到团队协作
小明后来发现,只靠“整座山爬完的总高度”来复盘,噪音还是太大:一个回合有一百步,某一步的贡献早被其余九十九步淹没了。于是他请来一位老队友——评论家。队友在每个岔路口低声告诉他:“这个位置,这条路的平均海拔大概是多高。”这个提示就是状态价值 V(s)。比起冷冰冰的基线 b(s),它更精细、更动态。
把“动作价值”和“状态价值”的差称为优势函数:
再往前走,GAE(广义优势估计)在时间维度上累积优势,兼顾蒙特卡洛的无偏与时序差分的高效;PPO 则对更新幅度施加约束,防止一次雨崩式的调整毁掉整本心法。可以说,策略梯度家族的进阶路线,就是从一个独自爬山的 REINFORCE,逐步进化成有队友、有护具、有稳步行进节奏的现代团队登山。
- Q(s,a)(动作价值)在状态 s 下选择动作 a 并继续到回合结束的期望回报。
- V(s)(状态价值)在状态 s 下按当前策略行动的平均期望回报——老队友给出的“常规海拔”。
- A(s,a)(优势)两者相减,得到“这个动作比平均水平好多少”的净增量。
- 与 REINFORCE 的衔接用优势代替 (G − b) 就是 Actor-Critic 的基本思想,评论家提供动态基线,演员据此更新策略。
AI 应用场景
大语言模型的 RLHF 策略微调
阶段:策略优化 / 强化学习微调
解决的问题:文本生成是离散的、不可导的过程,传统交叉熵只是模仿已有答案,无法直接优化“用户偏好”这类非结构化指标。奖励模型给出一段回复的整体打分后,REINFORCE 式的策略梯度恰好能把“分数高低”转化为生成策略参数的更新信号。
具体案例:把“生成一句回复”看作一个完整回合,奖励模型给这句话打 0.8 分;生成这句话时每个 token 的选择概率取对数求梯度,乘以 (0.8 − 基线) 后更新语言模型参数。高分的回复模式被强化,低分的回复模式被抑制,模型逐渐学会说更讨人喜欢的话。
机器人运动控制中的连续动作学习
阶段:模型训练 / 策略优化
解决的问题:四足机器人的关节扭矩是连续值,Q-Learning 需要对动作取最大值,连续空间里根本无法枚举。REINFORCE 直接把策略建模成高斯分布,输出“当前应该给关节多大扭矩”的均值和方差,天然匹配连续动作。
具体案例:机器人爬上碎石坡,一个回合是从坡底到坡顶的整段运动。每次尝试结束后,根据“是否比上一次更接近坡顶”调整扭矩策略分布的均值。经过几百个回合,机器人从最初的僵硬跌倒,渐渐学会了协调四肢。
广告竞价出价策略优化
阶段:在线决策 / 策略优化
解决的问题:广告竞价环境动态多变、转化回报有延迟,手工规则难以覆盖不断变化的流量特征。把一次广告投放时段看作回合,竞价成功与否和最终转化收益合成为回合回报,REINFORCE 直接学习“出价系数”策略。
具体案例:广告系统每轮拍卖时,策略根据当前流量特征输出一个出价倍率;一个时段结束后统计成交率与 ROI,作为总回报反馈。策略梯度会让高出价、高转化的流量特征下出价概率上升,低效流量下出价概率下降,最终自动收敛到更优的出价风格。
Python 演示
import numpy as np np.random.seed(42) T = 5 # 每个回合做5次选择LR = 0.08 # 策略参数学习率w = np.array([0.0, 0.0]) # 两个动作的logits参数baseline = 0.0 def action_probs(): # 把两个动作的logits变成概率分布 logits = w - w.max() e = np.exp(logits) return e / e.sum() def grad_log_pi(a): # 对选中动作的log概率求梯度 p = action_probs() g = np.zeros(2) g[a] = 1 - p[a] g[1 - a] = -p[1 - a] return g for episode in range(3000): acts = [] # 采样一个完整回合 for t in range(T): p = action_probs() a = np.random.choice(2, p=p) acts.append(a) # 回合回报: 动作1每次+1, 动作0每次-1 G = float(np.sum(acts) - (T - np.sum(acts))) # REINFORCE: 用整回合回报缩放累积梯度 grad = sum(grad_log_pi(a) for a in acts) w += LR * (G - baseline) * grad # 滑动平均基线: 降低方差且保持无偏 baseline = 0.9 * baseline + 0.1 * G if episode % 500 == 0: print('episode', episode, 'right_prob', action_probs()[1], 'G', G)
w = np.array([0.0, 0.0])心法参数,两个动作的初始热度相同,代表“左右无所谓”。def action_probs():把热度(logits)变成真正的选路概率,用 softmax 做归一化。p = action_probs()每一步都按照当前心法随机采样动作,保证探索。G = float(np.sum(acts) - (T - np.sum(acts)))回合总回报:向右每步加 1 分,向左每步扣 1 分。grad = sum(grad_log_pi(a) for a in acts)把回合内每个选择的对数概率梯度累加,作为本次更新的方向。w += LR * (G - baseline) * gradREINFORCE 更新式:修正回报乘梯度,再按学习率更新心法。baseline = 0.9 * baseline + 0.1 * G维护一个滑动平均“常规成绩”,让每次信号围绕相对进步波动。
常见误区
误区我觉得强化学习里的“梯度”就是像神经网络那样从环境误差反向传播回来的,所以环境必须可微,否则没法训练。
正解REINFORCE 的梯度完全来自策略网络自身:对采样动作的 log 概率求参数梯度,再乘上回合回报。环境只需要返回一个奖励数值,不需要可微。就像登山者不需要知道山体函数的导数公式,只要爬上去、量一量海拔,就能复盘调整。
为何常见:监督学习中“反向传播”太深入人心,初学者容易混淆“梯度从模型来”还是“梯度从环境来”。
误区给回报 G 减去一个基线 b(s),梯度里少了一块正数,更新出来的策略肯定偏向错误方向,偏差很大。
正解基线只与状态有关、与动作无关,在期望意义下会被自然抵消,因此梯度期望完全不变,依然无偏。它只是让单次样本的波动变小。就像把测量基准从海平面换到营地,谁爬得更高这个相对结论不会改变。
为何常见:直觉上觉得“少了一个正数后乘法结果变小”,却没区分单个样本和期望之间的差别。
误区既然每个回合回报都是正数,所有动作的梯度都是正的,那所有动作都会被鼓励,大家共同进步,应该没问题吧?
正解全正回报会让所有动作的概率被同时推高,softmax 归一化后它们之间的相对差距不断被稀释,收敛极慢甚至停滞。基线的作用正是去掉那个公共抬升,让训练专注于“哪些动作比平均好”,而不是被整体正偏移带着走。
为何常见:只看到“某动作概率在上升”,忽略了 softmax 层里所有动作概率的相对竞争关系。
误区REINFORCE 和 Q-Learning 都是强化学习,都在学一张“动作好坏表”,然后从表里挑动作。
正解REINFORCE 直接参数化策略,输出的是“选动作的概率”,根本不维护 Q 表;Q-Learning 先学 Q(s,a) 再取 argmax 决定动作。REINFORCE 适合连续或超大动作空间,Q-Learning 适合小离散动作空间,二者路线完全不同。
为何常见:两者都涉及“回报/价值”概念,初学者容易把“策略”和“价值函数”混为一谈,忽略了“直接派”和“制图派”的本质区别。
面试题
Q1. 在 REINFORCE 中,对动作概率取对数再求梯度的核心作用是?
- A.对回报的值取对数
- B.从概率链式法则得到采样梯度← 正确答案
- C.熵正则化的约束项
- D.方差归一化的技巧
答案:B。策略梯度定理推导时用到 ∇π/π = ∇logπ,由此把“对概率的梯度”改写成“对对数概率的梯度”,才得到只需要采样动作就能估计的梯度形式。A 错在回报并不取对数;C、D 是无关的常见技巧。
Q2. REINFORCE 估算一个策略的期望回报主要采用哪种方式?
- A.蒙特卡洛回合采样← 正确答案
- B.时序差分递推估计
- C.动态规划回溯求解
- D.高斯过程函数近似
答案:A。REINFORCE 必须走完整个回合,用折扣回报 G 作为期望的无偏估计,这正是蒙特卡洛思想。时序差分用自举估计未来价值,动态规划需要环境模型,高斯过程则与策略梯度无关。
Q3. 与 Q-Learning 相比,REINFORCE 最大的特点是?
- A.直接优化策略本身← 正确答案
- B.依赖状态动作价值
- C.需要精确环境模型
- D.在线单步逐步更新
答案:A。REINFORCE 对策略参数求梯度,直接调整“择路心法”,不维护 Q 表。Q-Learning 才依赖价值函数;两者都不需要环境模型;REINFORCE 必须等完整回合结束才能更新。
Q4. 给 REINFORCE 的回报减去一个与动作无关的基线 b(s),以下说法正确的是?
- A.保持无偏并降低方差← 正确答案
- B.增加偏差并降低方差
- C.降低无偏并提升方差
- D.改变最优策略方向
答案:A。基线只与状态有关,在期望中对动作求和时被抵消,梯度的无偏性保留;同时它让样本围绕更小的“相对进步”波动,方差下降。它不会改变最优策略,只是让更新信号更聚焦。
Q5. 如果回合回报 G 恒为正,但代码里忘了加基线,通常会出现什么现象?
- A.无偏但收敛变缓慢← 正确答案
- B.完全无法收敛结果
- C.偏向提升所有动作
- D.导致方差自动消失
答案:A。全正回报会让所有动作都被正向推动,softmax 归一化后相对差异被稀释,梯度仍无偏但收敛很慢。B 说得太绝对;C 是现象的描述而非最终结果;D 方差不会自动消失。
Q6. REINFORCE 方差偏大的主要来源是?
- A.单步回报值很精确
- B.蒙特卡洛回报方差过大← 正确答案
- C.梯度方向恒定不变
- D.策略完全确定化
答案:B。REINFORCE 用整回合的折扣回报 G 估计梯度,而 G 是大量随机步奖励的累加,波动大。这就像雾天测海拔,单次读数充满噪声。单步精确、梯度恒定或策略确定化都与“方差大”不构成因果关系。
Q7. 如果把 REINFORCE 中的基线改成与动作有关的函数 b(s,a),会发生什么?
- A.梯度期望改变从而有偏← 正确答案
- B.方差一定降为零
- C.必然加速收敛进程
- D.梯度期望保持无偏不变
答案:A。基线必须与动作无关,才能在期望中被抵消。一旦 b 依赖动作,期望里多出的项不再为零,梯度估计就有偏,最优策略方向可能被扭曲。B、C 都过于绝对,D 与数学推导相悖。
Q8. 下列哪些属于 REINFORCE 的经典改进方向?
- A.引入 Actor-Critic 结构← 正确答案
- B.采用广义优势估计← 正确答案
- C.加入价值函数基线← 正确答案
- D.彻底放弃策略网络
答案:ABC。Actor-Critic 用评论家提供动态基线,GAE 在时间维度累积优势降低方差,价值基线则是 REINFORCE 最直接的方差削减手段。D 放弃策略网络就不再是策略梯度方法。
Q9. 关于 REINFORCE 的梯度估计,下列说法正确的有哪些?
- A.梯度估计是无偏的← 正确答案
- B.样本方差会比较大← 正确答案
- C.必须采样完整回合← 正确答案
- D.完全依赖环境模型
答案:ABC。REINFORCE 用蒙特卡洛回报近似期望,样本均值收敛到真值所以无偏;但整回合回报波动大,方差高;它必须等回合结束才能结算 G。整个过程只需要环境给出奖励,不需要模型,所以 D 错误。
Q10. 关于基线 b(s),下列说法正确的是?
- A.任意与动作无关函数均可← 正确答案
- B.最优基线接近期望回报← 正确答案
- C.基线会引入明显偏差
- D.基线能有效降低方差← 正确答案
答案:ABD。只要 b(s) 与动作无关,期望中就会被抵消,因此原则上任意与动作无关的函数都可以;实践中常取状态价值 V(s) 作为近似最优基线,它接近该状态期望回报,能最大程度压低方差。C 与无偏性推导相反,是错误的。