跳转至

【LLM 对齐系列】(四):REINFORCE 算法:策略梯度的最简实现

上一篇文章中,我们推导出了策略梯度定理,它告诉我们如何计算目标函数的梯度,从而指导智能体不断进化。我们该如何将这个包含期望的梯度公式,转化为可以一行行写出的代码呢?本文作为 LLM 对齐系列的第四篇,将介绍策略梯度定理的一个算法实现:REINFORCE 算法。

REINFORCE 算法由 Ronald J. Williams 在 1992 年提出,是最简单、最直接的策略梯度算法。它的核心思想可以用一句话概括:通过采样轨迹来估计梯度,然后更新策略。理解 REINFORCE 是理解后续高级算法(如 PPO、GRPO)的基础。

cover

从策略梯度定理到 REINFORCE

让我们回顾上一篇推导出的策略梯度定理:

\[ \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p(\tau; \theta)} \left[ \left( \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) \right) \cdot R(\tau) \right] \]

这个公式告诉我们:目标函数的梯度等于“对数概率梯度乘以回报”的期望值。问题是,我们如何计算这个期望呢?

在数学上,期望的定义涉及对所有可能轨迹的求和。我们无法穷举所有轨迹来精确计算它。REINFORCE 算法的核心贡献,就是将这个理论公式通过蒙特卡洛采样转化为一个可执行的算法。

蒙特卡洛估计

reinforce-monte-carlo

蒙特卡洛方法的核心思想是:用样本均值来近似期望值。如果我们从分布 \(p(\tau; \theta)\) 中采样 \(N\) 条轨迹 \(\{\tau_1, \tau_2, \dots, \tau_N\}\),那么期望可以近似为:

\[ \mathbb{E}_{\tau \sim p(\tau; \theta)}[f(\tau)] \approx \frac{1}{N} \sum_{i=1}^{N} f(\tau_i) \]

将这个思想应用到策略梯度公式中,我们得到:

\[ \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \left[ \left( \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t^{(i)}|s_t^{(i)}) \right) \cdot R(\tau_i) \right] \]

这是“整轨迹总回报”写法。实际实现中,更常用的等价形式是 reward-to-go 写法:

\[ \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N}\sum_{t=0}^{T-1}\nabla_\theta \log \pi_\theta(a_t^{(i)}|s_t^{(i)}) \cdot G_t^{(i)}, \quad G_t^{(i)}=\sum_{k=t}^{T-1}\gamma^{k-t}r_k^{(i)} \]

两种写法在期望上等价;区别在于方差。直觉上,时刻 \(t\) 的动作只会影响未来奖励,因此用 \(G_t\) 可以去掉“过去奖励”带来的无关噪声,通常更稳定。

它的含义很直观:

  • 让智能体与环境交互,采样 \(N\) 条轨迹;
  • 对每条轨迹,计算回报信号(可写成 \(R(\tau_i)\),也可写成逐时刻的 \(G_t^{(i)}\))和对数概率梯度;
  • 将所有轨迹的“梯度 × 回报”取平均,作为真实梯度的估计;
  • 用这个估计值更新参数 \(\theta\)

REINFORCE 算法流程

REINFORCE 算法流程图

为什么用 \(G_t\) 而不是 \(R(\tau)\)

在算法流程中,我们用的是从时刻 \(t\) 开始至轨迹结束的回报 \(G_t\),而不是整条轨迹的总回报 \(R(\tau)\)

直觉上,时刻 \(t\) 的动作 \(a_t\) 只能影响时刻 \(t\) 及之后获得的奖励,无法影响过去。如果我们用整条轨迹的回报 \(R(\tau)\) 来加权,就会把时刻 \(t\) 之前的奖励也认为受到了动作 \(a_t\) 的影响,这些信息对于评价动作 \(a_t\) 是无用的“噪声”。

举个例子:你正在参加一个学期的学习,分为三次测验。你在第一次测验中犯了个错,导致扣了 50 分。但在第二次测验中,你通过认真复习获得了 100 分。在评估第二次测验中使用的学习方法的好坏时,我们应该关注它带来了多少未来的收益(100 分),而不应该让它背负第一次测验的“历史包袱”(-50 分)。使用 \(G_t\) 就是为了实现这种“功过分明”的评估,让每个学习策略只对它能影响的未来负责,从而降低了无关信息带来的噪声。

从分解关系也能看出这一点:\(R(\tau)=\sum_{k=0}^{t-1}\gamma^k r_k+\gamma^t G_t\)。前半项是“过去奖励”,与当前动作 \(a_t\) 无关,对期望梯度不贡献有效信号;保留 \(G_t\) 只会去掉噪声而不改变期望,因此能在无偏前提下降低方差。

LLM 场景下的 REINFORCE

让我们用 LLM 生成文本的例子来具体理解 REINFORCE 是如何工作的。

LLM 场景下 REINFORCE 一次迭代流程图

REINFORCE 的核心问题与关键改进

REINFORCE 算法虽然简单直接,但在实际应用中的核心挑战是高方差;“引入基线”是最关键、最经典的缓解手段。

核心问题:高方差

REINFORCE 使用蒙特卡洛采样来估计梯度,这意味着梯度的估计值会随着采样的轨迹不同而剧烈波动。

想象一下,你是一个学生,想知道自己某种学习方法的“真实效果”。REINFORCE 的做法是:每次用这种方法学习后参加一次测验,根据这次测验的得分来判断学习方法的好坏。问题在于,如果这次测验题目恰好都是你复习过的,你可能得满分;如果考到了没复习的内容,你可能得零分。单次测验的成绩波动很大,很难反映学习方法的真实效果。

在强化学习中,不同轨迹的回报 \(R(\tau)\) 可能相差很大。这种高方差会导致:

  • 训练不稳定:参数更新的方向变化较大,难以收敛;

  • 样本效率低:需要大量采样才能得到可靠的梯度估计;

  • 学习速度慢:这就像在一片嘈杂的声音中寻找一个微弱的信号。有用的梯度信号(真水平)很容易被巨大的采样方差(运气)所淹没。

关键改进:引入基线(Baseline)

原始 REINFORCE 常见形式直接使用 \(G_t\),只利用“绝对回报”信号。更有效的做法是减去一个 baseline,让更新信号变成“高于/低于参考水平多少”。

举个例子:假设在某门课程中,无论怎么学,考试分数都在 90-100 之间。即使你学得很差(得 90 分),回报仍然是一个很大的正数,REINFORCE 会增加这些学习策略的概率。即使你学得很好(得 100 分),增加的幅度也差不多。模型很难区分“还行”和“很好”的学习方法的差别。

理想情况下,我们希望:

  • 如果回报高于平均水平,就增加这些动作的概率

  • 如果回报低于平均水平,就降低这些动作的概率

这就引出了“基线”(Baseline)的概念。更一般的写法是让基线依赖状态:

\[ \nabla_\theta J(\theta) = \mathbb{E}_\tau \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t \mid s_t)\cdot (G_t - b(s_t)) \right] \]

这里的 \((G_t - b(s_t))\) 衡量的是“这个动作结果比状态基线好多少”。只要 baseline 不依赖动作 \(a_t\),梯度估计仍然是无偏的;它的主要作用是降低方差。

改进方向

围绕“高方差”这一核心挑战,后续算法主要沿着以下方向改进:

  • 引入基线降低方差:最常用的基线是状态价值函数 \(V\left(s\right)\),它表示从状态 \(s\) 出发的期望回报。这就引出了 Actor-Critic 架构:Actor(策略网络)负责决策动作,Critic(价值网络)负责评估状态的价值。

  • 限制策略更新幅度:由于高方差,每次更新可能导致策略剧烈变化。TRPO(Trust Region Policy Optimization)和 PPO(Proximal Policy Optimization)通过限制新旧策略之间的差异,提高训练的稳定性。

  • 提高样本效率:REINFORCE 是“同策略”(On-policy)算法,采样的轨迹用完就会被扔掉。能否重复利用历史数据?可以使用“异策略”(Off-policy)学习和重要性采样技术来实现。

总结

REINFORCE 算法插画

本文介绍了 REINFORCE 算法——策略梯度定理的一个简单实现。我们看到,通过蒙特卡洛采样,我们可以将抽象的期望梯度转化为具体的计算步骤:采样轨迹、计算回报、估计梯度、更新参数。

REINFORCE 的优点在于概念简洁、实现直接,不需要知道环境模型。但它的缺陷是高方差,导致训练不稳定、样本效率低。引入基线(以及进一步的 advantage 估计)是最直接的改进方向,后续一系列算法都建立在这条主线上。

REINFORCE 算法名字的由来

很多人认为 REINFORCE 这个名字来自“强化学习”的英文 Reinforcement Learning。实际上,REINFORCE 是一个精心设计的首字母缩写,代表:REward Increment = Nonnegative Factor times Offset Reinforcement times Characteristic Eligibility(奖励增量 = 非负因子 × 偏移强化 × 特征资格)。这个略显繁复的名字来自 Ronald J. Williams 在 1992 年发表的开创性论文。Williams 在论文中特别指出,这类算法本身并不是全新发明,而是对已有方法的系统性总结和命名——它们之前就以不同形式存在,只是没有被统一识别和规范化。

REINFORCE 原始论文截图

评论