1. 策略梯度与Actor-Critic方法解析
在强化学习领域,策略梯度(Policy Gradient)和Actor-Critic方法是两类核心算法。不同于基于价值函数的方法(如Q-Learning),它们直接对策略进行优化,特别适合处理连续动作空间和高维状态空间的问题。这两种方法在机器人控制、游戏AI和自动化决策系统中有着广泛应用。
我最早接触策略梯度是在开发一个工业机械臂控制项目时。当时我们需要让机械臂学习复杂的抓取动作,传统的值函数方法在连续动作空间表现不佳,而策略梯度方法则展现出独特优势。后来引入Actor-Critic框架后,系统的学习效率和稳定性得到了显著提升。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 策略梯度方法详解
2.1 基本原理与数学推导
策略梯度的核心思想是直接对策略函数π(a|s;θ)的参数θ进行优化,通过梯度上升来最大化期望回报。其目标函数可以表示为:
J(θ) = E[∑γ^t r_t | πθ]
关键推导步骤:
- 使用似然比技巧(Likelihood Ratio Trick)将梯度表示为期望形式
- 通过蒙特卡洛采样估计梯度
- 引入基线(baseline)减少方差
实际应用中常见误区:初学者容易忽略折扣因子γ的作用,导致长期回报估计不准确。我在早期项目中就犯过这个错误,导致算法收敛缓慢。
2.2 REINFORCE算法实现
REINFORCE是最基础的策略梯度算法,其伪代码如下:
python复制for episode in episodes:
states, actions, rewards = run_episode(env)
discounted_rewards = compute_discounted_rewards(rewards, gamma)
for t in range(len(states)):
grad = compute_gradient(states[t], actions[t])
theta += alpha * (gamma**t) * discounted_rewards[t] * grad
实现时的关键细节:
- 奖励归一化:建议对每批次的回报进行标准化处理
- 学习率选择:通常需要比监督学习更小的学习率
- 批次大小:过小的批次会导致高方差,建议至少32个episode
2.3 策略梯度的改进方法
2.3.1 带基线的策略梯度
引入状态相关的基线函数b(s)可以显著降低方差:
∇J(θ) ∝ E[(G_t - b(s_t))∇lnπ(a_t|s_t)]
常见基线选择:
- 移动平均回报
- 价值函数估计器
- 神经网络拟合的基准
2.3.2 自然策略梯度
通过使用Fisher信息矩阵进行梯度归一化,可以改善收敛性:
θ ← θ + αF^-1∇J(θ)
其中F是策略的Fisher信息矩阵。这种方法在TRPO和PPO等现代算法中得到应用。
3. Actor-Critic框架解析
3.1 基本架构与工作原理
Actor-Critic方法包含两个核心组件:
- Actor:策略函数,负责选择动作
- Critic:价值函数,评估状态/动作的价值
两者协同工作的流程:
- Actor根据当前策略选择动作
- 环境返回新状态和奖励
- Critic计算TD误差δ
- 用δ同时更新Actor和Critic
调试经验:Actor和Critic的学习率需要仔细调整。通常Critic的学习率应该比Actor稍大,这样价值估计才能为策略更新提供可靠指导。
3.2 优势函数设计
优势函数A(s,a) = Q(s,a) - V(s)是Actor-Critic的核心,常见估计方法:
| 方法 | 公式 | 特点 |
|---|---|---|
| TD(0) | r + γV(s') - V(s) | 计算简单,偏差较大 |
| n-step | ∑γ^k r_{t+k} + γ^n V(s_{t+n}) - V(s_t) | 平衡偏差和方差 |
| GAE | ∑(γλ)^l δ_ | 可调参数λ控制偏差方差权衡 |
3.3 典型Actor-Critic算法实现
以A2C(Advantage Actor-Critic)为例:
python复制class A2C:
def __init__(self):
self.actor = PolicyNetwork()
self.critic = ValueNetwork()
def update(self, states, actions, rewards, next_states, dones):
# 计算TD目标
values = self.critic(states)
next_values = self.critic(next_states)
targets = rewards + gamma * next_values * (1 - dones)
# 计算优势
advantages = targets - values
# 更新Critic
critic_loss = MSE(values, targets)
# 更新Actor
log_probs = self.actor.get_log_prob(states, actions)
actor_loss = -(log_probs * advantages).mean()
# 联合优化
total_loss = critic_loss + actor_loss
optimizer.zero_grad()
total_loss.backward()
optimizer.step()
4. 实战技巧与调优经验
4.1 网络架构设计
Actor和Critic网络可以共享部分底层特征提取层:
code复制Shared Base Layers
├── Actor Head (Policy)
└── Critic Head (Value)
经验参数配置:
- 隐藏层维度:128-512之间
- 激活函数:ReLU或Tanh
- 策略输出:连续动作用Tanh,离散动作用Softmax
4.2 训练稳定性技巧
- 学习率调度:初期用较大学习率,后期逐步衰减
- 梯度裁剪:防止梯度爆炸,通常设阈值在0.5-1.0
- 熵正则化:保持探索,系数通常设为0.01-0.1
- 并行采样:使用多个环境实例加速数据收集
4.3 常见问题排查
-
回报不增长:
- 检查奖励设计是否合理
- 验证Critic的预测是否准确
- 尝试增大探索系数
-
训练不稳定:
- 减小学习率
- 增加批次大小
- 添加梯度裁剪
-
过早收敛:
- 提高熵正则化系数
- 尝试不同的初始化
- 引入课程学习策略
5. 进阶发展与实际应用
5.1 现代变体算法
-
PPO(Proximal Policy Optimization):
- 使用clip函数限制策略更新幅度
- 支持并行采样,数据效率高
-
SAC(Soft Actor-Critic):
- 最大化熵目标函数
- 自动调节温度参数
- 特别适合连续控制任务
-
TD3(Twin Delayed DDPG):
- 双Q网络防止过估计
- 延迟策略更新
- 目标策略平滑
5.2 工业应用案例
-
机器人控制:
- 机械臂抓取(6自由度连续控制)
- 四足机器人步态学习
-
游戏AI:
- NPC行为策略
- 实时对战决策
-
资源管理:
- 数据中心能耗优化
- 网络流量调度
在实际部署时,我们发现将训练好的策略网络转换为ONNX格式,可以显著提高推理速度。例如在机械臂控制系统中,推理延迟从15ms降低到了3ms以下。
