首页 游戏 软件 资讯 排行榜 专题
首页
AI
强化学习——Actor Critic Method

强化学习——Actor Critic Method

热心网友
27
转载
2025-07-22
本文介绍CartPole-V0环境中Actor-Critic方法的实现。该方法含Actor和Critic两个网络,前者输出动作概率,后者估计未来回报。训练时,通过交互收集数据,计算回报和优势,分别更新两个网络。实验显示,训练后代理能长时间保持杆子平衡,体现了该方法结合策略与值函数逼近、单步更新、高效利用数据的优势。

强化学习——actor critic method - 游乐网

强化学习——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:它将我们的环境状态作为输入,并返回对未来总回报的估计。In [ ]
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 Method - 游乐网        

五、效果展示

在训练的早期 强化学习——Actor Critic Method - 游乐网        

在训练的后期 强化学习——Actor Critic Method - 游乐网        

六、总结

Actor-Critic,其实是用了两个网络: 一个输出策略,负责选择动作,我们把这个网络称为Actor;一个负责计算每个动作的分数,我们把这个网络称为Critic大家可以形象地想象为,Actor是舞台上的舞者,Critic是台下的评委,Actor在台上跳舞,一开始舞姿并不好看,Critic根据Actor的舞姿打分。Actor通过Critic给出的分数,去学习:如果Critic给的分数高,那么Actor会调整这个动作的输出概率;相反,如果Critic给的分数低,那么就减少这个动作输出的概率。Actor-Critic方法结合了值函数逼近(Critic)和策略函数逼近(Actor),它从与环境的交互中学习到越来越精确的Critic(评估),能够实现单步更新,相对单纯的策略梯度,Actor-Critic能够更充分的利用数据。
来源:https://www.php.cn/faq/1422092.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Python怎么把PyTorch模型导出为ONNX格式_torch.onnx.export与dynamic_axes设定
编程语言
Python怎么把PyTorch模型导出为ONNX格式_torch.onnx.export与dynamic_axes设定

PyTorch模型导出ONNX格式完整指南:torch onnx export参数详解与dynamic_axes动态轴设置技巧 模型导出成功但推理结果异常?动态轴设置不当是主要原因 许多深度学习工程师在将PyTorch模型转换为ONNX格式时都会遇到一个典型问题:导出过程顺利通过,但在ONNX Ru

热心网友
04.18
Python如何快速统计列表中元素频率_使用collections.Counter高效计数
编程语言
Python如何快速统计列表中元素频率_使用collections.Counter高效计数

Counter:Python中统计元素频率最直接高效的方式 在Python编程中,当需要快速统计一个列表或可迭代对象中各元素的出现次数时,最省心且性能出色的工具是什么?答案无疑是collections Counter。它作为字典(dict)的子类,专为计数场景设计,开箱即用。它能自动完成初始化、支持

热心网友
04.18
Mac系统如何彻底卸载Python多版本_清理残留路径与配置文件
编程语言
Mac系统如何彻底卸载Python多版本_清理残留路径与配置文件

Mac系统如何彻底卸载Python多版本_清理残留路径与配置文件 确认哪些 Python 是你装的,哪些是系统自带的 在Mac上彻底清理Python,首要任务是准确区分用户自行安装的版本与系统内置版本。系统自带的python(通常是Python 2 7)与macOS底层功能紧密集成,切勿尝试删除或修

热心网友
04.17
CodeGeeX怎么写Python网络扫描代码_CodeGeeX辅助实现端口扫描逻辑【网络扫描】
AI
CodeGeeX怎么写Python网络扫描代码_CodeGeeX辅助实现端口扫描逻辑【网络扫描】

一、使用socket模块逐端口连接检测 想从最基础、最轻量的方法入手?Python标准库里的socket模块是个不错的起点。它通过尝试建立TCP连接来判断端口状态,无需任何外部依赖,适合快速验证或小范围探测。 具体操作起来很简单:在你安装了CodeGeeX插件的IDE(比如VS Code)里新建一个

热心网友
04.17
如何在 Python 中对符号向量进行平方运算(如计算模长平方)
编程语言
如何在 Python 中对符号向量进行平方运算(如计算模长平方)

如何在 Python 中对符号向量进行平方运算(如计算模长平方) 在科学计算与工程建模领域,处理符号向量时,一个常见且易混淆的操作便是“向量平方”。需要明确的是,在符号计算中,“向量平方”通常并非指对每个分量进行平方,而是指计算其模长的平方(即 $ mathbf{M}^ top mathbf{M}

热心网友
04.17

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

《红色沙漠》泥浆行者卢特米勒打法技巧分享
游戏攻略
《红色沙漠》泥浆行者卢特米勒打法技巧分享

《红色沙漠》泥浆行者卢特米勒打法技巧分享 在开放世界游戏《红色沙漠》中,泥浆行者卢特米勒是许多玩家在冒险途中遭遇的强大挑战。这个被称为“聚合人”的异型BOSS,以其独特的攻击模式和较高的血量,成为了一个标志性的难关。但只要掌握正确的攻略方法,击败它并非难事。本文将为你详细解析卢特米勒的打法技巧与核心

热心网友
04.18
Linktopia
AI
Linktopia

Linktopia是什么 简单来说,Linktopia是一个专为SaaS创业社区打造的链接交换平台。它的构想很直接:一群资深的SEO和链接建设专家,发现初创公司获取高质量外链实在头疼,于是干脆搭建了一个“以链接换链接”的集市。目标用户也相当明确,就是那些急需提升域名权威和自然流量的创始人,以及为他们

热心网友
04.18
打破“国产只能做低端组装”偏见!张雪:未来五年,我们将吃掉国际大牌50%以上份额【附摩托车行业技术分析】
科技数码
打破“国产只能做低端组装”偏见!张雪:未来五年,我们将吃掉国际大牌50%以上份额【附摩托车行业技术分析】

机车夺冠者张雪:未来五年,我们将吃掉国际大牌 50% 以上份额 (图片来源:摄图网) 历史在这一刻被改写。当地时间3月28日,当法国车手瓦伦丁・德比斯驾驶着那辆张雪机车820RR-RS赛车,在世界超级摩托车锦标赛(WSBK)葡萄牙站WorldSSP组别率先冲线时,领先优势竟接近4秒。这不仅是一场胜利

热心网友
04.18
Empathy 通过提供实用和情感支持,帮助人们应对生活中的重大转变和挑战
AI
Empathy 通过提供实用和情感支持,帮助人们应对生活中的重大转变和挑战

Empathy产品介绍 在生活中遭遇重大变故,比如失去亲人,那种无助和繁复的事务处理交织在一起的感受,很多人都经历过。这时候,如果有一双手既能提供情感依靠,又能帮忙理清千头万绪,无疑是雪中送炭。Empathy就是这样一家公司,它专注于为处于人生重大转变期的人们提供支持和解决方案,尤其是面对丧失和重大

热心网友
04.18
《红色沙漠》疾风大作打法技巧分享
游戏攻略
《红色沙漠》疾风大作打法技巧分享

《红色沙漠》疾风大作怎么打?人型BOSS高效打法全解析 在《红色沙漠》的冒险旅程中,人型BOSS“疾风大作”以其高强度的战斗机制,成为许多玩家前进路上的棘手挑战。掌握正确的应对策略,是将其成功击败的关键。本文将为您详细拆解疾风大作的打法技巧,助您轻松攻克。 应对疾风大作的核心战术非常明确:首选武器为

热心网友
04.18