第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 = Σ_{k=t}^{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和A3C
A2C(Advantage Actor-Critic)和A3C(Asynchronous 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。
GAE(Generalized Advantage Estimation)是A2C中常用的优势估计方法。它用TD(λ)的思路,在偏差和方差之间做trade-off。λ=0对应一步TD估计(偏差大、方差小),λ=1对应蒙特卡洛估计(无偏、方差大)。通常λ取0.95左右,效果比较好。GAE的公式是A_t = Σ(γλ)^l · δ_{t+l},其中δ_t = r_t + γV(s_{t+1}) - 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实现跑通任务,再去看源码理解内部实现。
下一篇预告:第303篇 Actor-Critic方法详解
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)