写点什么

MindSpore 强化学习:使用 PPO 配合环境 HalfCheetah-v2 进行训练

  • 2024-04-29
    广东
  • 本文字数:2716 字

    阅读完需:约 9 分钟

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 机器人(包括两个爪子)。在这个环境中,目标是通过施加扭矩在关节上使猎豹尽可能快地向前(向右)奔跑,正向奖励基于前进的距离,而向后移动则会得到负向奖励。猎豹的躯干和头部是固定的,扭矩只能施加在前后大腿、小腿和脚上。


动作空间是一个Box(-1, 1, (6,), float32),其中每个动作代表链接之间的扭矩。观察空间包含猎豹不同身体部位的位置值和速度值,其中所有位置值在前,所有速度值在后。默认情况下,观察不包括猎豹质心 x 坐标,可以通过在构建时传递exclude_current_positions_from_observation=False来包括它。如果包括,观察空间将有 18 个维度,其中第一个维度代表猎豹质心的 x 坐标。


奖励分为两部分:向前奖励和控制成本。向前奖励是根据动作前后 x 坐标的变化计算的,控制成本是为了惩罚猎豹采取过大动作的成本。总奖励是向前奖励减去控制成本。


每个状态的开始是在状态(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,)上添加噪声以增加随机性。前 8 个值是位置值,最后 9 个值是速度值。位置值添加均匀噪声,而初始速度值(全为零)添加标准正态噪声。


当一个剧集的长度超过 1000 时,该剧集将被截断。


该环境的详细信息可以参考:https://www.gymlibrary.dev/environments/mujoco/half_cheetah/



这个比很多环境都要复杂。


不过没关系,我们有 ppo 算法,这个算法可以跑强化学习,甚至大语言模型。


PPO(Proximal Policy Optimization)算法是一种用于强化学习的策略优化方法,它旨在解决传统策略梯度方法(如 TRPO,Trust Region Policy Optimization)中的信任区域问题。


PPO 算法通过引入 clipping 技巧和重要性采样技巧来减少计算梯度时的方差,从而提高算法的收敛速度和稳定性。


在 PPO 算法中,有两个关键概念:


  • 策略(Policy):策略是一个函数,它定义了在给定状态 s 时采取动作 a 的概率分布。

  • 价值函数(Value Function):价值函数估计了在给定策略下,从状态 s 出发,到达某个特定状态或终端时所能获得的期望回报。


PPO 算法的主要步骤包括:


  • 采样(Sampling):从当前策略中采样数据,包括状态、动作、奖励和下一个状态。

  • 计算目标(Calculating Targets):使用目标策略计算目标价值函数,并计算目标策略的 KL 散度。

  • 更新策略(Updating Policy):使用重要性采样技巧和 clipping 技巧更新策略。

  • 更新价值函数(Updating Value Function):使用策略梯度方法更新价值函数。


PPO 算法的核心思想是交替更新策略和价值函数,以实现策略和价值的共同优化。这种方法可以有效减少计算梯度时的方差,提高算法的收敛速度和稳定性。


以下是 PPO 算法的一个简化的 Markdown 公式:


# Proximal Policy Optimization (PPO) Algorithm## 1. Sampling采样当前策略的数据,包括状态 $ s $、动作 $ a $、奖励 $ r $ 和下一个状态 $ s' $。## 2. Calculating Targets使用目标策略计算目标价值函数,并计算目标策略的KL散度。## 3. Updating Policy使用重要性采样技巧和clipping技巧更新策略。## 4. Updating Value Function使用策略梯度方法更新价值函数。## 重复步骤1-4,实现策略和价值的共同优化。
复制代码


这个公式是一个简化的版本,实际上 PPO 算法还包括了许多其他细节和技巧,如经验回放、动态调整学习率等。


import argparseimport os
from mindspore import contextfrom mindspore import dtype as mstypefrom mindspore.communication import get_rank, init
import mindspore_rl.distribution.distribution_policies as DPfrom mindspore_rl.algorithm.ppo import configfrom mindspore_rl.algorithm.ppo.ppo_session import PPOSessionfrom mindspore_rl.algorithm.ppo.ppo_trainer import PPOTrainer
parser = argparse.ArgumentParser(description="MindSpore Reinforcement PPO")parser.add_argument("--episode", type=int, default=650, help="total episode numbers.")parser.add_argument( "--device_target", type=str, default="Auto", choices=["Ascend", "CPU", "GPU", "Auto"], help="Choose a device to run the ppo example(Default: Auto).",)parser.add_argument( "--precision_mode", type=str, default="fp32", choices=["fp32", "fp16"], help="Precision mode",)parser.add_argument( "--env_yaml", type=str, default="../env_yaml/HalfCheetah-v2.yaml", help="Choose an environment yaml to update the ppo example(Default: HalfCheetah-v2.yaml).",)parser.add_argument( "--algo_yaml", type=str, default=None, help="Choose an algo yaml to update the ppo example(Default: None).",)parser.add_argument( "--enable_distribute", type=bool, default=False, help="Train in distribute mode (Default: False).",)parser.add_argument( "--worker_num", type=int, default=2, help="Worker num (Default: 2).")parser.add_argument( "--graph_op_run", type=int, default=1, help="Run kernel by kernel (Default: 1).")options, _ = parser.parse_known_args()`
复制代码


wget https://www.roboti.us/download/mujoco200_linux.zipmv mujoco200_linux ~/.mujoco/mujoco200wget https://www.roboti.us/file/mjkey.txtcp mjkey.txt /home/kewei/.mujoco/mjkey.txtwget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/p/patchelf-0.12-1.el7.x86_64.rpmyum localinstall patchelf-0.12-1.el7.x86_64.rpmpip install 'mujoco_py==2.0.2.13'
复制代码


第一次编译 mujoco 会有一点久



在 bashrc 加入如下内容:


export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/.mujoco/mujoco200/binexport MUJOCO_KEY_PATH=~/.mujoco${MUJOCO_KEY_PATH}export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/kewei/.mujoco/mujoco210/binexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/nvidia
复制代码


然后就可以开启训练了。使用上一节的 with 保留输入。


# dqn_session.run(class_type=DQNTrainer, episode=episode)with RealTimeCaptureAndDisplayOutput() as captured_new:    ppo_session.run(class_type=PPOTrainer, episode=episode, duration=duration)
复制代码


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
MindSpore强化学习:使用PPO配合环境HalfCheetah-v2进行训练_人工智能_华为云开发者联盟_InfoQ写作社区