Stable Baselines3 (SB3) 是 PyTorch 中强化学习算法的一组可靠实现。它将一些算法打包,使得我们做强化学习时不需要重写网络架构和训练过程,只需要实例化算法、模型并且训练就可以了。
1、Import Dependencies
!pip install stable-baselines3[extra]
import os
import gym
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv
from stable_baselines3.common.evaluation import evaluate_policy
DummyVecRnv 用于将
evaluate_policy 使我们更容易测试环境是如何表现的
2、Environment
使用OpenAIGym,如果是自定义的环境,后面会讲如何将自定义环境转化为Gym类型的环境,但我们先用Gym中的
OpenAI Gym Spaces:动作和环境都是以向量的形式表现,由不同表现形式的向量组成不同的空间,有如下几种类型
Box:n维张量,是一些值的范,如:Box(0, 1, shape=(3, 3))表示形状为3x3的空间,空间中最小值为0,最大值为1
Discrete:离散值的集合,如:Discrete(3)表示取值可以为0,1,2
Tuple:其他空间的元组,可以将Box,Discrete组成元组,如Tuple(Discrete(2), Box(0, 100, shape=(1, ))),但是stable-baselines3不支持Tuple,可以用Dict代替。
Dict:空间的字典,如Dict({'height':Discrete(2), 'speed':Box(0, 100, shape=(1,))})
MultiBinary:独热编码二进制值,如MultiBinary(4)表示一个有4个位置的列表,每个位置可以取0或1
MultiDiscrete:如MultiDiscrete([5, 2, 2]),第一个位置可以取0,1,2,3,4;第二个位置可以取0,1…
我们用CartPole-v0为例,看看如何Load Environment
environment_name = 'CartPole-v0'
env = gym.make(environment_name)
运行环境:
episodes = 5 # 游戏轮次数为5
for episode in range(1, episodes+1):
state = env.reset() # 游戏初始化,返回初始游戏状态
done = False # done判断游戏是否结束
score = 0 # score存储每一轮游戏的总分数
while not done:
env.render() # 渲染游戏画面
action = env.action_space.sample() # 按照游戏的动作空间随机抽样(动作空间的类型和大小是事先定好的,只要是动作空间中的一个向量,都可以作为游戏的输入)
n_state, reward, done, info = env.step(action) # 游戏向前迈进一步,返回当前状态,当前这步的奖励,游戏是否结束,以及其他信息
score += reward
env.close() # 关闭游戏环境
理解环境:
env.action_space # 返回动作空间类型,如:Discrete(2)
env.observation_space # 返回环境空间
env.action_space.sample() # 从动作空间中随机取一个向量
env.observation_space.sample() # 从环境空间中随机取一个向量
3、Training
截至做笔记的时候,SB3已经有了以下算法,应该根据你所需要的动作空间和环境空间选择适合的算法。

在训练过程中,在一定步数后会产生一个Training Metrics,用来储存训练过程中的结果,下图是A2C的Training Metrics,我们接下来看一下这些都是什么意思

ep_len_mean:表示平均每一轮的步数
ep_rew_mean:表示平均每一轮的奖励
fps:表示每秒钟运行的帧数
iteration:迭代次数
time_elapsed:运行时间
total_timesteps:总共运行步数
entropy_loss:熵损失
explained_variance:解释方差
learning_rate:策略更新的速度
n_updates:总的更新次数
policy_loss:策略损失
value_loss:价值损失
4、Train an RL Model
log_path = os.path.join('Training','logs') # 用于保存我们的TensorBoard,从而监视我们的训练过程,确保路径是存在的
env = gym.maek(environment_name)
env = DummyVecEnv([lambda: env]) # 将非矢量环境包装为矢量环境
model = PPO('MlpPolicy', env, verbose=1, tensorboard_log=log_path)
SB3有3种策略,‘MlpPolicy’,‘CnnPolicy’,‘MoltiInputPolicy’,不同的策略告诉Agent应该如何在环境中运行
verbose是其他的一些赘言,若为0,则无输出;若为1,则输出信息,若为2,则debug
tensorboard_log为tensorboard log 的储存地点
model.train(total_timestep=20000) # 模型训练20000次
5、Save and Reload Model
PPO_Path = os.path.join('Training', 'Saved Models', 'PPO_Model_Cartpole')
model.save(PPO_Path) # 将模型保存到指定路径
model = PPO.load(PPO_path, env=env) # 从指定路径中加载模型
6、Evaluation
evaluate_policy(model, env, n_eval_episodes=10, render=True) # 返回总平均奖励和标准偏差
n_eval_episodes指用多少轮来进行评估,若等于10,则是取10轮的平均数
render表示评估时是否需要展示画面
若要使用训练model,首先运行环境的代码需要改一下,这里我们不再使用随机的动作空间取样,而是用model来预测动作。
episodes = 5 # 游戏轮次数为5
for episode in range(1, episodes+1):
obs = env.reset()

本文是基于Stable-Baselines3的强化学习教程笔记,涵盖环境设置、训练、模型保存与加载、Tensorboard日志查看、回调函数及策略更换等内容,并通过Atari游戏、自动驾驶及自定义环境的3个实例进行深入讲解。
最低0.47元/天 解锁文章
588

被折叠的 条评论
为什么被折叠?



