ML-Agents与自己的强化学习算法通讯——PPO篇

这篇具有很好参考价值的文章主要介绍了ML-Agents与自己的强化学习算法通讯——PPO篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在上一篇文章ML-Agents与python的Low Level API通信中,我简要介绍了Python与Unity端的ML-Agents插件的通讯代码,如何正确运行一个能够进行强化学习训练的Unity环境,并获取到响应的信息,接下来将介绍如何利用自己的强化学习算法进行训练。

介绍

这里我利用了强化学习库PARL来训练ML-Agents的3DBall,使用的是PPO算法。
关于PPO的具体代码细节可以参考我以前的文章强化学习PPO代码讲解,这里不再讲述PPO的代码细节(之所以选择PARL,是因为感觉其代码通俗易懂)
PARL主要将代码分为了几个部分,首先是Model脚本,主要用来编写Actor,Critic等神经网络模型。然后是Algorithm脚本,主要编写具体的算法细节,主要有sample,predict,learn函数。还有storage脚本,主要用来存放经验池(reply buffer)。还有Config脚本,存放训练使用的超参数。Agent脚本,用来对Algorithm脚本进行进一步封装,是与环境交互的接口。最后才是训练入口脚本,调用agent脚本和环境进行交互。

主要源码分析

对于PPO算法,我们可以将其分为两个阶段。第一个是收集数据阶段,一个是训练模型阶段。
和SAC,DDPG等off-policy算法类型,PPO也有经验池,但是PPO是on-policy算法,所以收集数据和训练不能同时进行,每一次训练过后,我们都需要把旧的数据丢弃,重新用训练后的模型采集训练数据。
因此,大致流程是这样的:

  1. 所有智能体采集n个step的数据,存放到经验池中。
  2. 采集完成后,计算各个step的advantage,logprob等数据,同样存放起来。
  3. 利用经验池的数据进行m次PPO的更新
  4. 清空经验池数据,重新采样
from mlagents_envs.environment import UnityEnvironment
import numpy as np
from mlagents_envs.environment import ActionTuple
import argparse
import numpy as np
from parl.utils import logger, summary

from storage import RolloutStorage
from parl.algorithms import PPO
from agent import PPOAgent
from genenal_model import GenenalModel_Continuous_Divide
from genenal_config import genenal_config_continuous
from mlagents_envs.side_channel.engine_configuration_channel import EngineConfigurationChannel

# 创建环境
channel = EngineConfigurationChannel()
env = UnityEnvironment(file_name="UnityEnvironment", seed=1, side_channels=[channel])
channel.set_configuration_parameters(time_scale = 3.0)
env.reset()
# 获取环境信息
behavior_names = list(env.behavior_specs.keys())
behavior_value = list(env.behavior_specs.values())
for i in range(len(behavior_names)):
    print(behavior_names[i])
    print("obs:",behavior_value[i].observation_specs[0], "   act:", behavior_value[0].action_spec)
discrete_actions = None
total_steps = 0
stepsNum = 0
obs_space = behavior_value[i].observation_specs[0]
act_space = behavior_value[i].action_spec.continuous_size
# 建立Actor Critic模型
model = GenenalModel_Continuous_Divide(obs_space, act_space, [256,128], [256,128])
config = genenal_config_continuous
config['batch_size'] = int(config['env_num'] * config['step_nums'])
config['num_updates'] = int(
    config['train_total_steps'] // config['batch_size'])
# 建立PPO算法
ppo = PPO(
        model,
        clip_param=config['clip_param'],
        entropy_coef=config['entropy_coef'],
        initial_lr=config['initial_lr'],
        continuous_action=config['continuous_action'])
agent = PPOAgent(ppo, config)
# 建立经验池
rollout = RolloutStorage(config['step_nums'], config['env_num'], obs_space,
                         act_space)

DecisionSteps, TerminalSteps = env.get_steps(behavior_names[0])
obs = DecisionSteps.obs[0]
agentsNum = len(DecisionSteps)
done = np.zeros(agentsNum, dtype='float32')
total_reward = np.zeros(agentsNum, dtype='float32')
this_action = np.zeros((agentsNum, act_space), dtype='float32')
next_obs = np.zeros((agentsNum, obs_space.shape[0]), dtype='float32')
for update in range(1, config['num_updates'] + 1):
    # 数据收集
    for step in range(0, config['step_nums']):
        value, action, logprob, _ = agent.sample(obs)
        agentsNumNow = len(DecisionSteps)
        if agentsNumNow == 0:
            action = np.random.rand(0, 2)
        else:
            action = action.reshape(agentsNumNow, act_space)
            this_action = action
        actions = ActionTuple(action, discrete_actions)
        env.set_actions(behavior_names[0], actions)
        env.step()
        DecisionSteps, TerminalSteps = env.get_steps(behavior_names[0])
        next_obs_Decision = DecisionSteps.obs[0]
        next_obs_Terminal = TerminalSteps.obs[0]
        if(len(next_obs_Terminal) != 0):
            next_obs = np.zeros((agentsNum, obs_space.shape[-1]))
            rewards = np.zeros(agentsNum, dtype=float)
            next_done = np.zeros(agentsNum, dtype=bool)
            j = 0
            for i in TerminalSteps.agent_id:
                next_obs[i] = next_obs_Terminal[j]
                rewards[i] = TerminalSteps.reward[j]
                next_done[i] = True
                j += 1
            rollout.append(obs, this_action, logprob, rewards, done, value.flatten())
            obs, done = next_obs, next_done
            total_reward += rewards

        if(len(next_obs_Decision) != 0):
            step += 1
            next_obs = next_obs_Decision
            rewards = DecisionSteps.reward
            next_done = np.zeros(agentsNum, dtype=bool)

            rollout.append(obs, this_action, logprob, rewards, done, value.flatten())
            obs, done = next_obs, next_done
            total_reward += rewards

        total_steps += 1
        stepsNum += 1
        if(stepsNum % 200 == 199):
            arv_reward = total_reward / 200
            print("total_steps:{0}".format(total_steps))
            print("arv_reward:", arv_reward)
            stepsNum = 0
            total_reward = 0
    # PPO训练模型
    value = agent.value(obs)
    rollout.compute_returns(value, done)    
    value_loss, action_loss, entropy_loss, lr = agent.learn(rollout)


env.close()


源码链接

https://github.com/tianjuehai/mlagents-ppo文章来源地址https://www.toymoban.com/news/detail-417429.html

到了这里,关于ML-Agents与自己的强化学习算法通讯——PPO篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 强化学习 Proximal Policy Optimization (PPO)

    参考: 李宏毅老师课件 PPO: Default reinforcement learning algorithm at OpenAI PPO = Policy Gradient 从 On-policy 到 Off-policy, 再加一些constraint Actor: 动作执行者(智能体) Env: 环境 Reward Function: 奖励函数 Policy (pi) : a network with parameter (theta) . Input: 当前的 Env. Output: actor 要采取的下一个 action 的分

    2024年02月11日
    浏览(48)
  • ChatGPT强化学习大杀器——近端策略优化(PPO)

    近端策略优化 ( P roximal P olicy O ptimization)来自 Proximal Policy Optimization Algorithms (Schulman et. al., 2017)这篇论文,是当前最先进的强化学习 (RL) 算法。这种优雅的算法可以用于各种任务,并且已经在很多项目中得到了应用,最近火爆的ChatGPT就采用了该算法。 网上讲解ChatGPT算法

    2024年01月21日
    浏览(52)
  • 【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码

    大家好,今天和各位分享一下深度强化学习中的 近端策略优化算法 (proximal policy optimization, PPO ),并借助 OpenAI 的 gym 环境完成一个小案例,完整代码可以从我的 GitHub 中获得: https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model PPO 算法之所以被提出,根本原因在于 Polic

    2023年04月08日
    浏览(54)
  • 强化学习PPO从理论到代码详解(1)--- 策略梯度Policy gradient

    Proximal Policy Optimization(PPO) 近端策略优化,可以说是目前最稳定,最强的强化学习算法之一了,也是openAI默认的强化学习算法,有多叼不用我说了吧。 笔者在强化学习的道路上看来很多书,看了很多代码,和很多大佬的博客,只是很多都是侧重一个方面,所以我在吸取百家之

    2024年02月07日
    浏览(46)
  • MindSpore强化学习:使用PPO配合环境HalfCheetah-v2进行训练

    本文分享自华为云社区《MindSpore强化学习:使用PPO配合环境HalfCheetah-v2进行训练》,作者: irrational。 半猎豹(Half Cheetah)是一个基于MuJoCo的强化学习环境,由P. Wawrzyński在“A Cat-Like Robot Real-Time Learning to Run”中提出。这个环境中的半猎豹是一个由9个链接和8个关节组成的2D机

    2024年04月29日
    浏览(48)
  • Unity-ML-Agents安装

    目录 1.下载ML-Agents  1.1 前往官网  1.2 选择版本  1.3 下载文件 2.下载Anaconda 3.虚拟环境 3.1 构建虚拟环境 3.2 创建项目,导入package.json 3.2.1 创建项目,导入package.json 3.2.2 导入成功 3.2.3 将模板项目拖入unity项目中 3.3 开始训练  3.3.1 开始训练 3.3.2 选择场景 3.3.3 利用训练结果  

    2024年02月10日
    浏览(34)
  • 关于最新版本的unity-ml-agents配置

    耗时三天(本人太菜)终于把unity的ml-agents环境搭建好了,几次都几近崩溃,在此给大家一些建议,避免大家少走弯路,首先注意**一定要用git clone下载ml-agents,一定要用git clone下载ml-agents,一定要用git clone下载ml-agents**,这个其他博客或者视频很少有提醒的,听我的没错,你下

    2023年04月08日
    浏览(43)
  • Unity-ML-Agents-Food Collector环境-FoodCollectorSettings.cs

    Recording Statistics:https://github.com/Unity-Technologies/ml-agents/blob/release_19/docs/Learning-Environment-Design.md#recording-statistics 环境链接:https://github.com/Unity-Technologies/ml-agents/tree/release_19/Project/Assets/ML-Agents/Examples/FoodCollector 官方链接:https://github.com/Unity-Technologies/ml-agents/blob/release_19/Project/As

    2024年02月06日
    浏览(39)
  • Unity-ML-Agents--Custom-SideChannels.md-代码解析

    官方文档: https://github.com/Unity-Technologies/ml-agents/blob/release_19/docs/ML-Agents-Overview.md#additional-features https://github.com/Unity-Technologies/ml-agents/blob/release_19/docs/Custom-SideChannels.md 目录 1.Unity C# 示例 1.1 StringLogSideChannel类 1.1.1 ChannelId = new Guid(\\\"621f0a70-4f87-11ea-a6bf-784f4387d1f7\\\"); 1.1.2 protected o

    2024年02月05日
    浏览(40)
  • Unity-ML-Agents注意事项及报错、警告等解决方式

    在 ml-agents 0.16.0 版本中,Unity 中的 ML-Agents 插件中包含了名为 Brain 的组件,用于控制智能体的决策过程。然而,在 ml-agents 0.28.0 版本中,该组件已经被重构为 IAgent 接口和 Agent 类。因此,如果您正在使用 ml-agents 0.28.0 或更高版本,您不会在 Unity 的 \\\"Add Component\\\" 菜单中找到 Br

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包