2026/8/31 7:01:35

第302篇 策略梯度——从REINFORCE到现代方法

第302篇 策略梯度——从REINFORCE到现代方法 上篇聊了MDP和强化学习的基本框架。知道了什么是策略、价值函数、贝尔曼方程。这篇我们进入具体的算法——策略梯度Policy Gradient。策略梯度的思路很直接既然目标是找到最优策略那直接对策略参数化然后用梯度上升来最大化期望回报。跟监督学习中用梯度下降最小化loss是同一个套路只不过这里的loss是期望回报我们要最大化它。策略的参数化策略π_θ(a|s)是一个以θ为参数的概率分布输入状态s输出每个动作的概率。在机器人控制中动作通常是连续的比如关节力矩所以策略一般用高斯分布来建模π_θ(a|s) N(μ_θ(s), σ_θ(s))均值μ_θ(s)由神经网络输出表示最可能的动作。标准差σ_θ(s)也可以由网络输出或者作为一个可学习的参数。采样时从该高斯分布中取样就得到了随机动作。为什么要用随机策略确定性策略直接输出动作值在训练时容易陷入局部最优而且没有探索能力。随机策略天然有探索——即使某个动作的均值很高采样时也可能尝试其他动作。训练后期标准差会自动变小策略趋近于确定性。REINFORCE算法REINFORCE是最基础的策略梯度算法由Williams在1992年提出。它的核心思想是用蒙特卡洛方法来估计策略梯度的方向。# REINFORCE算法的梯度估计 # ∇J(θ) ≈ (1/N) Σ Σ ∇log π_θ(a_t|s_t) * G_t # 其中 G_t Σ_{kt}^{T} γ^(k-t) * r_k 是从t时刻开始的回报直觉上很好理解如果某个动作带来的总回报G_t很高那就增加这个动作的概率梯度方向如果G_t很低甚至为负就减小这个动作的概率。log-likelihood的梯度∇logπ给出了怎么调参数能增大这个动作概率的方向。REINFORCE的问题在于方差极大。G_t是从当前时刻到episode结束的累积回报这个值波动很大。同一个状态下的同一个动作不同episode的G_t可能差很多。高方差意味着训练不稳定需要大量的样本才能收敛。打个比方。你在训练一个机器人走路某一步它碰巧迈了一大步结果这个episode走了很远G_t很高。REINFORCE就会增加在这个状态下迈大步的概率。但这可能只是运气好不代表这个动作真的靠谱。如果多试几次可能发现迈大步反而摔倒了。这就是高方差带来的问题——被偶然的成功误导。从数学上看REINFORCE的梯度估计的方差跟回报的方差成正比。回报的方差大梯度的方差就大参数更新的方向就不稳定。想象一个钟摆在二维平面里随机摆动有些轨迹碰巧到达了目标回报很高但大部分轨迹的回报很低。这种巨大的差异导致梯度方向不断摇摆收敛极慢。降低方差的技巧为了降低REINFORCE的方差有几个常用的技巧。第一个是基线baseline。把G_t减去一个基线值b变成(G_t - b)。b通常取当前策略的平均回报V(s)。减去基线后比平均好的动作仍然被鼓励比平均差的被抑制。数学上可以证明减去基线不改变梯度的期望值无偏但能大幅降低方差。# 带基线的策略梯度 # ∇J(θ) ≈ (1/N) Σ Σ ∇log π_θ(a_t|s_t) * (G_t - b(s_t)) # b(s_t) 通常用价值网络V(s_t)来近似第二个是折扣回报的归一化。把所有episode的G_t收集起来做标准化减均值除标准差。这能进一步降低方差在实践中效果很明显。第三个是缩短采样窗口。REINFORCE用的是从t到episode结束的完整回报。如果episode很长比如机器人走1000步回报的方差就很大。可以只取未来K步的回报来近似K越小方差越小但偏差越大。这是一个trade-off。A2C和A3CA2CAdvantage Actor-Critic和A3CAsynchronous Advantage Actor-Critic是REINFORCE的重要改进。它们的核心思路是用一个价值网络Critic来估计基线用优势函数A(s,a) R - V(s)来替代原始回报。A3C在2016年由DeepMind提出用多个并行的worker异步更新共享的参数。每个worker在自己的环境副本上采样计算梯度后异步更新全局参数。这种异步机制起到了正则化的效果——不同worker探索不同的轨迹梯度的多样性更好。A2C是A3C的同步版本所有worker同步计算梯度后一起更新。工程实现更简单在多核CPU上效率也很高。实际项目中A2C用得比A3C多因为异步带来的好处有限但代码复杂度增加不少。A2C的网络结构通常是Actor和Critic共享特征提取层然后分别输出策略分布和价值估计。对于连续控制任务Actor输出高斯分布的均值和标准差Critic输出一个标量值V(s)。训练时交替更新Actor和Critic先用当前策略采样一批数据计算优势函数然后用策略梯度更新Actor用TD误差更新Critic。GAEGeneralized Advantage Estimation是A2C中常用的优势估计方法。它用TD(λ)的思路在偏差和方差之间做trade-off。λ0对应一步TD估计偏差大、方差小λ1对应蒙特卡洛估计无偏、方差大。通常λ取0.95左右效果比较好。GAE的公式是A_t Σ(γλ)^l · δ_{tl}其中δ_t r_t γV(s_{t1}) - V(s_t)是TD误差。在机器人中的应用策略梯度在机器人控制中有很多成功应用。OpenAI在2018年用PPO策略梯度的一种改进下篇会聊训练机械臂做灵巧操作包括转魔方这种高难度任务。DeepMind用类似方法训练机器人做行走、跑步、跳跃等运动技能。策略梯度方法特别适合机器人控制的原因有几个。第一机器人的动作空间通常是连续的策略梯度天然支持连续动作空间。第二策略梯度可以处理随机策略探索能力好。第三策略梯度可以很方便地加入正则化项比如熵正则化鼓励探索。第四策略梯度能处理高维状态输入比如直接以相机图像作为输入。但也有明显的缺点。样本效率低是最大的问题。策略梯度是on-policy方法——每次更新策略后之前采集的数据就不能用了必须用新策略重新采样。在机器人上采样意味着要在真实硬件上跑非常耗时。一个复杂的操作任务可能需要数百万步的采样在真实机器人上可能要跑几天甚至几周。为了解决样本效率的问题研究者们提出了两个方向。一个是改进on-policy算法本身比如PPO通过限制策略更新幅度来让每一步的数据能用更久。另一个是转向off-policy方法比如DDPG、TD3、SAC这些算法可以用回放缓冲区重用旧数据。下几篇会逐个聊到这些算法。面试要点面试中聊策略梯度重点把握几个核心概念。策略梯度定理。Sutton等人在1999年证明了策略梯度定理期望回报对策略参数的梯度可以写成期望形式∇J(θ) E[∇logπ(a|s)·Q(s,a)]。这个定理是所有策略梯度算法的理论基础。面试时能写出这个公式并解释其含义会很有说服力。on-policy和off-policy的区别。策略梯度是on-policy方法只能用当前策略采集的数据来更新。Q-learning是off-policy方法可以用任何策略采集的数据来更新。off-policy的样本效率高得多但稳定性差一些。PPO虽然本质上是on-policy但通过重要性采样和截断机制在一定程度上利用了旧数据。熵正则化。在目标函数中加入策略的熵H(π) -E[logπ(a|s)]鼓励策略保持随机性避免过早收敛到次优解。熵的系数是个超参数太大策略不收敛太小探索不够。通常在训练初期设大一些随着训练逐步减小。给你的建议学习策略梯度建议从REINFORCE开始实现。先在一个简单环境CartPole或Pendulum上跑通观察训练曲线。然后加入基线和优势函数对比方差的变化。这个过程会帮你建立直觉。代码框架推荐用Stable-Baselines3它是Python生态中最成熟的RL库接口清晰文档完善。先调用现成的PPO或A2C实现跑通任务再去看源码理解内部实现。上一篇第301篇 强化学习基础——马尔可夫决策过程下一篇预告第303篇 Actor-Critic方法详解