强化学习——Actor Critic Method
时间:2025-07-22 | 作者: | 阅读:0本文介绍CartPole-V0环境中Actor-Critic方法的实现。该方法含Actor和Critic两个网络,前者输出动作概率,后者估计未来回报。训练时,通过交互收集数据,计算回报和优势,分别更新两个网络。实验显示,训练后代理能长时间保持杆子平衡,体现了该方法结合策略与值函数逼近、单步更新、高效利用数据的优势。
强化学习——Actor Critic Method
一、介绍
这个脚本展示了CartPole-V0环境中Actor-Critic方法的一个实现。
Actor Critic Method(演员--评论家算法)
当代理在环境中执行操作和移动时,它将学习将观察到的环境状态映射到两个可能的输出:
- 推荐动作:动作空间中每个动作的概率值。代理中负责此输出的部分称为actor(演员)。
- 未来预期回报:它预期在未来获得的所有回报的总和。负责此输出的代理部分是critic(评论家)。 演员和评论家学习执行他们的任务,这样演员推荐的动作就能获得最大的回报。
CartPole-V0
在无摩擦的轨道上,一根杆子系在一辆推车上。agent(代理)必须施加力才能移动推车。每走一步,杆子就保持直立,这是奖励。因此,agent(代理)必须学会防止杆子掉下来。
二、环境配置
本教程基于Paddle 2.0 编写,如果您的环境不是本版本,请先参考官网安装?Paddle 2.0 。
In [?]import gym, osfrom itertools import countimport paddleimport paddle.nn as nnimport paddle.optimizer as optimimport paddle.nn.functional as Ffrom paddle.distribution import Categorical登录后复制 ? ?
三、实施演员-评论家网络
这个网络学习两个功能:
- 演员Actor:它将环境的状态作为输入,并为其动作空间中的每个动作返回一个概率值。
- 评论家Critic:它将我们的环境状态作为输入,并返回对未来总回报的估计。
device = paddle.get_device()env = gym.make(”CartPole-v0“) ### 或者 env = gym.make(”CartPole-v0“).unwrapped 开启无锁定环境训练state_size = env.observation_space.shape[0]action_size = env.action_space.nlr = 0.001##定义“演员”网络class Actor(nn.Layer): def __init__(self, state_size, action_size): super(Actor, self).__init__() self.state_size = state_size self.action_size = action_size self.linear1 = nn.Linear(self.state_size, 128) self.linear2 = nn.Linear(128, 256) self.linear3 = nn.Linear(256, self.action_size) def forward(self, state): output = F.relu(self.linear1(state)) output = F.relu(self.linear2(output)) output = self.linear3(output) distribution = Categorical(F.softmax(output, axis=-1)) return distribution##定义“评论家”网络class Critic(nn.Layer): def __init__(self, state_size, action_size): super(Critic, self).__init__() self.state_size = state_size self.action_size = action_size self.linear1 = nn.Linear(self.state_size, 128) self.linear2 = nn.Linear(128, 256) self.linear3 = nn.Linear(256, 1) def forward(self, state): output = F.relu(self.linear1(state)) output = F.relu(self.linear2(output)) value = self.linear3(output) return value登录后复制 ? ?
四、训练模型
In [?]def compute_returns(next_value, rewards, masks, gamma=0.99): R = next_value returns = [] for step in reversed(range(len(rewards))): R = rewards[step] + gamma * R * masks[step] returns.insert(0, R) return returns## 定义训练过程def trainIters(actor, critic, n_iters): optimizerA = optim.Adam(lr, parameters=actor.parameters()) optimizerC = optim.Adam(lr, parameters=critic.parameters()) for iter in range(n_iters): state = env.reset() log_probs = [] values = [] rewards = [] masks = [] entropy = 0 env.reset() for i in count(): # env.render() state = paddle.to_tensor(state,dtype=”float32“,place=device) dist, value = actor(state), critic(state) action = dist.sample([1]) next_state, reward, done, _ = env.step(action.cpu().squeeze(0).numpy()) #env.step(action.cpu().squeeze(0).numpy()) log_prob = dist.log_prob(action); entropy += dist.entropy().mean() log_probs.append(log_prob) values.append(value) rewards.append(paddle.to_tensor([reward], dtype=”float32“, place=device)) masks.append(paddle.to_tensor([1-done], dtype=”float32“, place=device)) state = next_state if done: if iter % 10 == 0: print('Iteration: {}, Score: {}'.format(iter, i)) break next_state = paddle.to_tensor(next_state, dtype=”float32“, place=device) next_value = critic(next_state) returns = compute_returns(next_value, rewards, masks) log_probs = paddle.concat(log_probs) returns = paddle.concat(returns).detach() values = paddle.concat(values) advantage = returns - values actor_loss = -(log_probs * advantage.detach()).mean() critic_loss = advantage.pow(2).mean() optimizerA.clear_grad() optimizerC.clear_grad() actor_loss.backward() critic_loss.backward() optimizerA.step() optimizerC.step() paddle.save(actor.state_dict(), 'model/actor.pdparams') paddle.save(critic.state_dict(), 'model/critic.pdparams') env.close()if __name__ == '__main__': if os.path.exists('model/actor.pdparams'): actor = Actor(state_size, action_size) model_state_dict = paddle.load('model/actor.pdparams') actor.set_state_dict(model_state_dict ) print('Actor Model loaded') else: actor = Actor(state_size, action_size) if os.path.exists('model/critic.pdparams'): critic = Critic(state_size, action_size) model_state_dict = paddle.load('model/critic.pdparams') critic.set_state_dict(model_state_dict ) print('Critic Model loaded') else: critic = Critic(state_size, action_size) trainIters(actor, critic, n_iters=201)登录后复制 ? ? ? ?
Iteration: 0, Score: 19Iteration: 10, Score: 59Iteration: 20, Score: 24Iteration: 30, Score: 33Iteration: 40, Score: 39Iteration: 50, Score: 62Iteration: 60, Score: 44Iteration: 70, Score: 59Iteration: 80, Score: 21Iteration: 90, Score: 85Iteration: 100, Score: 152Iteration: 110, Score: 103Iteration: 120, Score: 69Iteration: 130, Score: 170Iteration: 140, Score: 199Iteration: 150, Score: 197Iteration: 160, Score: 199Iteration: 170, Score: 199Iteration: 180, Score: 163Iteration: 190, Score: 199Iteration: 200, Score: 199登录后复制 ? ? ? ?
开启无锁定环境训练
200分就是上限,还不能体现模型的能力,现在咱们开启无锁定环境的训练,将env = gym.make("CartPole-v0").unwrapped ,可以适当提高训练轮次。 (所有代码均已封装到train.py文件中,并用vdl记录)
In [3]!python train.py登录后复制 ? ? ? ?
W0303 17:18:01.972481 3940 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1W0303 17:18:01.977756 3940 device_context.cc:372] device: 0, cuDNN Version: 7.6.Actor Model loadedCritic Model loadedIteration: 0, Score: 325登录后复制 ? ? ? ?
这是用vdl记录的Agent可以连续保持平衡的轮数的记录,最大值已经高达131540了,这是一个惊人的数字。
五、效果展示
在训练的早期?
? ? ? ?在训练的后期?
? ? ? ?六、总结
- Actor-Critic,其实是用了两个网络: 一个输出策略,负责选择动作,我们把这个网络称为Actor;一个负责计算每个动作的分数,我们把这个网络称为Critic
- 大家可以形象地想象为,Actor是舞台上的舞者,Critic是台下的评委,Actor在台上跳舞,一开始舞姿并不好看,Critic根据Actor的舞姿打分。Actor通过Critic给出的分数,去学习:如果Critic给的分数高,那么Actor会调整这个动作的输出概率;相反,如果Critic给的分数低,那么就减少这个动作输出的概率。
- Actor-Critic方法结合了值函数逼近(Critic)和策略函数逼近(Actor),它从与环境的交互中学习到越来越精确的Critic(评估),能够实现单步更新,相对单纯的策略梯度,Actor-Critic能够更充分的利用数据。
福利游戏
相关文章
更多-
- 疑似Switch2 OLED中框流出 二手市场惊现原型机部件
- 时间:2025-07-22
-
- 【Paddle打比赛】 交通标志分类识别
- 时间:2025-07-22
-
- 电脑蓝屏代码 PAGEFILE_INSUFFICIENT_ERROR怎么回事儿
- 时间:2025-07-22
-
- 多模态AI支持语音对话吗 多模态AI语音输入输出能力说明
- 时间:2025-07-22
-
- 2021 CCF BDCI基于飞桨实现花样滑冰选手骨骼点动作识别-B榜第3名方案
- 时间:2025-07-22
-
- 如何用夸克AI大模型训练写作模型售卖 夸克AI大模型模型定制变现方式
- 时间:2025-07-22
-
- 豆包AI能干嘛 豆包AI以图生图功能实测教程
- 时间:2025-07-22
-
- 草原偶遇“最美旅行车” 余承东亲测享界S9T智慧电动门
- 时间:2025-07-22
大家都在玩
大家都在看
更多-
- 剑桥数字货币交易所:开启资产新纪元
- 时间:2025-07-22
-
- 称亲自开上了陡坡 余承东晒享界S9T实车:颜值与实力并存
- 时间:2025-07-22
-
- MSN币未来展望:机遇与挑战并存
- 时间:2025-07-22
-
- 电脑蓝屏时屏幕出现乱码 是显卡问题还是显示器故障
- 时间:2025-07-22
-
- Switch 2 OLED中框遭曝光:闲鱼惊现研发样品
- 时间:2025-07-22
-
- 电脑安装软件时提示 “权限不足”,怎么获取权限?
- 时间:2025-07-22
-
- 全球首架“三证齐全”吨级以上eVTOL交付:用于低空货运场
- 时间:2025-07-22
-
- vivo在印度市场连续4季度销量夺冠:Q2狂销810万台
- 时间:2025-07-22