跳转至

十三:强化学习:策略梯度、REINFORCE 与 Actor-Critic

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247483978&idx=1&sn=24f8cc4b25243bc33bcec1ea0c61c258&chksm=f01eb133c7693825308b453eda1dfdc7bce0c14162c0375e3d7d86a61ad8212f8e48d953e7b2#rd

1. 学习定位

前几天主要学习值函数方法:Sarsa、Q-learning、DQN。它们的核心是先学习 Q(s,a),再通过 argmax 选择动作。策略梯度方法则直接优化策略参数:

pi_theta(a|s)
策略梯度是理解 PPO、RLHF-PPO、GRPO 的前置知识。大模型 RLHF 中,语言模型本身就是一个随机策略:给定上下文,输出下一个 token 的概率分布。因此策略梯度与 NLP 场景关系非常直接。 本日知识链路:

policy-based methods
-> objective J(theta)
-> trajectory probability
-> log-derivative trick
-> policy gradient theorem
-> REINFORCE
-> baseline and advantage
-> Actor-Critic
-> TD critic / GAE
-> entropy regularization
-> TRPO trust region

2. 值函数方法与策略方法

值函数方法:

learn Q(s,a)
act by argmax_a Q(s,a)
策略方法:

learn pi_theta(a|s) directly
sample or choose action from pi_theta

代表算法:REINFORCE、A2C、PPO、DDPG (混合)
策略方法的优势: - 可以自然表示随机策略。

  • 适合连续动作空间。

  • 对高维动作分布更直接。

  • 与可微神经网络输出概率分布天然匹配。

局限: - 梯度估计方差高。

  • 样本效率通常较低。

  • 训练稳定性依赖 baseline、advantage、trust region 等技术。

3. 随机策略参数化

离散动作策略通常用 softmax:

pi_theta(a|s) = softmax(f_theta(s))[a]

img

连续动作策略常用高斯分布:

a ~ N(mu_theta(s), sigma_theta(s)^2)

img

在 LLM 中,策略是词表分布:

pi_theta(token_t | prompt, token_<t)

img

轨迹概率由每步策略概率和环境转移共同决定:

P_theta(tau)
= rho_0(s_0) product_t pi_theta(a_t|s_t) P(s_{t+1}|s_t,a_t)

img

环境转移不依赖 theta,策略梯度主要作用在 pi_theta 上。

4. 策略目标函数

策略优化目标通常写成期望回报:

J(theta) = E_{tau ~ pi_theta}[G_0]

img

也可以写成:

J(theta) = E_{s ~ d^pi, a ~ pi_theta}[Q^pi(s,a)]

img

其中 d^pi 是策略诱导的状态访问分布。策略梯度的目标是计算或估计:

grad_theta J(theta)
然后用梯度上升提升期望回报:

theta <- theta + alpha grad_theta J(theta)

img

深度学习框架通常默认做梯度下降,因此实际代码里会最小化负目标。

5. Log-derivative Trick

策略梯度推导的关键是 log-derivative trick:

grad_theta p_theta(x)
= p_theta(x) grad_theta log p_theta(x)

img

把对概率的梯度,变成 “概率 × 对数概率的梯度” 于是:

grad_theta E_{x ~ p_theta}[f(x)]
= E_{x ~ p_theta}[f(x) grad_theta log p_theta(x)]

img

  • 原来没法求导的期望梯度

  • 现在变成了可以采样估算的表达式!

对轨迹分布使用这个技巧:

grad_theta J(theta)
= E_tau [G_0 grad_theta log P_theta(tau)]

img

由于环境转移不依赖策略参数:

log P_theta(tau)
= const + sum_t log pi_theta(a_t|s_t)
得到:

grad_theta J(theta)
= E_tau [G_0 sum_t grad_theta log pi_theta(a_t|s_t)]

img

用整条轨迹的总收益(G_0),去缩放整条轨迹所有动作的梯度。 - G_0>0(整局赚了正奖励):权重为正 → 顺着梯度更新,

放大所有动作概率,鼓励复现本轨迹的全部行为; - G_0<0(整局亏损、负奖励):权重为负 → 梯度反向,

压低轨迹里所有动作概率,避免再踩同样操作。 这就是 REINFORCE 的基础。

6. Policy Gradient Theorem

更常用的策略梯度形式是:

grad_theta J(theta)
∝ E_{s ~ d^pi, a ~ pi_theta}
&nbsp; [grad_theta log pi_theta(a|s) Q^pi(s,a)]

img

直觉:

如果某动作的长期价值 Q 高,就增加它的 log probability。
如果某动作的长期价值低,就降低它的 log probability。
策略梯度不需要对环境转移概率求导,因此可以用于未知环境,只需要采样轨迹。

7. REINFORCE 算法

REINFORCE 是最基础的 Monte Carlo policy gradient 方法。 更新方向:

grad_theta log pi_theta(A_t|S_t) * G_t

img

算法流程:

for each episode:
&nbsp; generate trajectory using pi_theta
&nbsp; compute return G_t for each timestep
&nbsp; update theta by:
&nbsp; &nbsp; theta &lt;- theta + alpha * sum_t grad log pi_theta(A_t|S_t) * G_t
在损失函数形式中:

loss = - sum_t log pi_theta(A_t|S_t) * G_t

img

最小化这个 loss 等价于最大化期望回报。

8. Baseline

REINFORCE 方差高。可以减去一个不依赖动作的 baseline:

grad J = E[grad log pi(a|s) * (G_t - b(s))]

img

常用 baseline 是状态价值函数:

b(s) = V^pi(s)

img

减 baseline 不改变梯度期望,但可以显著降低方差。原因是:

E_{a ~ pi}[grad log pi(a|s) b(s)] = 0

img

减去 Baseline 不改变梯度方向,只降低波动! 前提是 b(s) 不依赖当前动作 a

9. Advantage Function

当 baseline 取 V^pi(s) 时:

A^pi(s,a) = Q^pi(s,a) - V^pi(s)

img

策略梯度变成:

grad J ∝ E[grad log pi(a|s) A^pi(s,a)]

img

优势函数表示动作相对该状态平均动作的好坏: - A > 0:增加该动作概率。

  • A < 0:降低该动作概率。

优势比原始回报更适合训练,因为它去掉了状态本身好坏造成的公共偏移。

10. Reward-to-go

原始 REINFORCE 可用整条轨迹回报 G_0 乘所有动作的 log prob。但某个动作不应该为它发生之前的奖励负责。因此常用 reward-to-go:

G_t = R_{t+1} + gamma R_{t+2} + ...

img

当前动作,只对未来奖励负责,不对过去的奖励负责! 更新:

sum_t grad log pi(A_t|S_t) * G_t

img

这减少了无关奖励带来的方差。

11. Actor-Critic

Actor-Critic 同时学习:

Actor: policy pi_theta(a|s) 负责学动作
Critic: value function V_w(s) or Q_w(s,a) &nbsp;负责打分
Actor 用 critic 提供的价值或优势来更新策略:

grad_theta log pi_theta(a|s) * advantage

img

Critic 用 TD target 更新价值:

delta_t = R_{t+1} + gamma V_w(S_{t+1}) - V_w(S_t)

img

常见 actor update:

theta &lt;- theta + alpha * grad log pi_theta(A_t|S_t) * delta_t

img

其中 TD error 可以作为 advantage 的估计。

12. A2C 与 A3C

A2C(Advantage Actor-Critic)通常指同步采样多个环境,计算 advantage 后更新 actor 和 critic。 A3C(Asynchronous Advantage Actor-Critic)使用多个 worker 异步与环境交互并更新全局参数。它通过并行采样降低样本相关性。 二者的核心都是:

policy loss: -log pi(a|s) * advantage
value loss: &nbsp;value prediction 与 return/TD target 的差
entropy loss: 鼓励探索

13. GAE

GAE(Generalized Advantage Estimation)用多步 TD error 加权估计 advantage:

delta_t = r_t + gamma V(s_{t+1}) - V(s_t)

A_t^GAE
= delta_t + gamma lambda delta_{t+1}
&nbsp; + (gamma lambda)^2 delta_{t+2} + ...

img

lambda 控制 bias-variance 权衡: - lambda=0 接近一步 TD,方差低但 bias 高。

  • lambda=1 接近 Monte Carlo,bias 低但方差高。

GAE 是 PPO 等算法中非常常见的 advantage 估计方法。 - gamma折扣因子只管reward远近价值 - GAE的lambda则负责:要不要把后面几步的 TD 误差拿来一起估算 A

14. Entropy Regularization

策略梯度训练可能过早收敛到确定性策略,探索不足。熵正则鼓励策略保持一定随机性:

H(pi(.|s)) = - sum_a pi(a|s) log pi(a|s)

img

常见目标:

policy_objective + beta * entropy

最终目标 = 原本的策略目标 + β * 熵
在 loss 中通常写为:

loss = policy_loss + value_loss - beta * entropy
熵系数太大,策略会过度随机;太小,探索不足。

15. TRPO 的信赖域思想

普通策略梯度如果步子太大,策略分布会剧烈变化,导致性能崩坏。TRPO(Trust Region Policy Optimization)限制新旧策略之间的 KL 散度:

maximize surrogate objective
subject to E[KL(pi_old(.|s), pi_new(.|s))] &lt;= delta
核心直觉:

策略每次只能在可信区域内更新,避免单次更新过大。
TRPO 理论优雅但实现复杂,涉及二阶近似和共轭梯度。PPO 后续用 clipping 或 KL penalty 近似 TRPO 的信赖域思想。

16. 实现细节

离散动作策略常见实现:

logits = policy_net(states)
dist = Categorical(logits=logits)
actions = dist.sample()
log_probs = dist.log_prob(actions)
entropy = dist.entropy()
Actor loss:

policy_loss = -(log_probs * advantages.detach()).mean()
Critic loss:

value_loss = mse(V(states), returns)
常见注意点: - advantage 通常 detach,避免 actor loss 反向更新 critic。

  • advantage 常做 normalization。

  • return/advantage 的时间维索引要正确。

  • log prob 必须对应采样时的动作。

  • 连续动作要正确计算高斯分布 log probability。

17. 策略梯度的优缺点

优点: - 直接优化策略。

  • 适合随机策略和连续动作。

  • 能与深度网络自然结合。

  • 与 LLM token 分布形式一致。

缺点: - 样本效率低。

  • 梯度方差高。

  • 对 reward scale、advantage 估计、学习率敏感。

  • 更新过大可能导致策略崩坏。

18. 与 LLM、RLHF 的联系

LLM 的生成过程可以看成策略:

pi_theta(token_t | context_t)
一条输出序列是 trajectory。奖励可以来自人类偏好、奖励模型、规则判分或任务结果。策略梯度更新的核心形式仍然是:

grad log pi_theta(action|state) * advantage
PPO、RLHF-PPO、GRPO 都是在这个基础上加入 KL 约束、ratio clipping、group advantage 等稳定化设计。

19. 常见误区

误区一:策略梯度需要知道环境转移概率。 实际推导中环境转移项不依赖策略参数,不需要对其求导。 误区二:baseline 会改变最优策略。 只要 baseline 不依赖动作,它不改变梯度期望,只降低方差。 误区三:REINFORCE 和 Actor-Critic 没有关系。 Actor-Critic 可以看成用 critic 估计 return/advantage 的策略梯度方法。 误区四:advantage 越大越好。 advantage 尺度过大可能导致更新过猛,通常需要归一化或裁剪。 误区五:TRPO/PPO 是完全不同于策略梯度的算法。 它们仍是策略梯度思想,只是限制策略更新幅度。

20. 核心总结

第十三天需要掌握的最小闭环:

Policy:
&nbsp; pi_theta(a|s)

Objective:
&nbsp; J(theta) = E_tau[G_0]

Log-derivative trick:
&nbsp; grad p = p grad log p

Policy gradient:
&nbsp; grad J ∝ E[grad log pi(a|s) Q^pi(s,a)]

REINFORCE:
&nbsp; loss = -log pi(a|s) * G_t

Baseline:
&nbsp; G_t - V(s)

Advantage:
&nbsp; A(s,a) = Q(s,a) - V(s)

Actor-Critic:
&nbsp; actor updates policy
&nbsp; critic estimates value/advantage

TRPO:
&nbsp; restrict policy update by KL trust region

21. 参考资料

  • CSDN:策略梯度和 REINFORCE 算法:https://blog.csdn.net/qq_64671439/article/details/137026601

  • CSDN:多种 Actor-Critic 讲解:https://blog.csdn.net/qq_64671439/article/details/137611583

  • 动手学强化学习:策略梯度算法:http://hrl.boyuai.com/chapter/2/%E7%AD%96%E7%95%A5%E6%A2%AF%E5%BA%A6%E7%AE%97%E6%B3%95/

  • 动手学强化学习:Actor-Critic 算法:http://hrl.boyuai.com/chapter/2/actor-critic%E7%AE%97%E6%B3%95/

  • 动手学强化学习:TRPO 算法:http://hrl.boyuai.com/chapter/2/trpo%E7%AE%97%E6%B3%95/

  • Williams, REINFORCE algorithm:https://link.springer.com/article/10.1007/BF00992696

  • Sutton and Barto, Reinforcement Learning: An Introduction, Chapter 13:http://incompleteideas.net/book/RLbook2020.pdf

  • Trust Region Policy Optimization:https://arxiv.org/abs/1502.05477

  • High-Dimensional Continuous Control Using Generalized Advantage Estimation:https://arxiv.org/abs/1506.02438

            预览时标签不可点
    

    <div class="