1. 策略梯度方法入门:从监督学习到强化学习
在监督学习中,我们通常有明确的输入输出对,模型的目标是最小化预测与真实标签之间的差异。但强化学习的环境完全不同——智能体需要通过与环境的交互来学习最优策略,而环境反馈往往是延迟且稀疏的。这正是策略梯度方法(Policy Gradient Methods)的用武之地。
策略梯度方法直接对策略进行参数化,通过优化策略参数θ来最大化期望回报。与值函数方法(如Q-learning)不同,策略梯度不需要维护单独的值函数估计,而是直接调整策略本身。这种端到端的方式特别适合处理连续动作空间和高维状态空间的问题。
我最初接触策略梯度时,最困惑的是如何在没有明确"正确答案"的情况下计算梯度。关键在于理解"奖励加权"的概念——高回报轨迹的动作会被增强,低回报的则被抑制。这种思想与生物学习中的"试错法"惊人地相似。
2. 策略梯度定理的数学推导
2.1 目标函数的定义
强化学习的目标是找到一个策略π_θ,使得期望回报最大化。我们用J(θ)表示这个目标函数:
J(θ) = E[Σγ^t r_t | π_θ]
其中γ是折扣因子,r_t是t时刻的即时奖励。我们的任务是找到使J(θ)最大的θ值。这看起来像是一个标准的优化问题,但挑战在于J(θ)的梯度不能直接计算——因为期望依赖于策略本身。
2.2 策略梯度定理的证明
策略梯度定理给出了目标函数梯度的一个优雅表达式:
∇_θ J(θ) = E[∇_θ log π_θ(a|s) Q^π(s,a)]
这个定理的神奇之处在于,它将策略参数的梯度与动作值函数Q^π联系起来。让我们一步步推导这个结果。
首先,考虑一个轨迹τ=(s_0,a_0,r_0,s_1,...)的概率:
p(τ|θ) = p(s_0)Ππ_θ(a_t|s_t)p(s_{t+1}|s_t,a_t)
取对数后:
log p(τ|θ) = log p(s_0) + Σ[log π_θ(a_t|s_t) + log p(s_{t+1}|s_t,a_t)]
对θ求导时,只有策略项π_θ(a_t|s_t)有贡献:
∇_θ log p(τ|θ) = Σ∇_θ log π_θ(a_t|s_t)
现在,我们可以将目标函数的梯度表示为:
∇_θ J(θ) = ∇_θ E[Σγ^t r_t]
= E[(Σγ^t r_t)(∇_θ log p(τ|θ))]
= E[(Σγ^t r_t)(Σ∇_θ log π_θ(a_t|s_t))]
通过一些代数变换和期望的性质,我们可以得到最终的策略梯度表达式。
关键理解:策略梯度实际上是奖励加权后的策略对数梯度。高回报轨迹的梯度方向会被加强,低回报的则被减弱。
3. 策略梯度算法的实现细节
3.1 REINFORCE算法
REINFORCE是最基础的策略梯度算法,直接使用蒙特卡洛回报作为Q^π的估计。其更新规则为:
θ ← θ + αγ^t G_t ∇_θ log π_θ(a_t|s_t)
其中G_t=Σγ^{k-t} r_k是从t时刻开始的折扣回报。
实现时的几个关键点:
- 需要完整的轨迹才能计算G_t
- 高方差是主要问题,因为蒙特卡洛估计的波动很大
- 加入基线(baseline)可以显著减少方差
3.2 带基线的REINFORCE
引入基线b(s)后,梯度估计变为:
∇_θ J(θ) ≈ E[∇_θ log π_θ(a|s) (Q^π(s,a)-b(s))]
常见选择是使用状态值函数V^π(s)作为基线。这引出了优势函数A^π(s,a)=Q^π(s,a)-V^π(s)的概念。
实践中,我们可以用神经网络同时近似π_θ和V_φ,形成所谓的Actor-Critic架构。
4. 策略梯度的高级变体
4.1 自然策略梯度(Natural Policy Gradient)
传统梯度下降在参数空间进行欧氏距离度量,这可能与策略性能的实际变化不对应。自然策略梯度使用Fisher信息矩阵F(θ)作为度量:
F(θ) = E[∇_θ log π_θ(a|s) ∇_θ log π_θ(a|s)^T]
更新方向变为:
θ ← θ + α F(θ)^{-1} ∇_θ J(θ)
这相当于在策略分布的KL散度约束下进行更新,通常能带来更稳定的训练。
4.2 信赖域策略优化(TRPO)
TRPO通过强制KL散度约束来保证策略更新的稳定性:
max_θ E[π_θ(a|s)/π_θ_old(a|s) A^π(s,a)]
s.t. E[KL(π_θ_old || π_θ)] ≤ δ
这个约束优化问题可以通过共轭梯度法高效求解。
4.3 近端策略优化(PPO)
PPO是TRPO的简化版本,通过裁剪概率比来近似实现约束:
L(θ) = E[min(r_t(θ)A_t, clip(r_t(θ),1-ε,1+ε)A_t)]
其中r_t(θ)=π_θ(a_t|s_t)/π_θ_old(a_t|s_t)。这种形式计算高效且实现简单,已成为当前最流行的策略梯度算法。
5. 策略梯度的创新本质理解
策略梯度方法的创新性体现在几个方面:
-
直接策略优化:不同于值函数方法间接通过值函数推导策略,策略梯度直接操作策略空间,更适合处理连续动作和高维问题。
-
策略参数化的灵活性:可以使用任意可微函数(如神经网络)表示策略,只要能够计算∇_θ log π_θ(a|s)。
-
随机策略的天然支持:与确定性策略不同,策略梯度方法可以自然地表示随机策略,这在探索和部分可观测环境中特别有价值。
-
理论保证:策略梯度定理提供了严格的数学基础,确保梯度估计的无偏性。
-
与其他领域的联系:策略梯度与进化策略、黑箱优化等方法有深刻的联系,为算法创新提供了丰富的交叉视角。
6. 策略梯度的实践技巧与常见问题
6.1 实现中的关键技巧
- 输入标准化:对状态输入进行标准化可以显著提高训练稳定性。我通常会维护运行的平均和方差:
python复制class RunningMeanStd:
def __init__(self, shape):
self.mean = np.zeros(shape)
self.var = np.ones(shape)
self.count = 1e-4
def update(self, x):
batch_mean = np.mean(x, axis=0)
batch_var = np.var(x, axis=0)
batch_count = x.shape[0]
delta = batch_mean - self.mean
self.mean += delta * batch_count / (self.count + batch_count)
m_a = self.var * self.count
m_b = batch_var * batch_count
M2 = m_a + m_b + delta**2 * self.count * batch_count / (self.count + batch_count)
self.var = M2 / (self.count + batch_count)
self.count += batch_count
-
折扣因子选择:γ接近1时学习长期回报,但梯度方差增大;γ较小则更关注即时奖励。对于episodic任务,我通常从γ=0.99开始调整。
-
并行采样:使用多个环境并行采样可以显著提高数据效率。现代实现如PyTorch的DataLoader可以方便地实现这一点。
6.2 常见问题与解决方案
问题1:训练不稳定,性能突然崩溃
解决方案:
- 使用更保守的算法(如PPO-clip)
- 减小学习率
- 增加批量大小
- 添加策略熵正则项
问题2:学习速度慢
解决方案:
- 检查优势估计是否准确
- 尝试不同的神经网络架构
- 调整折扣因子γ
- 增加并行环境数量
问题3:策略过早收敛到次优解
解决方案:
- 增加熵系数鼓励探索
- 使用课程学习从简单任务开始
- 尝试不同的策略初始化
经验法则:当策略性能停滞时,首先检查梯度是否仍然有意义(非零),然后考虑探索是否充分。
7. 策略梯度的前沿发展与展望
虽然我们已经讨论了策略梯度的基础和主流变体,但这个领域仍在快速发展。一些有前景的方向包括:
-
分布式策略梯度:如Ape-X DPG框架,通过分布式采样和优先经验回放大幅提升样本效率。
-
元学习策略梯度:学习快速适应新任务的策略梯度算法,如MAML在强化学习中的应用。
-
分层策略梯度:将策略分解为高层和底层策略,分别处理不同时间尺度的决策。
-
与模型预测控制(MPC)的结合:利用学习的世界模型进行策略搜索,如PlaNet框架。
-
离线策略梯度:从固定数据集学习策略而不与环境交互,如BCQ算法。
在实际项目中,我发现策略梯度方法特别适合需要精细控制的任务,如机器人操控和连续控制。与值函数方法相比,策略梯度能更自然地处理连续动作空间,而且通常对超参数不那么敏感。