当前位置:   article > 正文

机器学习框架Ray -- 1.4 Ray RLlib的基本使用_rllib使用ppo

rllib使用ppo

1.什么是RLlib

RLlib是一种建立在Ray之上的行业级别的强化学习(RL)库。RLlib提供了高度可扩展性和统一的API,适用于各种行业和研究应用。

下面在Anaconda中创建Ray RLlib的环境。

  1. conda create -n RayRLlib python=3.7
  2. conda activate RayRLlib
  3. conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.3 -c pytorch
  4. pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
  5. pip install tensorflow-probability -i https://pypi.tuna.tsinghua.edu.cn/simple
  6. pip install ipykernel -i https://pypi.tuna.tsinghua.edu.cn/simple
  7. pip install pyarrow
  8. pip install gputil
  9. pip install "ray[rllib]" -i https://pypi.tuna.tsinghua.edu.cn/simple

选择上述RayLib作为解释器,导入gym环境与ray库。使用PPO算法,gym环境为自定义的。

  1. import gymnasium as gym
  2. from ray.rllib.algorithms.ppo import PPOConfig

2.定义一个类似于gym的小游戏类

定义了一个名为SimpleCorridor的自定义gym环境。在这个环境中,智能体需要学会向右移动以到达走廊的出口。智能体需要在走廊里移动以到达出口。S表示起点,G表示目标,走廊长度可配置。智能体可以选择的动作有0(左)和1(右)。观察值是一个浮点数,表示当前位置的索引。每一步的奖励值是-0.1,除非到达目标位置(奖励值+1.0)。

英文原版:
    Corridor in which an agent must learn to move right to reach the exit.

    ---------------------
    | S | 1 | 2 | 3 | G |   S=start; G=goal; corridor_length=5
    ---------------------

    Possible actions to chose from are: 0=left; 1=right
    Observations are floats indicating the current field index, e.g. 0.0 for
    starting position, 1.0 for the field next to the starting position, etc..
    Rewards are -0.1 for all steps, except when reaching the goal (+1.0).

 class定义如下

  1. # Define your problem using python and Farama-Foundation's gymnasium API:
  2. class SimpleCorridor(gym.Env):
  3. def __init__(self, config):
  4. # 初始化环境,包括设置结束位置、当前位置、动作空间(两个离散动作:左和右)和观察空间。
  5. self.end_pos = config["corridor_length"]
  6. self.cur_pos = 0
  7. self.action_space = gym.spaces.Discrete(2) # left and right
  8. self.observation_space = gym.spaces.Box(0.0, self.end_pos, shape=(1,))
  9. def reset(self, *, seed=None, options=None):
  10. # 重置环境,将当前位置设为0,并返回初始观察值。
  11. """Resets the episode.
  12. Returns:
  13. Initial observation of the new episode and an info dict.
  14. """
  15. self.cur_pos = 0
  16. # Return initial observation.
  17. return [self.cur_pos], {}
  18. def step(self, action):
  19. # 根据给定的动作在环境中执行一步操作。根据动作和当前位置更新智能体位置。
  20. # 当到达走廊末端(目标)时,设置terminated标志。
  21. # 当目标达成时,奖励为+1.0,否则为-0.1。
  22. # 返回新的观察值、奖励、terminated标志、truncated标志和信息字典。
  23. """Takes a single step in the episode given `action`.
  24. Returns:
  25. New observation, reward, terminated-flag, truncated-flag, info-dict (empty).
  26. """
  27. # Walk left.
  28. if action == 0 and self.cur_pos > 0:
  29. self.cur_pos -= 1
  30. # Walk right.
  31. elif action == 1:
  32. self.cur_pos += 1
  33. # Set `terminated` flag when end of corridor (goal) reached.
  34. terminated = self.cur_pos >= self.end_pos
  35. truncated = False
  36. # +1 when goal reached, otherwise -1.
  37. reward = 1.0 if terminated else -0.1
  38. return [self.cur_pos], reward, terminated, truncated, {}

3.基于PPO的强化学习训练

以下代码通过Ray RLlib创建了一个PPOConfig对象,并使用SimpleCorridor环境。设置环境配置,设置走廊长度为28。通过设置num_rollout_workers为10来并行化环境探索。通过配置构建PPO算法对象。

  1. config = (
  2. PPOConfig().environment(
  3. # Env class to use (here: our gym.Env sub-class from above).
  4. env=SimpleCorridor,
  5. # Config dict to be passed to our custom env's constructor.
  6. # Use corridor with 20 fields (including S and G).
  7. env_config={"corridor_length": 28},
  8. )
  9. # Parallelize environment rollouts.
  10. .rollouts(num_rollout_workers=10)
  11. )
  12. # Construct the actual (PPO) algorithm object from the config.
  13. algo = config.build()
  14. # 循环训练PPO算法20次迭代,输出每次迭代的平均奖励。
  15. for i in range(20):
  16. results = algo.train()
  17. print(f"Iter: {i}; avg. reward={results['episode_reward_mean']}")

通过上述代码进行强化学习训练,并行rollout workers为10个,训练迭代次数为20次。

训练过程中平均Reward输出如下。

  1. (RolloutWorker pid=334231) /home/yaoyao/anaconda3/envs/RayRLlib/lib/python3.7/site-packages/gymnasium/spaces/box.py:227: UserWarning: WARN: Casting input x to numpy array.
  2. ...
  3. Iter: 0; avg. reward=-24.700000000000117
  4. Iter: 1; avg. reward=-29.840909090909282
  5. ...
  6. Iter: 18; avg. reward=-1.7286713286713296
  7. Iter: 19; avg. reward=-1.7269503546099298

4.验证模型

在走廊环境中执行一个完整的episode。从初始观察值开始,使用算法计算一个动作,将动作应用于环境并获得新的观察值、奖励、terminated标志和truncated标志。累积奖励并在循环结束时输出总奖励。

  1. # 在训练完成后,使用训练好的算法在新的走廊环境(长度为10)中进行推理
  2. env = SimpleCorridor({"corridor_length": 10})
  3. # 首先初始化环境并获得初始观察值。
  4. terminated = truncated = False
  5. total_reward = 0.0
  6. # 玩1个回合
  7. while not terminated and not truncated:
  8. # Compute a single action, given the current observation
  9. # from the environment.
  10. action = algo.compute_single_action(obs)
  11. # Apply the computed action in the environment.
  12. obs, reward, terminated, truncated, info = env.step(action)
  13. # Sum up rewards for reporting purposes.
  14. total_reward += reward
  15. # 结果输出
  16. print(f"Played 1 episode; total-reward={total_reward}")

经过训练获得的模型在指定环境中验证,其最终获得的奖励为+0.1,相比较初始的-24有明显进步。

Played 1 episode; total-reward=0.10000000000000009

由于本案例中,长廊长度为10,Agent采取最优策略(一直向右行走),能够获得的最大奖励为Rmax=9\times \left ( -0.1 \right )+\left ( +1 \right )=+0.1

可以说明,Agent通过PPO算法已经学会了最优策略。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/236035
推荐阅读
相关标签
  

闽ICP备14008679号