第15回 策略梯度——REINFORCE 与基线
剑不问招先问心,心若有向步自勤。
不学一招定乾坤,且学顺势改其身。
上回我们走的是“估值派”:DQN 先估 ,再挑前途最高的动作。
可江湖里还有一大门派,路子完全相反——
不先估值,先学出招。
这一回讲“策略梯度”,尤其是最朴素的一式:REINFORCE。
它的目标也不绕弯:
让我做出更可能拿高分的动作。
但它又有一个出了名的毛病:更新抖、方差大。
于是江湖又送它一件“压惊法宝”:基线(baseline)。
本回就把这两样讲透:
REINFORCE 的骨法是什么,基线为什么能稳住它。
一、什么叫“直接学策略”:把“怎么选”写成参数
在第13回我们说策略是 :在局面 下选动作 的概率。
策略梯度的核心就是:
- 用参数 表示一份策略
- 跑几局,拿到回报
- 把 往“回报更大”的方向推一点
你可以把它当作:
不是写一张“价值表”,而是直接改“出招概率”。
这在语言模型身上会更直观:
语言模型本来就输出“下一个 token 的概率分布”,天然就是一份策略。
二、REINFORCE 的一句心法:好结果就加强当时的选择
REINFORCE 可以用一句江湖话概括:
这回赚了钱,就把当时做的选择变得更可能;
这回亏了钱,就把当时做的选择变得更不可能。
它听起来像“凭感觉”,但背后有严格的概率论技巧(对数导数技巧)。
本书不做证明,你只需记住更新形状:
- 是这一次(或从此刻起)的回报
- 是“把我刚才选的这个动作变得更可能”的方向
如果 大,推得就大;如果 小甚至为负,就推回去。
这就是 REINFORCE 名字的意思:用回报去“强化”当时的出招。
REINFORCE 的经典来源是 1992 年的工作。1
三、它为什么抖:回报像骰子,梯度也跟着摇
REINFORCE 的难处在于:
回报 常常是随机的、噪声很大。
你可能做了同样的动作:
- 这回运气好,拿了高分
- 下回运气差,拿了低分
于是更新方向会“忽左忽右”,训练就像醉汉走路。
这件事在大模型对齐里也常出现:
同一句回答,不同标注者偏好不同;
同一套规则奖励,不同题型难度差异大;
噪声一大,策略就容易被带偏。
所以要引入基线:不是改变方向,而是减少摇摆。
四、基线(Baseline):扣掉“该有的平均数”,只学那一点“超常发挥”
基线最经典的形式是把 换成 :
这里 可以是一个常数,也可以依赖状态 。
你把它理解为“把成绩换成超额收益”:
- 平均水平 之上:超额为正,强化这次选择
- 平均水平 之下:超额为负,削弱这次选择
最关键的性质是:
只要基线不依赖动作 ,它不改变期望方向,却能降低方差。
所以基线像是“压惊符”:
不改你要去的方向,只让你走得更稳。
当 取成 (状态价值)时, 就变成了优势(advantage)。
这就是后来 Actor‑Critic、PPO(第16回)的桥梁:
一个人负责出招(actor),一个人负责评估平均水平(critic)。
五、极简代码:两臂老虎机上的 REINFORCE(带基线,可跑)
我们用最小世界练手:两臂老虎机。
- 臂0:中奖概率 0.2
- 臂1:中奖概率 0.8
策略用一个参数 表示:
更新用 REINFORCE,并用移动平均当基线。
import math
import random
def sigmoid(x):
return 1.0 / (1.0 + math.exp(-x))
def sample_action(p1, rnd):
return 1 if rnd.random() < p1 else 0
def reward(a, rnd):
p = 0.8 if a == 1 else 0.2
return 1.0 if rnd.random() < p else 0.0
def grad_logp(theta, a):
p1 = sigmoid(theta)
if a == 1:
return 1.0 - p1
return -p1
if __name__ == "__main__":
rnd = random.Random(0)
theta = 0.0
lr = 0.05
baseline = 0.0
beta = 0.9
for t in range(1, 2001):
p1 = sigmoid(theta)
a = sample_action(p1, rnd)
r = reward(a, rnd)
baseline = beta * baseline + (1.0 - beta) * r
adv = r - baseline
theta = theta + lr * adv * grad_logp(theta, a)
if t % 200 == 0:
print("step", t, "p(a=1)", round(sigmoid(theta), 3), "baseline", round(baseline, 3))
你会看到 逐渐逼近 1:
也就是越来越偏向中奖概率 0.8 的那台机器。
这段代码的重点不在“性能”,而在于你能亲手摸到两件事:
- REINFORCE 的更新只依赖“这次拿了多少分”
- 基线把分数改成“超额”,让更新更稳
六、把基线放进 2024–2026 的语境:偏好学习也需要“稳住”
当奖励来自人类偏好或偏好模型时,噪声往往更大:
同样的回答,有时只是表述风格不同,就能让偏好翻转。
所以 2024 的偏好强化学习研究会反复讨论“如何用更少反馈、更稳地学到偏好”。
例如有工作讨论用“对齐经验估计”提高偏好强化学习的反馈效率,本质上也是在让训练信号更可靠、更省。2
你此刻不必掌握它的细节,只要记住一条连续的主线:
从 REINFORCE 的基线,到 Actor‑Critic 的价值估计,再到 PPO 的稳定更新,都是在解决同一个问题:让‘用奖励改策略’这件事别抖。
七、小结:本回学会“直接改出招”,下回学“稳健改出招”
本回你要把三句话记牢:
- 策略梯度直接学 :不先估 ,先改出招概率
- REINFORCE 用回报强化选择:
- 基线不改方向但降方差:用 学“超额收益”,更新更稳
下一回(第16回)PPO 要登场:
它仍是“改策略”,但会用一套更稳的约束,让你在大规模训练里不至于一步走偏、满盘皆输。
欲知后事如何,且听下回分解。
幻觉核查
- REINFORCE 经典来源核对:Williams 1992 的论文题名与出版信息可在 Springer 页面核验。1
- 偏好强化学习条目核对:arXiv:2405.18688 可核验标题、作者与提交时间。2
- 本回关于“基线不依赖动作则不改变期望方向”的表述为强化学习标准结论,本书不在此回展开证明,只给直觉与使用方式。
逻辑审计
- 与第14回对齐:第14回“先估值再选”,本回切换到“先学策略再出招”,形成两派对照。
- 与第16回衔接:本回引入基线与优势,正是 Actor‑Critic/PPO 的核心语言。
- 难度控制:公式只保留最必要的形状,并用“超额收益”解释基线,不引入超纲证明。
引用与溯源
Footnotes
-
Williams, R. J. Simple statistical gradient-following algorithms for connectionist reinforcement learning Machine Learning 8, 229–256 (1992) https://link.springer.com/article/10.1007/BF00992696 ↩ ↩2
-
Bai, F., et al. Efficient Preference-based Reinforcement Learning via Aligned Experience Estimation arXiv:2405.18688(2024-05)https://arxiv.org/abs/2405.18688 ↩ ↩2