1. Policy-based强化学习基础
强化学习中的策略梯度方法直接对策略进行建模和优化,与value-based方法形成鲜明对比。想象一下你在教一个机器人走路:value-based方法会先计算每个动作的"价值分数",然后选择最高分的动作;而policy-based方法则直接告诉机器人"在当前状态下,腿向前迈30度的概率是70%,向后收15度的概率是30%"。
这种直接输出动作概率分布的方式带来了三大优势:
- 连续动作处理:对于机械臂控制这类需要精确角度调节的任务,policy-based方法可以直接输出连续值
- 随机策略生成:在博弈场景中,随机策略可以避免被对手预测,就像石头剪刀布游戏需要随机出招
- 状态表征鲁棒性:当环境观测受限时(比如两个不同状态看起来相似),直接学习策略比依赖精确的价值评估更可靠
核心的Policy Gradient定理给出了策略优化的数学基础:
# 策略梯度更新公式的PyTorch实现示例
optimizer.zero_grad()
log_prob = policy_network(state).log_prob(action)
loss = -log_prob * advantage # advantage = Q(s,a) - V(s)
loss.backward()
optimizer.step()
这个看似简单的公式背后蕴含着深刻的直觉:如果一个动作带来了比预期更好的结果(advantage为正),就增加选择它的概率;反之则降低。就像教练会根据运动员的表现调整训练方案,好的动作会被强化,差的动作会被弱化。
2. REINFORCE算法解析
作为最基础的policy-based算法,REINFORCE展现了策略梯度的核心思想。我用一个游戏AI的例子来说明它的工作原理:假设我们在训练一个玩《超级马里奥》的AI,它会经历以下步骤:
- 采样轨迹:AI用当前策略玩完整局游戏,记录下所有状态、动作和奖励
- 计算回报:对每个时间点,计算从该时刻开始的累计奖励G_t
- 策略更新:调整策略网络参数,使高回报的动作概率增加
# REINFORCE算法伪代码
for episode in range(total_episodes):
states, actions, rewards = run_episode(env, policy)
discounted_rewards = compute_discounted_rewards(rewards)
for t in range(len(states)):
advantage = discounted_rewards[t] - baseline(state[t]) # 减去基线减小方差
policy.update(states[t], actions[t], advantage)
但REINFORCE存在明显的缺陷,我在实际项目中遇到过这些问题:
- 高方差:单次episode的回报波动很大,就像同一场考试,学霸可能因为状态不好得低分,学渣也可能蒙对很多题
- 低效采样:每更新一次策略就需要重新采样完整轨迹,就像每次调整教学方案后都要重新观察学生整个学期的表现
- 信用分配困难:整局游戏的成败不能准确反映每个动作的真实价值,就像足球队进球不能完全归功于最后射门的球员
一个实用的改进技巧是对回报进行标准化处理:
# 回报标准化实现
rewards = (rewards - rewards.mean()) / (rewards.std() + 1e-8)
3. 从Actor-Critic到A2C
Actor-Critic架构像是一个团队:Actor(演员)负责做动作决策,Critic(评论家)则评估这些动作的好坏。A2C(Advantage Actor-Critic)是这个思想的高效实现。
核心创新点:
- 用价值函数V(s)作为baseline,计算优势函数A(s,a)=Q(s,a)-V(s)
- 采用TD误差δ = r + γV(s') - V(s)来估计优势函数
- 同步更新策略网络(Actor)和价值网络(Critic)
# A2C网络结构示例
class A2C(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.actor = nn.Sequential(
nn.Linear(state_dim, 64),
nn.ReLU(),
nn.Linear(64, action_dim),
nn.Softmax(dim=-1))
self.critic = nn.Sequential(
nn.Linear(state_dim, 64),
nn.ReLU(),
nn.Linear(64, 1))
我在机器人控制项目中使用A2C时发现几个关键点:
- 学习率平衡:Critic通常需要比Actor更小的学习率(如1e-3 vs 5e-4)
- 优势估计:采用n-step TD效果比单步TD更稳定
- 并行训练:多个环境实例并行采集数据可以显著提升样本多样性
A2C相比REINFORCE的改进就像从手动挡升级到自动挡:REINFORCE需要手动处理整个episode的回报计算,而A2C通过Critic网络自动提供实时反馈,使训练更加平滑高效。
4. PPO算法深度剖析
PPO(Proximal Policy Optimization)是目前最流行的policy-based算法,我在多个工业级项目中验证了它的稳定性。它的核心创新是通过策略约束实现稳定训练。
PPO-Clip的关键方程:
L^{CLIP}(θ) = E_t[min(r_t(θ)A_t, clip(r_t(θ),1-ε,1+ε)A_t)]
其中r_t(θ)是新旧策略的概率比,ε是超参数(通常取0.1-0.3)。
这个设计精妙的公式实现了:
- 策略约束:通过clip操作限制更新幅度,防止策略突变
- 定向优化:只对优势为正的动作进行概率比约束
- 自动调节:当新旧策略差异大时,clip操作自动限制更新
# PPO的核心更新代码
for _ in range(update_epochs):
ratios = new_probs / old_probs
surr1 = ratios * advantages
surr2 = torch.clamp(ratios, 1.0-clip_eps, 1.0+clip_eps) * advantages
policy_loss = -torch.min(surr1, surr2).mean()
value_loss = F.mse_loss(returns, values)
entropy_loss = -entropy.mean()
total_loss = policy_loss + 0.5*value_loss - 0.01*entropy_loss
在实际调参中我发现:
- clip范围:连续控制任务需要更小的ε(如0.1),离散任务可以稍大(0.2-0.3)
- 熵系数:保持在0.01左右可以平衡探索与利用
- 并行workers:通常设置8-16个并行环境能达到最佳时间效率
PPO的成功在于它像一位经验丰富的教练:既鼓励学生尝试新方法(探索),又防止他们突然改变习惯动作导致表现崩溃(策略约束)。这种平衡使得PPO成为从游戏AI到机器人控制等各种场景的首选算法。

496

被折叠的 条评论
为什么被折叠?



