ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

策略梯度与Actor-Critic算法:原理与实践

策略梯度与Actor-Critic算法:原理与实践 1. 策略梯度与Actor-Critic算法概述在强化学习领域策略梯度Policy Gradient和Actor-Critic算法是两类重要的方法。策略梯度方法直接优化策略函数通过梯度上升来最大化期望回报。而Actor-Critic算法则结合了策略梯度与值函数近似的优势形成了一种混合架构。策略梯度方法的核心思想是通过采样轨迹来估计梯度然后使用梯度上升来更新策略参数。这类方法的代表是REINFORCE算法它直接利用蒙特卡洛采样得到的回报来指导策略更新。然而REINFORCE算法存在高方差的问题导致训练不稳定。Actor-Critic算法通过引入Critic价值函数评估器来解决这个问题。Critic负责评估当前策略的价值为Actor策略执行器提供更准确的梯度信号。这种架构既保留了策略梯度方法直接优化策略的优势又通过值函数降低了方差提高了训练效率。2. 策略梯度算法详解2.1 策略梯度基本原理策略梯度方法的核心公式可以表示为∇J(θ) E[∇logπ(a|s)Q(s,a)]其中J(θ)是策略的期望回报π(a|s)是参数化策略Q(s,a)是状态-动作价值函数在实际实现中我们通常使用蒙特卡洛采样来估计这个期望。REINFORCE算法就是基于这个原理的最基本策略梯度方法。2.2 REINFORCE算法实现REINFORCE算法的伪代码如下初始化策略参数θfor 每个episode: a. 根据当前策略π采样一个轨迹τ b. 计算轨迹中每个时间步的回报G_t c. 更新策略参数θ ← θ α∑G_t∇logπ(a_t|s_t)重复直到收敛这个算法虽然简单但由于直接使用蒙特卡洛回报G_t导致梯度估计的方差很大。在实践中我们通常会引入基线baseline来降低方差最常见的是使用状态价值函数V(s)作为基线。3. Actor-Critic算法解析3.1 Actor-Critic架构设计Actor-Critic算法由两个主要组件构成Actor负责选择动作的策略函数Critic评估动作价值的值函数这两个组件协同工作Actor根据当前策略选择动作Critic则评估这些动作的价值为Actor提供改进方向。这种架构的优势在于降低了策略梯度的方差可以实现单步更新而不需要等待整个episode结束通常能获得更稳定的训练过程3.2 优势函数与TD误差在Actor-Critic算法中我们通常使用优势函数Advantage Function来替代原始的回报A(s,a) Q(s,a) - V(s)这个优势函数衡量了在状态s下采取动作a比平均情况好多少。在实践中我们常用TD误差来估计优势函数δ r γV(s) - V(s)其中γ是折扣因子。这个TD误差实际上就是优势函数的一个无偏估计。3.3 算法实现细节一个基本的Actor-Critic算法实现包含以下步骤初始化策略网络Actor和价值网络Criticfor 每个时间步 a. Actor根据当前策略选择动作a b. 执行动作a观察奖励r和新状态s c. Critic计算TD误差δ r γV(s) - V(s) d. 更新Critic参数以最小化TD误差的平方 e. 使用δ作为优势估计更新Actor参数重复直到收敛4. 实践中的Actor-Critic4.1 网络架构设计在实践中Actor和Critic通常实现为神经网络。常见的架构设计包括共享特征提取层Actor和Critic共享底层的特征提取网络上层分别输出策略和价值独立网络Actor和Critic使用完全独立的网络结构双Critic结构使用两个Critic网络来防止过估计对于连续动作空间Actor通常输出动作的高斯分布参数均值和方差对于离散动作空间则输出各个动作的概率。4.2 超参数调优Actor-Critic算法对超参数比较敏感需要仔细调整学习率通常Critic的学习率要比Actor大如10倍折扣因子γ通常在0.9-0.99之间熵正则化添加策略熵的奖励鼓励探索批大小影响梯度估计的准确性4.3 常见变体基于基本的Actor-Critic框架研究者提出了多种改进算法A2C/A3C同步/异步的Advantage Actor-CriticPPO近端策略优化通过裁剪保证更新稳定性SAC柔性Actor-Critic最大化熵目标DDPG深度确定性策略梯度适用于连续动作空间5. 代码实现示例下面是一个简单的Actor-Critic实现基于PyTorchimport torch import torch.nn as nn import torch.optim as optim import gym class PolicyNetwork(nn.Module): def __init__(self, state_dim, action_dim): super().__init__() self.fc1 nn.Linear(state_dim, 64) self.fc2 nn.Linear(64, action_dim) def forward(self, x): x torch.relu(self.fc1(x)) return torch.softmax(self.fc2(x), dim-1) class ValueNetwork(nn.Module): def __init__(self, state_dim): super().__init__() self.fc1 nn.Linear(state_dim, 64) self.fc2 nn.Linear(64, 1) def forward(self, x): x torch.relu(self.fc1(x)) return self.fc2(x) env gym.make(CartPole-v1) state_dim env.observation_space.shape[0] action_dim env.action_space.n actor PolicyNetwork(state_dim, action_dim) critic ValueNetwork(state_dim) actor_optim optim.Adam(actor.parameters(), lr1e-3) critic_optim optim.Adam(critic.parameters(), lr1e-2) gamma 0.99 for episode in range(1000): state env.reset() done False while not done: # 选择动作 state_tensor torch.FloatTensor(state) action_probs actor(state_tensor) action torch.multinomial(action_probs, 1).item() # 执行动作 next_state, reward, done, _ env.step(action) # 计算TD误差 value critic(state_tensor) next_value critic(torch.FloatTensor(next_state)) td_error reward (1-done)*gamma*next_value - value # 更新Critic critic_loss td_error.pow(2) critic_optim.zero_grad() critic_loss.backward() critic_optim.step() # 更新Actor log_prob torch.log(action_probs[action]) actor_loss -log_prob * td_error.detach() actor_optim.zero_grad() actor_loss.backward() actor_optim.step() state next_state6. 实际应用中的挑战与解决方案6.1 训练不稳定性问题Actor-Critic算法在实际应用中常遇到训练不稳定的问题可能的原因包括策略更新步长过大价值函数估计不准确探索不足导致局部最优解决方案使用PPO的裁剪机制限制策略更新幅度采用目标网络稳定Critic训练添加熵正则化鼓励探索6.2 高维状态空间处理对于图像等高维输入可以考虑使用CNN提取视觉特征添加注意力机制关注关键区域结合自监督学习预训练特征提取器6.3 样本效率提升提高样本效率的方法使用经验回放Experience Replay实现优先经验回放Prioritized Experience Replay结合模型预测控制MPC7. 前沿发展与未来方向近年来Actor-Critic框架在以下方面取得了显著进展分布式训练如IMPALA框架多智能体协作MADDPG等算法元强化学习快速适应新任务与大型语言模型结合如SayCan项目未来可能的发展方向包括更高效的价值函数表示方法更好的探索策略设计与生成模型的深度结合在复杂决策问题中的实际应用
返回列表