首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【八】强化学习之DDPG---PaddlePaddlle【PARL】框架{飞桨}

【八】强化学习之DDPG---PaddlePaddlle【PARL】框架{飞桨}

作者头像
汀丶人工智能
发布于 2022-12-01 08:01:56
发布于 2022-12-01 08:01:56
51000
代码可运行
举报
文章被收录于专栏:NLP/KGNLP/KG
运行总次数:0
代码可运行

相关文章:

【一】飞桨paddle【GPU、CPU】安装以及环境配置+python入门教学

【二】-Parl基础命令

【三】-Notebook、&pdb、ipdb 调试

【四】-强化学习入门简介

【五】-Sarsa&Qlearing详细讲解

【六】-DQN

【七】-Policy Gradient

【八】-DDPG

【九】-四轴飞行器仿真

代码链接:码云:https://gitee.com/dingding962285595/parl_work  ;github:https://github.com/PaddlePaddle/PARL


一、AI Studio 项目详解【VisualDL工具】

二、AI Studio 项目详解【环境使用说明、脚本任务】

三、AI Studio 项目详解【分布式训练-单机多机】

四、AI Studio 项目详解【图形化任务】

五、AI Studio 项目详解【在线部署及预测】


1. 连续动作空间

离散动作&连续动作

2.DDPG讲解Deep Deterministic Policy Gradient

  • deep-神经网络--DNQ扩展 

目标网络 target work

经验回放 replay memory

  • Deterministic Policy Gradient  

·Deterministic    直接输出确定的动作

·Policy Gradient  单步更新的policy网络

 DDPG是DQN的扩展版本,可以扩展到连续控制动作空间

2.1 策略网络:

actor对外输出动作;critic会对每个输出的网络进行评估。刚开始随机参数初始化,然后根据reward不断地反馈。

目标网络target network +经验回放ReplayMemory

两个target_Q/P网络的作用是稳定Q网络里的Q_target 复制原网络一段时间不变。

2.2 经验回放ReplayMemory

用到数据:

  • Agent把产生的数据传给algorithmalgorithm根据model的模型结构计算出Loss,使用SGD或者其他优化器不断的优化,PARL这种架构可以很方便的应用在各类深度强化学习问题中。

(1)Model

Model用来定义前向(Forward)网络,用户可以自由的定制自己的网络结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Model(parl.Model):
    def __init__(self, act_dim):
        self.actor_model = ActorModel(act_dim)
        self.critic_model = CriticModel()
 
    def policy(self, obs):
        return self.actor_model.policy(obs)
 
    def value(self, obs, act):
        return self.critic_model.value(obs, act)
 
    def get_actor_params(self):
        return self.actor_model.parameters()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ActorModel(parl.Model):
    def __init__(self, act_dim):
        hid_size = 100
 
        self.fc1 = layers.fc(size=hid_size, act='relu')
        self.fc2 = layers.fc(size=act_dim, act='tanh')
 
    def policy(self, obs):
        hid = self.fc1(obs)
        means = self.fc2(hid)
        return means
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CriticModel(parl.Model):
    def __init__(self):
        hid_size = 100
 
        self.fc1 = layers.fc(size=hid_size, act='relu')
        self.fc2 = layers.fc(size=1, act=None)
 
    def value(self, obs, act):
        concat = layers.concat([obs, act], axis=1)
        hid = self.fc1(concat)
        Q = self.fc2(hid)
        Q = layers.squeeze(Q, axes=[1])
        return Q

(2)Algorithm

  • Algorithm 定义了具体的算法来更新前向网络(Model),也就是通过定义损失函数来更新Model,和算法相关的计算都放在algorithm中。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def _critic_learn(self, obs, action, reward, next_obs, terminal):
        next_action = self.target_model.policy(next_obs)
        next_Q = self.target_model.value(next_obs, next_action)
 
        terminal = layers.cast(terminal, dtype='float32')
        target_Q = reward + (1.0 - terminal) * self.gamma * next_Q
        target_Q.stop_gradient = True
 
        Q = self.model.value(obs, action)
        cost = layers.square_error_cost(Q, target_Q)
        cost = layers.reduce_mean(cost)
        optimizer = fluid.optimizer.AdamOptimizer(self.critic_lr)
        optimizer.minimize(cost)
        return cost
 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def _actor_learn(self, obs):
        action = self.model.policy(obs)
        Q = self.model.value(obs, action)
        cost = layers.reduce_mean(-1.0 * Q)
        optimizer = fluid.optimizer.AdamOptimizer(self.actor_lr)
        optimizer.minimize(cost, parameter_list=self.model.get_actor_params())
        return cost
 

软更新:每次更新一点参数,用\tau控制,按比例更新

硬更新:是每隔一段时间全部参数都更新

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def sync_target(self, decay=None, share_vars_parallel_executor=None):
        """ self.target_model从self.model复制参数过来,若decay不为None,则是软更新
        """
        if decay is None:
            decay = 1.0 - self.tau
        self.model.sync_weights_to(
            self.target_model,
            decay=decay,
            share_vars_parallel_executor=share_vars_parallel_executor)

(3)Agent

  • Agent负责算法与环境的交互,在交互过程中把生成的数据提供给Algorithm来更新模型(Model),数据的预处理流程也一般定义在这里。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Agent(parl.Agent):
    def __init__(self, algorithm, obs_dim, act_dim):
        assert isinstance(obs_dim, int)
        assert isinstance(act_dim, int)
        self.obs_dim = obs_dim
        self.act_dim = act_dim
        super(Agent, self).__init__(algorithm)
 
        # 注意:最开始先同步self.model和self.target_model的参数.
        self.alg.sync_target(decay=0)
 
    def build_program(self):
        self.pred_program = fluid.Program()
        self.learn_program = fluid.Program()
 
        with fluid.program_guard(self.pred_program):
            obs = layers.data(
                name='obs', shape=[self.obs_dim], dtype='float32')
            self.pred_act = self.alg.predict(obs)
 
        with fluid.program_guard(self.learn_program):
            obs = layers.data(
                name='obs', shape=[self.obs_dim], dtype='float32')
            act = layers.data(
                name='act', shape=[self.act_dim], dtype='float32')
            reward = layers.data(name='reward', shape=[], dtype='float32')
            next_obs = layers.data(
                name='next_obs', shape=[self.obs_dim], dtype='float32')
            terminal = layers.data(name='terminal', shape=[], dtype='bool')
            _, self.critic_cost = self.alg.learn(obs, act, reward, next_obs,
                                                 terminal)
 
    def predict(self, obs):
        obs = np.expand_dims(obs, axis=0)
        act = self.fluid_executor.run(
            self.pred_program, feed={'obs': obs},
            fetch_list=[self.pred_act])[0]
        act = np.squeeze(act)
        return act
 
    def learn(self, obs, act, reward, next_obs, terminal):
        feed = {
            'obs': obs,
            'act': act,
            'reward': reward,
            'next_obs': next_obs,
            'terminal': terminal
        }
        critic_cost = self.fluid_executor.run(
            self.learn_program, feed=feed, fetch_list=[self.critic_cost])[0]
        self.alg.sync_target()
        return critic_cost
 

(4)env.py

连续控制版本的CartPole环境

  • 该环境代码与算法无关,可忽略不看,参考gym

(5)经验池 ReplayMemory

DQNreplay_mamory.py代码一致

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ReplayMemory(object):
    def __init__(self, max_size):
        self.buffer = collections.deque(maxlen=max_size)
 
    def append(self, exp):
        self.buffer.append(exp)
 
    def sample(self, batch_size):
        mini_batch = random.sample(self.buffer, batch_size)
        obs_batch, action_batch, reward_batch, next_obs_batch, done_batch = [], [], [], [], []
 
        for experience in mini_batch:
            s, a, r, s_p, done = experience
            obs_batch.append(s)
            action_batch.append(a)
            reward_batch.append(r)
            next_obs_batch.append(s_p)
            done_batch.append(done)
 
        return np.array(obs_batch).astype('float32'), \
            np.array(action_batch).astype('float32'), np.array(reward_batch).astype('float32'),\
            np.array(next_obs_batch).astype('float32'), np.array(done_batch).astype('float32')
 
    def __len__(self):
        return len(self.buffer)
 
 

(6)train

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 训练一个episode
def run_episode(agent, env, rpm):
    obs = env.reset()
    total_reward = 0
    steps = 0
    while True:
        steps += 1
        batch_obs = np.expand_dims(obs, axis=0)
        action = agent.predict(batch_obs.astype('float32'))
 
        # 增加探索扰动, 输出限制在 [-1.0, 1.0] 范围内
        action = np.clip(np.random.normal(action, NOISE), -1.0, 1.0)
 
        next_obs, reward, done, info = env.step(action)
 
        action = [action]  # 方便存入replaymemory
        rpm.append((obs, action, REWARD_SCALE * reward, next_obs, done))
 
        if len(rpm) > MEMORY_WARMUP_SIZE and (steps % 5) == 0:
            (batch_obs, batch_action, batch_reward, batch_next_obs,
             batch_done) = rpm.sample(BATCH_SIZE)
            agent.learn(batch_obs, batch_action, batch_reward, batch_next_obs,
                        batch_done)
 
        obs = next_obs
        total_reward += reward
 
        if done or steps >= 200:
            break
    return total_reward

增加扰动保持探索,添加一个高斯噪声。np.clip做一下裁剪,确保在合适的范围内。

总结

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【九】强化学习之TD3算法四轴飞行器仿真---PaddlePaddlle【PARL】框架
代码链接:码云:https://gitee.com/dingding962285595/parl_work  ;github:https://github.com/PaddlePaddle/PARL
汀丶人工智能
2022/12/01
6390
【九】强化学习之TD3算法四轴飞行器仿真---PaddlePaddlle【PARL】框架
【七】强化学习之Policy Gradient---PaddlePaddlle【PARL】框架{飞桨}
代码链接:码云:https://gitee.com/dingding962285595/parl_work  ;github:https://github.com/PaddlePaddle/PARL
汀丶人工智能
2022/12/01
3820
【七】强化学习之Policy Gradient---PaddlePaddlle【PARL】框架{飞桨}
【六】强化学习之DQN---PaddlePaddlle【PARL】框架{飞桨}
代码链接:码云:https://gitee.com/dingding962285595/parl_work  ;github:https://github.com/PaddlePaddle/PARL
汀丶人工智能
2022/12/01
2900
【六】强化学习之DQN---PaddlePaddlle【PARL】框架{飞桨}
【二】MADDPG多智能体算法实现(parl)【追逐游戏复现】
论文原文:Multi-AgentActor-CriticforMixedCooperative-CompetitiveEnvironments_单智能体-互联网文档类资源-CSDN下载
汀丶人工智能
2022/12/21
2.5K2
【二】MADDPG多智能体算法实现(parl)【追逐游戏复现】
用多智能体强化学习算法MADDPG解决"老鹰捉小鸡"问题
MADDPG算法是强化学习的进阶算法,在读对应论文Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments的过程中,往往会遇到很多不是很好理解的数学公式,这篇文章旨在帮助读者翻过数学这座大山,并从PARL(PARL是百度提供的一个高性能、灵活的强化学习框架)的代码理解MADDPG算法。本文目录如下:
用户1386409
2020/08/12
1.6K0
用多智能体强化学习算法MADDPG解决"老鹰捉小鸡"问题
PARL源码走读:使用策略梯度算法求解迷宫寻宝问题
作为一个强化学习小白,本人怀着学习的心态,安装并运行了PARL里的quick-start。不体验不知道,一体验吓一跳,不愧是NeurIPS 2018 冠军团队的杰作,代码可读性良好,函数功能非常清晰,模块之间耦合度低、内聚性强。不仅仅适合零基础的小白快速搭建DRL环境,也十分适合科研人员复现论文结果。
大数据文摘
2019/04/26
1.1K0
PARL源码走读:使用策略梯度算法求解迷宫寻宝问题
yyds!用飞桨玩明日方舟
每个游戏玩家都有一个梦,希望自己在虚拟世界中成为万众瞩目、无所不能的英雄。然后…然后…闹钟响了梦醒了,又到了挤地铁上班的时间。
用户1386409
2021/04/20
7690
yyds!用飞桨玩明日方舟
用Dota2“最强”算法PPO完成CarPole和四轴飞行器悬浮任务
Bill Gates在Twitter中提到:“AI机器人在Dota 2中战胜人类,是AI发展的一个里程碑事件”。
用户1386409
2020/08/11
9080
用Dota2“最强”算法PPO完成CarPole和四轴飞行器悬浮任务
使用Ray并行化你的强化学习算法(二)
spinningup给新手提供了几个重要算法的实现,具有很好的参考价值。除了SAC外,其他on policy算法都使用MPI进行并行化,唯独SAC没有并行实现。所以,我们使用Ray来完成SAC的并行实现。
CreateAMind
2019/12/19
1.5K0
使用Ray并行化你的强化学习算法(二)
PaddlePaddle版Flappy-Bird—使用DQN算法实现游戏智能
刚刚举行的 WAVE SUMMIT 2019 深度学习开发者峰会上,PaddlePaddle 发布了 PARL 1.1 版本,这一版新增了 IMPALA、A3C、A2C 等一系列并行算法。作者重新测试了一遍内置 example,发现卷积速度也明显加快,从 1.0 版本的训练一帧需大约 1 秒优化到了 0.15 秒(配置:win8,i5-6200U,GeForce-940M,batch-size=32)。
用户1386409
2019/06/06
7600
PaddlePaddle版Flappy-Bird—使用DQN算法实现游戏智能
强化学习从基础到进阶-案例与实践4.2:深度Q网络DQN-Cart pole游戏展示
比如本项目的Cart pole小游戏中,agent就是动图中的杆子,杆子有向左向右两种action。
汀丶人工智能
2023/06/30
4210
强化学习从基础到进阶-案例与实践5.1:Policy Gradient-Cart pole游戏展示
比如本项目的Cart pole小游戏中,agent就是动图中的杆子,杆子有向左向右两种action。
汀丶人工智能
2023/06/30
3350
强化学习从基础到进阶-案例与实践5.1:Policy Gradient-Cart pole游戏展示
【SSL-RL】自监督强化学习:随机潜在演员评论家 (SLAC)算法
随机潜在演员评论家,Stochastic Latent Actor-Critic (SLAC)算法 是一种用于连续控制任务的自监督强化学习算法,由Google Brain提出。SLAC结合了自监督学习和深度强化学习,通过构建一个隐变量模型(Latent Variable Model)来捕捉环境的潜在状态,并使用这些状态来进行策略优化。SLAC特别适合于高维观测(如图像)和部分可观测的环境。SLAC算法的主要目标是通过学习潜在空间的动态来更好地估计环境状态,进而提升智能体的策略学习效率。
不去幼儿园
2024/12/03
1930
【SSL-RL】自监督强化学习:随机潜在演员评论家 (SLAC)算法
《PaddlePaddle从入门到炼丹》七——强化学习
本章介绍使用PaddlePaddle实现强化学习,通过自我学习,完成一个经典控制类的游戏,相关游戏介绍可以在Gym官网上了解。我们这次玩的是一个CartPole-v1游戏,操作就是通过控制滑块的左右移动,不让竖着的柱子掉下来。利用强化学习的方法,不断自我学习,通过在玩游戏的过程中获取到奖励或者惩罚,学习到一个模型。在王者荣耀中的超强人机使用的AI技术也类似这样。
夜雨飘零
2020/05/01
5490
《PaddlePaddle从入门到炼丹》七——强化学习
【二】强化学习之Parl基础命令--PaddlePaddlle及PARL框架{飞桨}
相关文章: 【一】飞桨paddle【GPU、CPU】安装以及环境配置+python入门教学 【二】-Parl基础命令 【三】-Notebook、&pdb、ipdb 调试 【四】-强化学习入门简介 【五】-Sarsa&Qlearing详细讲解 【六】-DQN 【七】-Policy Gradient 【八】-DDPG 【九】-四轴飞行器仿真 飞桨paddle遇到bug调试修正【迁移工具、版本兼容性】 paddle DeBug 三步定位PARL飞桨报错原因,快速解决程序问题 ---- 一、AI Studio 项目
汀丶人工智能
2022/12/01
3230
DDPG强化学习的PyTorch代码实现和逐步讲解
来源:Deephub Imba本文约4300字,建议阅读10分钟本文将使用pytorch对其进行完整的实现和讲解。 深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)是受Deep Q-Network启发的无模型、非策略深度强化算法,是基于使用策略梯度的Actor-Critic,本文将使用pytorch对其进行完整的实现和讲解。 DDPG的关键组成部分是 Replay Buffer Actor-Critic neural network Explorati
数据派THU
2023/04/05
9360
DDPG强化学习的PyTorch代码实现和逐步讲解
强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
相比于Q learning,DQN本质上是为了适应更为复杂的环境,并且经过不断的改良迭代,到了Nature DQN(即Volodymyr Mnih发表的Nature论文)这里才算是基本完善。DQN主要改动的点有三个:
汀丶人工智能
2023/06/24
5510
强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
【SSL-RL】自监督强化学习:自预测表征 (SPR)算法
自预测表征,Self-Predictive Representations (SPR)算法 是一种用于自监督强化学习的算法,旨在通过学习预测未来的潜在状态来帮助智能体构建有用的状态表示。SPR在强化学习任务中无需依赖稀疏或外部奖励,通过自监督学习的方法获得环境的潜在结构和动态信息。这种方法特别适合高维观测环境(如图像)或部分可观测的任务。
不去幼儿园
2024/12/03
2390
【SSL-RL】自监督强化学习:自预测表征 (SPR)算法
深度强化学习在异构环境中AI Agent行为泛化能力研究
随着人工智能技术的迅猛发展,AI Agent 在游戏、智能制造、自动驾驶等场景中已逐步展现出强大的自适应能力。特别是深度强化学习(Deep Reinforcement Learning, DRL)的引入,使得智能体能够通过与环境的交互,自动学习最优的行为策略。本文将系统性地探讨基于深度强化学习的AI Agent行为决策机制,并结合代码实战加以说明。
一键难忘
2025/07/31
1590
Hands on Reinforcement Learning Frontier Chapter
虽然强化学习不需要有监督学习中的标签数据,但它十分依赖奖励函数的设置。有时在奖励函数上做一些微小的改动,训练出来的策略就会有天差地别。在很多现实场景中,奖励函数并未给定,或者奖励信号极其稀疏,此时随机设计奖励函数将无法保证强化学习训练出来的策略满足实际需要。例如,对于无人驾驶车辆智能体的规控,其观测是当前的环境感知恢复的 3D 局部环境,动作是车辆接下来数秒的具体路径规划,那么奖励是什么?如果只是规定正常行驶而不发生碰撞的奖励为+1,发生碰撞为-100,那么智能体学习的结果则很可能是找个地方停滞不前。具体能帮助无人驾驶小车规控的奖励函数往往需要专家的精心设计和调试。
一只野生彩色铅笔
2023/04/27
8040
Hands on Reinforcement Learning Frontier Chapter
推荐阅读
相关推荐
【九】强化学习之TD3算法四轴飞行器仿真---PaddlePaddlle【PARL】框架
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档