强化学习(6):Actor-Critic(演员评论家)算法

本文深入探讨了Actor-Critic算法,一种结合了PolicyGradient和Q-Learning优点的强化学习方法。该算法通过Actor网络(基于策略)和Critic网络(基于值函数)的相互作用,实现了高效的行为选择和价值评估,特别适用于连续动作空间的问题。

本文主要讲解有关 Actor-Critic 算法的有关知识。

一、Actor Critic 算法

Actor-Critic 算法合并了以策略为基础的 Policy Gradient和以值为基础的 Q-Learning 两类强化学习算法,该算法中将前者当作 Actor,用来基于概率选择行为。将后者当作 Critic,用来评判 Actor 的行为得分,然后 Actor 又会根据 Critic 的评分修改行为的概率。这使得它既可以在有效的处理连续动作的选取,又可以进行单步更新(PG算法的回合更新降低了学习效率)。

下面分别介绍一下 Actor 网络和 Critic 网络这个两个部分。

二、Actor 网络

Actor 网络采用的是基于策略的 Policy-Gradient 算法。PG 算法的损失函数可以表示为:loss=−E[log⁡[π(a∣s)]⋅ψ]loss=-E[\log{[\pi(a|s)]}\cdot \psi]loss=E[log[π(as)]ψ],其中 ψ\psiψ 是对某个轨迹的评分, 在 AC 算法中它可以有多种表示方式:

  1. 状态价值函数:V(s)
  2. 动作价值函数:Q(s,a)
  3. TD-error:r+γ⋅Q(st+1,at+1)−Q(st,at)r+\gamma\cdot Q(s_{t+1},a_{t+1})-Q(s_t,a_t)r+γQ(st+1,at+1)Q(st,at)
  4. 优势函数:V(s,a)
  5. 总回报:∑rt\sum r_trt
  6. 加入基线的总回报:∑rt−b\sum r_t-brtb

在实际编写代码的时候,使用的是 TD-error 来作为评价,同时为了鼓励探索(exploration),所以损失函数中还加入了交叉熵损失。

三、Critic 网络

Critic 网络采用的是基于值函数的 Q-Learning 算法,采用的是 loss=(TD_error)2loss=(TD\_{error})^2loss=(TD_error)2 作为 Critic 网络的损失函数。

整个 Actor Critic 算法可以用下图表示:

actor-critic

四、AC 算法的缺点

AC 取决于 Critic 的价值判断, 但是 Critic 难收敛, 再加上 Actor 的更新, 就更难收敛,为了解决该问题又提出了 DDPG 算法和 A3C 算法。

<think>好的,我现在要帮助用户了解深度强化学习中的Actor-Critic方法,特别是PPO算法的实现与应用。首先,我需要回顾一下Actor-Critic框架的基本概念。Actor-Critic方法结合了策略梯度(Actor)和价值函数(Critic)的优点,Actor负责选择动作,Critic评估当前策略的表现,从而指导Actor的更新。这能有效减少方差,提升学习稳定性。 接下来,用户重点询问的是PPO算法。PPO(Proximal Policy Optimization)是一种基于策略优化的算法,属于Actor-Critic的范畴。PPO的主要特点是引入了重要性采样和裁剪机制,确保策略更新的幅度不会过大,从而保持训练的稳定性。我需要详细解释PPO的核心机制,比如目标函数中的clip部分,以及如何通过限制策略更新的步长来避免性能崩溃。 然后,关于实现部分,用户可能需要具体的代码示例。我需要考虑使用Python和PyTorch框架,因为这在深度强化学习领域比较常见。代码结构应包括ActorCritic网络的定义,经验回放缓冲区的实现,以及训练循环中的关键步骤,比如数据收集、优势估计、损失计算和参数更新。 同时,用户提供的引用中提到了SAC算法,虽然用户的问题是关于PPO的,但可能需要区分两者的不同。比如,SAC是Off-Policy且结合了最大熵框架,而PPO是On-Policy,更注重稳定性。不过用户的问题集中在PPO,所以应聚焦于此。 在应用场景方面,需要举出PPO在实际中的典型应用,如机器人控制、游戏AI等,并说明其优势,比如处理高维状态空间和连续动作空间的能力。此外,实现中的常见技巧,如Generalized Advantage Estimation (GAE)、学习率调整和并行采样等,也需要提及,以帮助用户全面理解。 最后,生成的相关问题需要围绕PPO的优化、对比分析、参数调整和应用扩展,这样用户如果有进一步疑问,可以沿着这些方向深入探索。需要确保问题具有引导性,帮助用户深化理解。 现在,我需要组织这些思路,用清晰的结构分点解释PPO的原理、实现步骤,并附上代码示例。同时注意使用正确的中文术语,避免技术错误,并引用提供的参考资料中的相关内容,如提到SAC的不同之处时引用[^2]和[^3]。确保回答符合用户要求的格式,如行内公式用$...$,独立公式用$$...$$,正确使用LaTeX语法,并在适当的位置添加引用标识。</think>### 深度强化学习 Actor-Critic PPO 算法详解及实现 #### 一、Actor-Critic 方法基础 Actor-Critic 框架结合了**策略梯度方法**和**价值函数估计**,包含两个核心组件: 1. **Actor**:策略网络 $ \pi_\theta(a|s) $,参数为 $ \theta $,负责生成动作; 2. **Critic**:价值网络 $ V_\phi(s) $ 或 $ Q_\phi(s,a) $,参数为 $ \phi $,评估状态或状态-动作对的价值。 优势在于通过 Critic 降低策略梯度的方差,提升学习效率[^2]。 --- #### 二、PPO 算法核心原理 **PPO(Proximal Policy Optimization)** 是一种基于 Actor-Critic 的 On-policy 算法,通过**重要性采样裁剪**确保策略更新稳定性。其目标函数为: $$ L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t \right) \right] $$ 其中: - $ r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} $ 为重要性采样比率; - $ A_t $ 为优势函数,通常通过 GAE(Generalized Advantage Estimation)计算; - $ \epsilon $ 是裁剪阈值(如 0.2),限制策略更新幅度[^3]。 --- #### 三、PPO 实现步骤(PyTorch 示例) ##### 1. 网络定义 ```python import torch import torch.nn as nn class Actor(nn.Module): def __init__(self, state_dim, action_dim): super().__init__() self.net = nn.Sequential( nn.Linear(state_dim, 256), nn.ReLU(), nn.Linear(256, action_dim), nn.Tanh() # 连续动作空间 ) self.log_std = nn.Parameter(torch.zeros(action_dim)) # 对数标准差 def forward(self, s): mean = self.net(s) std = self.log_std.exp() return torch.distributions.Normal(mean, std) class Critic(nn.Module): def __init__(self, state_dim): super().__init__() self.net = nn.Sequential( nn.Linear(state_dim, 256), nn.ReLU(), nn.Linear(256, 1) ) def forward(self, s): return self.net(s) ``` ##### 2. 经验回放与优势计算 ```python def compute_advantages(rewards, dones, values, gamma=0.99, lam=0.95): advantages = [] gae = 0 next_value = 0 for t in reversed(range(len(rewards))): delta = rewards[t] + gamma * next_value * (1 - dones[t]) - values[t] gae = delta + gamma * lam * (1 - dones[t]) * gae next_value = values[t] advantages.insert(0, gae) return torch.tensor(advantages) ``` ##### 3. 训练循环(关键代码) ```python def ppo_update(actor, critic, optimizer, states, actions, old_log_probs, advantages, clip_epsilon=0.2): # 计算新策略的概率 dist = actor(states) new_log_probs = dist.log_prob(actions).sum(axis=-1) ratio = (new_log_probs - old_log_probs).exp() # Critic 损失 values = critic(states).squeeze() critic_loss = nn.MSELoss()(values, advantages + values.detach()) # 目标值为优势+当前值 # Actor 损失(带裁剪) surr1 = ratio * advantages surr2 = torch.clamp(ratio, 1 - clip_epsilon, 1 + clip_epsilon) * advantages actor_loss = -torch.min(surr1, surr2).mean() # 总损失 total_loss = actor_loss + 0.5 * critic_loss # 可加熵正则项 optimizer.zero_grad() total_loss.backward() optimizer.step() ``` --- #### 四、应用场景与优化技巧 1. **应用场景**: - 机器人控制(连续动作空间); - 游戏 AI(如 Dota 2、星际争霸 II); - 资源调度与优化问题。 2. **优化技巧**: - **GAE(Generalized Advantage Estimation)**:平衡偏差与方差; - **学习率衰减**:提升后期训练稳定性; - **并行采样**:通过多个环境实例加速数据收集。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值