强化学习系列之翻译OpenAI用户手册(二)

强化学习系列文章

第一章 强化学习入门

第二章 翻译OpenAI用户手册(一)

第三章 翻译OpenAI用户手册(二)


目录

用户手册

4.运行试验

4.1 从命令行中启动

4.2 从命令行中选择PyTorch或者Tensorflow

4.3 从命令行中设置超参数

4.4 一次性启动多个试验

4.5 特殊的标志

4.6 结果存在哪里

4.7 后缀是如何确定的?

4.8 额外的

4.9 从脚本中运行

4.10 使用ExperimentGrid

5.试验输出

5.1 算法输出

5.2 PyTorch存储目录索引

5.3 Tensorflow存储目录索引

5.4 存储目录地址

5.5 加载和运行训练好的策略

5.6 环境未找到错误

5.7 使用训练的值函数

6.绘制结果


用户手册

4.运行试验

感受深度强化学习的最好方法之一是运行算法,看看它们在不同任务上的执行情况。“玩转”的代码库使小规模(本地)试验变得很容易,在本节中,我们将讨论运行它们的两种方法:从命令行或通过脚本中的函数调用。

4.1 从命令行中启动

“玩转”使用 spinup/run.py工具。这是一个方便的工具,允许您从命令行轻松地启动任何算法(包含任何超参数选择)。它还充当用于监视训练了的策略和绘图的实用程序的薄包装器,尽管我们将不在此页上讨论该功能(有关详细信息,请参阅有关实验输出和绘图的页面)。

从命令行运行“玩转”算法的标准方法是:

python -m spinup.run [algo name] [experiment flags]

示例如下:

python -m spinup.run ppo --env Walker2d-v2 --exp_name walker

你应该知道的:

如果您正在使用ZShell: ZShell将方括号解释为特殊字符。“玩转”在命令行参数中使用了方括号;确保对它们进行转义,如果您想在缺省情况下转义它们,请尝试这里推荐的解决方案。

详细的快速指导:

python -m spinup.run ppo --exp_name ppo_ant --env Ant-v2 --clip_ratio 0.1 0.2
    --hid[h] [32,32] [64,32] --act torch.nn.Tanh --seed 0 10 20 --dt
    --data_dir path/to/data

在 Ant-v2的Gym环境中运行PPO,各种设置由标志控制。

默认情况下,PyTorch版本将运行(除了TRPO,因为“玩转”至今还没有PyTorch TRPO)。使用ppo_tf1替换Tensorflow版本的ppo。

clip_ratio、hid和act是设置一些算法超参数的标志。您可以为超参数提供多个值来运行多个实验。检查文档,查看可以设置哪些超参数(单击这里查看PPO文档)

hid和act是为算法训练的神经网络设置隐藏大小和激活函数的特殊快捷标志

seed标志为随机数生成器设置种子。深度强化学习算法有很大的差异,所以尝试多个种子来感受性能的变化。

dt标志确保保存目录名中有时间戳(否则没有,除非在spinup/user_config.py中设置FORCE_DATESTAMP=True)。

data_dir标志允许您设置结果的保存文件夹。默认值是由spinup/user_config中的DEFAULT_DATA_DIR设置的。它将是spinningup文件夹中的一个子文件夹数据(除非您更改它)。

保存目录名称基于exp_name和任何具有多个值的标志。在目录名中将出现一个简写,而不是完整标志。用户可以在标志后面的方括号中提供缩略词,如——hid[h];否则,缩略符就是标志的子字符串(clip_ratio变为cli)。为了说明这一点,运行clip_ratio=0.1、hid=[32,32]和seed=10时的保存目录为:

path/to/data/YY-MM-DD_ppo_ant_cli0-1_h32-32/YY-MM-DD_HH-MM-SS-ppo_ant_cli0-1_h32-32_seed10

4.2 从命令行中选择PyTorch或者Tensorflow

使用PyTorch版本的一个算法,运行:

python -m spinup.run [algo]_pytorch

使用一个Tensorflow版本的算法,运行:

python -m spinup.run [algo]_tf1

如果在不使用_pytorch或_tf1的情况下运行python -m spinup.run [algo],运行器将在spinup/user_config.py中查找该算法的默认版本。

4.3 从命令行中设置超参数

每个算法中的每个超参数都可以通过命令行直接控制。如果kwarg是算法的函数调用的有效关键字arg,则可以使用标志——kwarg为其设置值。要了解哪些关键字参数是可用的,可以查看文档页面中的算法,也可以尝试一下

python -m spinup.run [algo name] --help

查看文档字符串的读出。

你应该知道的:

值在使用之前通过eval()传递,因此可以直接从命令行描述一些函数和对象。例如:

python -m spinup.run ppo --env Walker2d-v2 --exp_name walker --act torch.nn.ELU

torch.nn.ELU作为激活函数。(Tensorflow等效:使--act tf.nn.elu运行ppo_tf1)

你应该知道的:

对于接受dict值的kwarg有一些很好的处理。而不是必须提供

--key dict(v1=value_1, v2=value_2)

你能提供:

--key:v1 value_1 --key:v2 value_2

得到相同的结果。

4.4 一次性启动多个试验

只需为给定的参数提供多个值,就可以启动多个实验,然后依次执行。(将对每种可能的价值组合进行实验。)

例如,要使用不同的随机种子(0、10和20)启动其他等价的运行,请执行:

python -m spinup.run ppo --env Walker2d-v2 --exp_name walker --seed 0 10 20

实验不能并行启动,因为它们消耗了足够的资源,同时执行几个实验无法得到加速。

4.5 特殊的标志

一些标志受到特殊处理。

环境标志:

--env--env_name

字符串。所有的“玩转”算法都实现为接受env_fn作为参数的函数,其中env_fn必须是一个构建强化学习环境副本的可调用函数。由于最常见的用例是Gym环境,但是,所有这些环境都是通过Gym.make(env_name)构建的,所以我们允许您在命令行中指定env_name(简称env),它将被转换为一个lambda函数,用于构建正确的健身房环境。

快捷键标志:

有些算法参数相对较长,我们为它们启用了快捷方式:

--hid--ac_kwargs:hidden_sizes

整数的列表。设置神经网络中隐藏层的大小(策略和值函数)。

--act--ac_kwargs:activation

tf操作。神经网络的激活函数在actor and critic中。

这些标志对所有当前的“玩转”算法都有效。

配置标志

这些标志不是任何算法的超参数,而是以某种方式改变实验配置。

--cpu--num_cpu

如果设置了这个标志,那么实验就会启动这么多进程,每个cpu一个进程,通过MPI连接。有些算法适合这种并行化,但不是全部。如果尝试为不兼容的算法设置num_cpu > 1,将引发错误。您还可以设置--num_cpu auto,它将自动使用机器上可用的所有cpu。

--exp_name

字符串。实验名称。这用于为每个实验命名保存目录。默认是“cmd”+[算法名称]。

--data_dir

路径。设置此实验或实验集的基本保存目录。如果没有给出,将使用spinup/user_config.py中的DEFAULT_DATA_DIR。

--datestamp

bool类型,在实验保存目录的名称中包括日期和时间。

4.6 结果存在哪里

特定实验的结果(超参数配置的一次运行)存储在:

data_dir/[outer_prefix]exp_name[suffix]/[inner_prefix]exp_name[suffix]_s[seed]

这里:

  • data_dir是--data_dir标志的值(如果没有--data_dir,则默认为来自spinup/user_config.py的DEFAULT_DATA_DIR),
  • 如果触发了--datestamp标志,那么outer_prefix是一个YY-MM-DD_时间戳,否则什么都没有,
  • 如果触发了--datestamp标志,inner_prefix是一个YY-MM-DD_HH-MM-SS-时间戳,否则什么都没有,
  • 后缀是基于实验超参数的特殊字符串。

4.7 后缀是如何确定的?

只有在一次运行多个实验时才会包含后缀,而且它们只包含对不同实验之间不同的超参数的引用,随机种子除外。目标是确保类似实验的结果(共享除种子之外的所有参数)被分组在同一个文件夹中。

后缀是通过结合超参数的缩写和它们的值来构造的,其中的缩写是1)从超参数名自动构造的,或者2)由用户提供的。用户可以通过在kwarg标志后面使用方括号来提供速记。

例如,考虑:

python -m spinup.run ddpg_tf1 --env Hopper-v2 --hid[h] [300] [128,128] --act tf.nn.tanh tf.nn.relu

在这里,--hid标志被赋予一个用户提供的简写,h。--act标志没有被用户赋予简写,所以会自动为它构造一个。

在这种情况下产生的后缀是:

_h128-128_ac-actrelu
_h128-128_ac-acttanh
_h300_ac-actrelu
_h300_ac-acttanh

注意,h是由用户给出的。ac-act简写是由ac_kwargs:activation (act标志的真实名称)构造的。

4.8 额外的

你实际上不需要知道这个

每个单独的算法都位于一个文件spinup/algos/BACKEND/ALGO_NAME/ALGO_NAME.py中。这些文件可以直接在命令行中使用有限的一组参数运行(其中一些参数与可用于spinup/run.py的参数不同)。不过,单个算法文件中的命令行支持基本上已经过时,因此不推荐使用这种方法来进行实验。

这个文档页面将不描述那些命令行调用,只描述通过spinup/run.py进行的调用。

4.9 从脚本中运行

每个算法都是作为python函数实现的,可以直接从“玩转”包导入,即:

>>> from spinup import ppo_pytorch as ppo

请参阅每个算法的文档页面,以获得可能的参数的完整说明。这些方法可以用来设置专门的自定义实验,例如:

from spinup import ppo_tf1 as ppo
import tensorflow as tf
import gym

env_fn = lambda : gym.make('LunarLander-v2')

ac_kwargs = dict(hidden_sizes=[64,64], activation=tf.nn.relu)

logger_kwargs = dict(output_dir='path/to/output_dir', exp_name='experiment_name')

ppo(env_fn=env_fn, ac_kwargs=ac_kwargs, steps_per_epoch=5000, epochs=250, logger_kwargs=logger_kwargs)

4.10 使用ExperimentGrid

在机器学习研究中,使用多个可能的超参数运行同一个算法通常很有用。用一种叫做“ExperimentGrid”的简单工具和“玩转”结合起来。

考虑一下spinup/examples/pytorch/bench_ppo_cartpole.py中的例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 from spinup.utils.run_utils import ExperimentGrid
 from spinup import ppo_pytorch
 import torch

 if __name__ == '__main__':
     import argparse
     parser = argparse.ArgumentParser()
     parser.add_argument('--cpu', type=int, default=4)
     parser.add_argument('--num_runs', type=int, default=3)
     args = parser.parse_args()

     eg = ExperimentGrid(name='ppo-pyt-bench')
     eg.add('env_name', 'CartPole-v0', '', True)
     eg.add('seed', [10*i for i in range(args.num_runs)])
     eg.add('epochs', 10)
     eg.add('steps_per_epoch', 4000)
     eg.add('ac_kwargs:hidden_sizes', [(32,), (64,64)], 'hid')
     eg.add('ac_kwargs:activation', [torch.nn.Tanh, torch.nn.ReLU], '')
     eg.run(ppo_pytorch, num_cpu=args.cpu)

(在spinup/examples/tf1/bench_ppo_cartpole.py中有一个等效的Tensorflow示例。)

在完成ExperimentGrid 对象的制作后,添加参数

eg.add(param_name, values, shorthand, in_name)

其中in_name强制在实验名称中出现一个参数,即使它在所有实验中具有相同的值。
添加完所有参数后,

eg.run(thunk, **run_kwargs)

通过将配置作为kwargs提供给函数thunk,在网格中运行所有实验(每个有效配置一个实验)。 ExperimentGrid.run使用一个名为call_experiment的函数来启动thunk, **run_kwargs为call_experiment指定行为。有关详细信息,请参阅文档页面。

除了没有快捷的kwargs (ac_kwargs不能为ac_kwargs:hidden_sizes使用hid在ExperimentGrid中),实验网格的基本行为与命令行运行是相同的。(事实上,spinup.run在幕后使用了一个 ExperimentGrid 。)

5.试验输出

在这个部分我们介绍了:

  • “玩转”算法实现的输出是什么,
  • 它们以什么格式存储以及如何组织,
  • 它们储存在哪里以及你如何改变它们,
  • 以及如何加载和运行训练策略。

你应该知道的:

“玩转”的实现目前无法恢复部分训练的智能体的训练。如果你认为这个特性很重要,请让我们知道——或者认为它是一个黑客项目!

5.1 算法输出

每个算法的设置都是为了保存训练运行的超参数配置、学习进度、经过训练的agent和值函数,以及如果可能的话,环境的副本(以便于同时加载agent和环境)。输出目录包含以下内容:

pyt_save/ 只有PyTorch实现。一个目录包含
一切都是为了恢复受过训练的智能体和值
函数。(PyTorch保存细节如下。)
tf1_save/ 只有Tensorflow实现。一个目录包含
一切都是为了恢复受过训练的智能体和值
函数。(Tensorflow详细信息保存在下面。)
config.json 一种字典,包含尽可能完整的描述
的用来启动训练的arg和kwarg
函数。如果你传入了一些不可能
序列化为JSON的东西,它应该可以很好地由
日志程序解决,且配置文件将用字符串表示它。
注:此仅用于记录保存。启动一个
目前不支持从配置文件启动实验。
progress.txt 一个标签分隔的值文件,包含度量的记录
在整个培训过程中由记录器记录。例如,

Epoch,AverageEpRet等等。

vars.pkl 一个pickle文件,包含算法状态的任何内容
应该被存储。目前,所有算法只使用
这个保存环境的一个副本。

你应该知道的:

有时,由于环境不能被腌制,且vars.pkl为空,导致环境保存失败。在旧版本的Gym Box2D环境中,这是一个问题,它不能以这种方式保存。

你应该知道的:

从1/30/20开始,保存目录结构略有变化。之前,Tensorflow图保存在simple_save/文件夹中;这已经被替换为tf1_save/。

你应该知道的:

这里唯一一个你必须手动使用的文件是config.json文件。我们的智能体测试程序将从tf1_save/或pyt_save/目录加载内容,绘图器将解释progress.txt的内容,这些是与这些输出接口交互的正确工具。但是没有用于config.json的工具——它就在那里,如果你忘记了你用什么超参数进行实验,你可以再次检查。

5.2 PyTorch存储目录索引

pyt_save 目录包含:

model.pt   ——torch.save创建的文件。本质上就是一个PyTorch nn.Module。加载它会恢复一个受过训练的智能体,作为一个ActorCritic对象带有一个act方法。

5.3 Tensorflow存储目录索引

tf1_save 目录包含:

variables/——包含Tensorflow存储程序输出的目录。请参阅Tensorflow SavedModel文档。

model_info.pkl——包含信息的dict(从键到张量名的映射)这可以帮助我们在加载后解压保存的模型。

saved_model.pb——协议缓冲区,用于Tensorflow SavedModel。

5.4 存储目录地址

实验结果默认保存在与“玩转”包相同的目录中,保存在data文件夹中:

spinningup/
    data/
        ...
    docs/
        ...
    spinup/
        ...
    LICENSE
    setup.py

你能通过定义在spinup/user_config.py中的DEFAULT_DATA_DIR改变默认的地址。

5.5 加载和运行训练好的策略

如果环境存储成功

对于环境与智能体一起被成功保存的情况,可以很容易地看到经过训练的智能体在环境中的行为,使用:

python -m spinup.run test_policy path/to/output_directory

这里有几个标志可以选择:

-l L--len=Ldefault=0

int.测试集/轨迹/推出的最大长度。缺省值为0意味着没有最大集长度——集只有在智能体在环境中达到终端状态时才会结束。(注意:设置L=0并不会阻止被TimeLimit包装器包装的Gym env是在达到预先设定的最大集长后结束。)

-n N--episodes=Ndefault=100

要为其运行智能体的测试集。

-nr--norender

不要将测试片段呈现到屏幕上。在本例中,test_policy将只打印集返回值和长度。(用例:渲染器降低了测试过程的速度,而您只是想快速了解代理是如何执行的,因此不必特别关注它。)

-i I--itr=Idefault=-1

int.这是一种特殊情况的选项,在这个包中,算法不支持这种情况,但是可以很容易地修改它。用例:有时候从训练中的许多不同的点观察训练过的代理是很好的(例如观察迭代50、100、150等)。日志记录器可以做到这一点——从这些不同的点保存代理的快照,以便以后可以运行和监视它们。在本例中,您使用此标志来指定要运行的迭代。但同样:自启动算法在默认情况下只保存最近代理的快照,覆盖旧的快照。

此标志的默认值表示“使用最新快照”。

要修改一个算法,使它产生多个快照,请找到下面一行(在所有算法中都有):

logger.save_state({'env': env}, None)

且调整为:

logger.save_state({'env': env}, epoch)

确保随后还将save_freq设置为合理的值(因为如果默认值为1,那么对于每个快照,您将用一个save 文件夹填充您的输出目录——这会增加得很快)。

-d--deterministic

另一种特殊情况,只用于SAC。自旋SAC执行训练一个随机策略,但用动作分布的确定性均值来评估。test_policy将默认使用SAC训练的随机策略,但是您应该设置确定性标志来监视确定性均值策略(SAC的正确评估策略)。此标志不用于任何其他算法。

5.6 环境未找到错误

如果环境没有成功保存,那么可以预期test_policy.py将崩溃,其结果如下所示

Traceback (most recent call last):
  File "spinup/utils/test_policy.py", line 153, in 
    run_policy(env, get_action, args.len, args.episodes, not(args.norender))
  File "spinup/utils/test_policy.py", line 114, in run_policy
    "and we can't run the agent in it. :( nn Check out the readthedocs " +
AssertionError: Environment not found!

 It looks like the environment wasn't saved, and we can't run the agent in it. :(

 Check out the readthedocs page on Experiment Outputs for how to handle this situation.

在这种情况下,查看智能体的表现可能会有点痛苦,但也不是不可能,只要您可以轻松地重新创建环境。在IPython中尝试以下方法:

>>> from spinup.utils.test_policy import load_policy_and_env, run_policy
>>> import your_env
>>> _, get_action = load_policy_and_env('/path/to/output_directory')
>>> env = your_env.make()
>>> run_policy(env, get_action)
Logging data to /tmp/experiments/1536150702/progress.txt
Episode 0    EpRet -163.830      EpLen 93
Episode 1    EpRet -346.164      EpLen 99
...

5.7 使用训练的值函数

test_policy.py工具不能帮助您查看经过训练的值函数,如果您想使用这些值函数,就必须手工进行一些挖掘。对于PyTorch情况,用 torch.load保存模型文件且检查每个算法的文档,以查看ActorCritic对象有哪些模块。对于Tensorflow来说,使用restore_tf_graph函数加载保存的计算图,并检查每个算法的文档,查看保存了哪些函数。

6.绘制结果

“玩转”与一个简单的绘图工具一同解释结果。运行该程序:

python -m spinup.run plot [path/to/output_directory ...] [--legend [LEGEND ...]]
    [--xaxis XAXIS] [--value [VALUE ...]] [--count] [--smooth S]
    [--select [SEL ...]] [--exclude [EXC ...]]

位置参数:

logdir

字符串。与您想要绘制的日志目录(或日志目录的前缀,绘图器将在内部自动完成)一样多。对于实验输出,将递归搜索Logdirs。

你应该知道的:

内部自动补全真的很方便!假设你做了几个实验,目的是比较不同算法的性能,得到的日志目录结构为:

data/
    bench_algo1/
        bench_algo1-seed0/
        bench_algo1-seed10/
    bench_algo2/
        bench_algo2-seed0/
        bench_algo2-seed10/

您可以很容易地产生比较algo1和algo2的图表:

python spinup/utils/plot.py data/bench_algo

依靠自动完成来找到data/bench_algo1和data/bench_algo2。

可选参数:

-l--legend=[LEGEND ...]

字符串。为绘图指定图例的可选方法。绘图仪图例将自动从config.json文件中使用配置中的exp_name,除非你通过这个标志告诉它。只有在为每个要绘制的目录提供一个名称时,这种方法才有效。(注意:这可能与您提供的logdir参数数目不同!)回想一下,绘图器查找logdir参数的自动完成:对于给定的logdir前缀,可能有多个匹配项,您需要为每个匹配项提供一个图例字符串——除非您已经通过sele删除了其中的一些候选项。

-x--xaxis=XAXISdefault='TotalEnvInteracts'

字符串。从数据中选择用于x轴的列。

-y--value=[VALUE ...]default='Performance'

字符串。从数据中选择要在y轴上绘制的列。提交多个值将生成多个图形。默认为Performance,这不是任何算法的实际输出。相反,Performance是指使用策略的算法的正确性能度量平均值(AverageEpRet)或非使用策略的算法的正确性能度量平均值(AverageTestEpRet)。绘图仪将自动找出AverageEpRet或AverageTestEpRet中的哪一个为每个单独的logdir报告。

--count

可选的标记。默认情况下,绘图器显示y值,这些值是共享exp_name的所有结果的平均值,通常是一组仅在随机种子中不同的相同实验。但如果你想单独看所有这些曲线,可以用--count标记。

-s--smooth=Sdefault=1

int.通过在固定窗口上平均来平滑数据。这个参数表示平均窗口的宽度。

--select=[SEL ...]

字符串。可选的选择规则:绘图器将只显示来自包含所有子字符串的logdirs的曲线。

--exclude=[EXC ...]

字符串。可选排除规则:绘图仪将只显示来自不包含这些子字符串的logdirs的曲线。

 

 

你可能感兴趣的:(开发深度学习网络)