1. 策略梯度方法的核心思想
策略梯度(Policy Gradients)是强化学习中最基础也最重要的算法家族之一。与基于价值函数的方法(如Q-learning)不同,策略梯度直接对策略进行参数化建模和优化。这种方法特别适合处理连续动作空间和高维状态空间的问题,比如机器人控制、游戏AI等场景。
我在实际项目中多次使用策略梯度方法解决控制问题,发现它有几个显著优势:首先,它可以直接学习随机策略,这在部分观测环境中非常有用;其次,它能自然地处理连续动作空间,而基于价值的方法通常需要离散化处理;最后,策略参数化可以引入先验知识,加速学习过程。
1.1 策略参数化表示
策略通常表示为πθ(a|s),其中θ是可学习的参数。常见的选择包括:
-
对于离散动作空间:softmax策略
python复制def softmax_policy(obs, theta): logits = np.dot(obs, theta) probs = np.exp(logits) / np.sum(np.exp(logits)) return np.random.choice(len(probs), p=probs) -
对于连续动作空间:高斯策略
python复制def gaussian_policy(obs, theta): mean = np.dot(obs, theta[:obs_dim]) std = np.exp(theta[-1]) # 保证标准差为正 return np.random.normal(mean, std)
在实际应用中,我通常会在神经网络中实现这些策略,因为神经网络可以自动提取特征并处理高维输入。例如,在Atari游戏中,我们会用CNN处理图像输入;在机器人控制中,则常用MLP处理状态向量。
1.2 策略梯度定理
策略梯度定理是这类算法的理论基础,它给出了目标函数J(θ)(通常是期望回报)关于策略参数的梯度:
∇θ J(θ) = Eπ[∇θ log πθ(a|s) Qπ(s,a)]
这个优雅的公式告诉我们:可以通过增加导致高回报动作的概率,减少导致低回报动作的概率来优化策略。我在实践中发现,理解这个定理对调试算法非常重要——当算法不收敛时,检查梯度计算是否正确往往是第一步。
关键提示:策略梯度估计通常方差很大,这是算法不稳定的主要原因。后续我们会讨论降低方差的技术。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础REINFORCE算法实现
REINFORCE是最基础的策略梯度算法,它直接使用蒙特卡洛采样得到的回报作为Qπ(s,a)的估计。让我们通过一个完整的Pendulum环境实现来理解它。
2.1 算法伪代码解析
code复制初始化策略参数θ
for 每个训练周期:
采样轨迹τ: s0,a0,r1,s1,a1,...,rT
计算每个时间步的回报Gt = Σγ^(k-t) rk
计算梯度估计 ∇J(θ) ≈ Σ ∇logπ(at|st) Gt
更新参数 θ ← θ + α∇J(θ)
我在实现时发现几个关键点:
- 轨迹需要完整采样到episode结束,不能像DQN那样用片段
- 回报Gt的计算需要考虑折扣因子γ
- 梯度是期望的估计,需要多个episode的平均
2.2 完整PyTorch实现
python复制import torch
import gym
cla
