ML-Agents(七)训练指令与训练配置文件
一、背景
到现在为止,官方的示例已经研究三个了,但是说实话自己去按官方的配置文件训练,有时候并不能完全训练出好的模型,而且官方的配置文件配置项都不是很明白,因此想在看下一个示例之前,先来研究一下官方关于配置文件的文档,通俗点就是翻译一下,有可能其中会找到我之前在训练模型时遗漏的点。
当然如果大家有时间的话,还是可以去学习一下ML-Agents的理论,就是机器学习那套。我自己的话直接把ML-Agents当黑盒来用了,一般我的理念就是先学会怎么用,要知道能解决什么问题,然后遇到不懂得再看原理,这样就是有好有坏,主要看个人喜好。
以下翻译内容主要来自ml-agents的github文档:
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-ML-Agents.md
二、训练命令
先来翻译一下官方文档中Command Line Training Options部分,这一部分主要是在Anaconda的命令行里要输入的训练命令字,之前我们已经见过一些了,例如--run-id=<run-identifier>
就是存储训练模型的名称,--sampler=<file>
就是读取可变参数配置等。下面我们来看一下官方比较全的命令:
-
--env=<env>
:指定要训练的可执行环境。这个命令是可选的,因为我们之前训练都是利用UnityIDE直接去训练的,因此之前的命令我都没有加这个。但是如果你的训练环境是发布出来的可执行程序,那就需要加这个命令来指定发布后的程序路径了。 -
--curriculum=<file>
:如果你的训练是Curriculum Learning,这个命令可以指定你要训练的课程配置文件,官方也有一个示例(Wall Jump)专门展示了Curriculum Learning这种训练类型,这里我们之后的文章再去深入研究。 -
--lesson=<n>
:指定在执行Curriculum Learning时要开始的课程,默认为0。 -
--sampler=<file>
:用于指定训练环境的可变参数的配置文件。我们之前也有提到过,具体内容可以看ML-Agents(四)3DBall补充の引入泛化。 -
--save-freq=<n>
:指定在训练过程中保存模型的频率,默认为50000。这个命令之前也没有用过,具体是什么用途有待考察。 -
--keep-checkpoints=<n>
:指定了要保存模型的检查点的最大数量。该属性与上面的--save-freq=<n>
有命令关,即在n步后,会记录一个检查点。此外,新的检查点形成,会使得老的检查点删除,默认存5个检查点。当然,这个命令也没用过,明白的童靴可以留言交流一下。 -
--num-envs=<n>
:指定在训练时,从几个Unity环境实例中收集数据,默认为1。当然如果是发布的程序,你就可以多开几个程序让训练数据更多。 -
--run-id=<run-identifier>
:为每个训练指定一个标识符(id)。这个id主要用于命名保存的训练模型、统计信息以及模型名称(就是在models、summaries文件夹下),默认id为“ppo”。如果用tensorboard查看训练统计数据,则每个训练模型的唯一id也是你设置的<run-idetifier>
。 -
--seed=<n>
:指定一个数字作为训练代码使用的随机数生成器的seed。 -
--env-args=<string>
:为可执行程序传参,具体给Unity传参可以参考官方文档Unity Command Line Arguments。例如,命令mlagents-learn config/trainer_config.yaml --env-args --num-orcs 42
会将--num-ors 42
传递给可执行文件。 -
--base-port
:指定启动的端口。用于多个Unity程序连接会依次分配一个端口。默认是5005。当然我们之前都是直接使用IDE进行训练的,所以这一项直接可以忽略。 -
--inference
:指定是否仅在推理模式下运行。这种模式会忽略对对模型的训练。要加载现有的训练模型,需要结合--reusme
以及run-id来使用。 -
--resume
:如果设置这一项,则训练代码会在训练前加载已经训练好的模型去初始化神经网络。训练代码会在models/<run-id>
目录下查找训练模型。这个选项仅在模型存在且具有与场景中当前代理相同的行为名称(Behavior Name)时才有效。--inference
和--resume
我还没想到有什么适用场合,基本上就是用已有的训练模型继续训练来用的?目前看起来还用不到。 -
--force
:当要使用之前已经使用过的run-id来训练模型会抛出错误。适用--force
来强制覆盖原有id的数据模型和数据统计。 -
--initialize-form=<run-identifier>
:指定一个已存在的训练模型来初始化新的训练模型。但是注意,当前的训练环境行为参数要与之前保存的训练模型参数相同才可以。 -
--no-graphics
:指定Unity以-batchmode
运行,并且不初始化图形驱动程序。当然注意只适用于训练中不涉及视觉观察(Observations,读取像素训练)。关于Unity不利用GPU运行请查看这里Unity官方文档。 -
--debug
:此选项可以输出代码某些部分的调试代码日志。 -
--cpu
:强制只使用CPU训练。 -
Unity设置:
--width
:Unity运行时窗口的宽度,单位像素,默认84(IDE训练可忽略)。--height
:有width,就有height,与上相同,指高度,默认84,同样IDE训练可忽略。--quality-level
:设置Unity的QualitySettings.SetQualityLevel
属性,即画面质量,默认为5。--time-scale
:设置Unity的Time.timeScale
属性,即游戏时间缩放比例,默认为20,最大为100。下次试试把这个值调大一些,是否可以加快训练速度。--target-frame-rate
:设置Unity的Application.targetFrameRate
,即设置游戏帧率,默认为-1,即不设置,一般为60帧每秒。
OK,以上就是官方已有的命令,下面来看一下与训练效果相关的配置文件各个属性是什么含义。
三、训练配置文件
在官方ml-agents的源码中,配置文件都在config
文件夹下,例如有config/trainer_config.yaml
,config/sac_trainer_config.yaml
,gail_config.yaml
等配置文件,它们分别指定了当使用PPO(Proximal Policy Optimization)、SAC(Soft Actor-Critic)、GAIL(Generative Adversarial Imitation Learning)的训练方法、超参数和一些附加值。其实这三种训练方法就是ml-agents支持的三种训练类型。这些配置文件都是yaml格式的,一开始是的部分是default部分,对于所有训练都适用,当然在指定的训练部分可以重设置default里的属性来覆盖default里的设置。每一部分的开头即是Unity中Behavior Parameters脚本的Behavior Name
属性。
属性 | 描述 | 适用的训练类型 |
---|---|---|
batch_size | 梯度下降每次迭代的样本批量大小。相对于正常数据,如果过小,训练数据收敛困难,过大处理速度加快,但所需内存(显存)增大。不过该值并非越大越好。 | PPO,SAC |
batches_per_epoch | 在模仿学习中,在训练模型之前收集的训练示例数量。 | |
beta | 熵正则化的强度。 | PPO |
buffer_size | 更新策略模型之前要收集的经验数量。在SAC中,为经验缓存取得最大大小。 | PPO,SAC |
buffer_init_steps | 在更新策略模型之前要收集到缓冲区中的经验总数。 | SAC |
epsilon | 影响策略在训练过程中的形成速度。 | PPO |
hidden_units | 神经网络隐含层的单位数。 | PPO,SAC |
init_entcoef | 在训练开始时,agent应该探索多深。 | SAC |
lambd | 正则化参数。 | PPO |
learning_rate | 梯度下降的初试学习率。 | PPO,SAC |
learning_rate_schedule | 确定学习速度随时间的变化。 | PPO,SAC |
max_steps | 在训练期间要模拟步骤的最大步数。 | PPO,SAC |
memory_size | 一个agent必须保留的内存大小。主要用于递归神经网络的训练,示例Hallway用到了该属性,详见Using Recurrent Neural Networks。 | PPO,SAC |
normalize | 是否自动标准化观测值。 | PPO,SAC |
num_epoch | 执行梯度下降优化时,通过经验缓冲区的遍历次数。 | PPO |
behavioral_cloning | 使用演示引导神经网络的策略。详见Pretraining Using Demonstrations中的(Optional) Behavioral Cloning Using Demonstrations。 | PPO,SAC |
reward_signals | 用来训练策略的奖励信号。适用于Curiosity和GAIL。详见Reward Signals。 | PPO,SAC |
save_replay_buffer | 退出训练时保存到回放缓存区,并在恢复时加载。 | SAC |
sequence_length | 定义当训练时,经验序列必须为多长。仅用于递归神经网络的训练。详见Using Recurrent Neural Networks。 | PPO,SAC |
summary_freq | 设置多久一次保存统计数据。主要决定了在tensorboard中显示数据点的数量。 | PPO,SAC |
tau | 在SAC训练中,如何主动更新用于引导值估计的目标网络。 | SAC |
time_horizon | 在将每个agent添加到经验缓冲区之前,需要多少步训练。 | PPO,SAC |
trainer | 要执行的训练类型:"ppo","sac","offline_bc"或"online_bc"。 | PPO,SAC |
train_interval | 更新代理的频率。 | SAC |
num_update | 在每次更新期间用于更新代理的最小批量数。 | SAC |
use_recurrent | 使用递归神经网络进行训练。详见Using Recurrent Neural Networks。 | PPO,SAC |
init_path | 从之前保存的模型初始化trainer。 | PPO,SAC |
以上大部分都是直译,其中有许多深度学习的相关内容,如果翻译不准确请见谅。还有我这里的地址不是官方github地址,由于我图快捷,把ml-agents克隆到gitee上了,所以打开应该是我的gitee仓储,影响应该不大。
官方文档又对以下内容分别作了文档:
- Training with PPO
- Training with SAC
- Using Recurrent Neural Networks
- Training with Curriculum Learning
- Training with Imitation Learning
- Training with Environment Parameter Randomization
下面我主要再研究一下Training with PPO
、Training with SAC
以及Reward Signals
。其中最后一篇Traning with Environment Parameter Randomization
已经在ML-Agents(四)3DBall补充の引入泛化
研究过了,有兴趣的童靴可以去看看。剩下的几篇我准备在具体官方示例中再研究。
四、用PPO训练
这章对应官方文档 Training with Proximal Policy Optimization。文档一开始主要就是介绍了PPO,PPO是如何与Unity训练的等等,开头都是些客套话,该文档主要说明一点:要成功地训练一个强化学习模型通常涉及调整训练超参数,而该文档则包含一些最佳实践,用于参考来调优训练过程。下面直接开始。
配置文件参数
-
Reward Signals
在强化训练中,目标就是要学习一种使奖励最大化的策略(Policy)。在基础层面上,奖励是由环境给予的。然而我们可能会遇到奖励拥有不同行为的agent。例如,我们可以让agent探索新的状态而获得奖励,而不是仅仅给予明确的奖励;再例如,我们还可以使用混合奖励信号来帮助学习过程。
使用
reward_signals
可以定义奖励信号。ML-Agents默认提供三种奖励信号:外部(环境)奖励信号、好奇心奖励信号(可用于agent进行探索)和GAIL奖励信号(对抗模仿学习)。具体的Reward Signals一会儿来看。 -
Lambda
lambd
对应于当计算广义优势估计时使用的lambd参数。这个参数可以被认为是agent在计算更新值估计时,依赖其当前估计值的多少。低值对应于agent更多地依赖于当前值估计(可能是高偏差),高值对应于更多的依赖于环境中收到的实际奖励(可能是高方差)。该参数提供了两者之间的平衡值,正确的值可使得更稳定的训练过程。推荐范围:
0.9
-0.95
-
Buffer Size
buffer_size
对应于在我们对模型进行任何学习或更新前,需要收集多少经验(包括agent的observations、actions以及获得的rewards)。这应该是batch_size
的倍数。通常,较大的buffer_size
对应于更稳定的训练更新。推荐范围:
2048
-409600
-
Batch Size
batch_size
是一个梯度下降迭代更新的样本数量。它应该始终是buffer_size
的一小部分。如果你的agent使用的是连续动作空间(Continuous Type),那这个值应该要大一些(大约1000s);如果agent使用的是离散动作空间(Discrete Type),那这个值应该小一些(大约10s)。Continuous Type推荐范围:
512
-5120
Discrete Type推荐范围:
32
-512
-
Number of Epochs
num_epoch
是在梯度下降过程中通过经验缓存区的次数。batch_size
越大,这个值越大也是可接受的。减少该值将确保更新更稳定,但是会降低学习速度。推荐范围:
3
-10
-
Learning Rate
learning_rate
对应于每个梯度下降更新步骤的强度。如果训练不稳定,该值应该减少,并且奖励不能持续增加。推荐范围:
1e-5
-1e-3
-
(可选)Learning Rate Schedule
learning_rate_schedule
对应于学习率如何随时间变化。对于PPO来说,建议在max_steps
之前降低学习速率,这样学习才能更稳定地收敛。但是在某些情况下(例如训练时间未知),可以禁用此功能。选择项:
linear
(默认):线性衰减learning.rate
,在max_steps
到达最大步数时到达0constant
:在整个训练过程中,保持学习速率恒定。
-
Time Horizon
time_horizon
对应于在将每个agent添加到经验缓存区之前要收集多少训练步数。当在一个episode结束之前达到此值时,将使用一个值估计来预测agent当前状态的总体预期回报。因此,该参数在偏差较小但变化较大的估计值(长时间范围)和偏差较大但变化较小的估计值(短时间范围)之间进行权衡。在一个episode里agent如果频繁获得奖励或者episode数量非常大的情况下,该值更小可能更理想。该值应该足够大,以捕获agent动作序列中所有重要行为。推荐范围:
32
-2048
-
Max Steps
max_steps
对应于在训练过程中运行了多少步模拟(乘以跳帧)。对于较复杂的问题,该值应该增大。推荐范围:
5e5
-1e7
-
Beta
beta
对应于熵正则化的强度,这使得策略更具“随机性”。该值使得agent在训练过程中正确地探索动作空间。增加该值将使得agent执行更多的随机动作。该值应该被调整成,使得entropy(熵)在tensorboard中显示随着奖励的增加而缓慢减小。如果entropy下降太快,则增加beta
,如果entropy下降太慢,则减小beta
。推荐范围:
1e-4
-1e-2
-
Epsilon
epsilon
对应于梯度下降更新过程中新旧policy之间可接受的差异阈值。将此值设置得较小将导致更稳定的更新,但也会减慢训练过程。推荐范围:
0.1
-0.3
-
Normalize
normalize
对应于是否对输入的矢量观测值(vector observation)进行规范化处理。这种归一化是基于矢量观测值的平均值和方差。规范化对于复杂的连续控制(continuous control)问题很有用,但对于较简单的离散控制(discrete control)可能反而有害。 -
Number of Laters
num_layers
对应于观察值输入之后或在视觉观察的CNN编码之后存在多少个隐藏层。对于简单的问题,更少的层数可使得训练更加迅速、高效。对于更复杂的控制问题,可能需要更多的层。推荐范围:
1
-3
-
Hidden Units
hidden_units
对应于神经网络的每个全连接层中有多少个单元。对于简单的问题,正确的操作是将观察输入直接组合,因此该值应该较小。对于动作是观察变量之间非常复杂的交互问题,这个值应该较大。推荐范围:
32
-512
-
(可选)Visual Encoder Type
vis_encode_type
对应于visual observations进行编码的编码器类型。有效地选项包括:simple
(默认):有两个卷积层组成的简单编码器nature_cnn
:由三个卷积层组成,详见 CNN implementation proposed by Mnih et al.resnet
:由三个堆叠的层组成,每个对叠层具有两个剩余块,从而形成了比其他两个更大的网络,详见 IMPALA Resnet implementation
-
(可选)Recurrent Neural Network Hyperparameters
以下超参数仅在
use_recurrent
为true时使用。-
Sequence Length
sequence_length
对应于训练过程中通过网络传递的经验序列的长度。该值应该足够大以捕获agent随时间推移可能需要记住的任何信息。例如,如果agent需要记住物体的速度,则该值可能很小。如果agent需要记住一段episode开始时只给出一次的信息,那么该值应该更大。推荐范围:
4
-128
-
Memory Size
memory_size
对应于存储策略的递归神经网络隐藏状态的浮点数数组的大小。该值必须是2的倍数,并且应该与期望agent成功完成任务所需记住的信息量成比例。推荐范围:
32
-256
-
-
(可选)Behavioral Cloning Using Demonstrations
在某些情况下,你可能希望使用player记录的行为来引导agent的策略。这可以帮助指导agent获得奖励。行为克隆(BC)增加了模拟演示的训练操作,而不是试图使报酬最大化。
要使用BC,请在
trainer_config
中添加一个behavioral_cloning
部分,例如:behavioral_cloning: demo_path: ./Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo strength: 0.5 steps: 10000
以下为BC可用的超参数。
-
Strength
strength
对应于模仿的学习率相对于PPO的学习率,大致对应的使我们允许BC对policy的影响强度。推荐范围:
0.1
-0.5
-
Demo Path
demo_path
是.demo
文件或.demo
文件目录的路径。有关.demo
文件的更多信息,详见imitation learning guide。 -
Steps
在BC期间,通常希望agent在“看到”奖励后停止使用演示,并允许其优化过去可用的demonstrations和/或概括所提供的演示之外的内容。
steps
对应于激活BC的训练步骤。BC的学习率将随步骤逐步提高。将steps
设置为0,以便在整个训练过程中持续模仿。 -
(可选)Batch Size
batch_size
是梯度下降更新的一次迭代的样本数。如果未指定,则默认为PPO的batch_size
。推荐范围(Continuous):
512
-5120
推荐范围(Discrete):
32
-512
- (可选)Number of Epochs
num_epoch
是在梯度下降过程中通过经验缓存区的次数。如果未指定,则默认为PPO的num_epoch
。推荐范围:
3
-10
-
(可选)Samples Per Update
samples_per_update
是每个模拟更新期间使用的最大样本数。如果演示数据集非常大,则可能需要降低该值,以避免在演示上过渡拟合策略。设置为0,以便在每个更新步骤中对所有演示进行训练。默认值:
0
(所有)推荐范围:大于等于PPO的
buffer_size
-
(可选)Advanced: Initialize Model Path
init_path
可以指定在开始训练之前初始化以前训练的模型。注意,以前的模型的训练配置需要与当前运行的相同,并且使用相同版本的ML-Agents保存。同时要提供全路径存储,例如./models/{run-id}/{behavior_name}
。如果要从不同的运行中初始化不同的行为,则使用该项。大多数情况下,使用
--initialize-from
CLI参数足以从同一运行中初始化所有模型。
-
训练统计参数
使用PPO训练后,在tensorboard的参数解释。
-
Cumulative Reward
奖励的总体趋势应随时间不断增减。预计会有小的欺负。根据任务的复杂性,奖励可能不会显著增加,有可能直到训练到数百万步才增加。
-
Entropy
该值对应于决策的随机性。在训练期间该值应该不断减小。如果该值下降的太快或者根本没有减小,则应该调整
beta
(当使用discrete action space时)。 -
Learning Rate
默认情况下,在line schedule中,该值会随时间减小,除非
learning_rate_schedule
设置为constant
。 -
Policy Loss
策略损失,该值会在训练过程中振荡。通常它们应该小于1.0。
-
Value Estimate
该值应该随着奖励积累的增加而增加。它们对应于agent预测自己在任何给定时间点上会得到多少奖励。
-
Value Loss
该值会随着奖励的增加而增加,一旦奖励变得稳定,该值则应降低。
五、用SAC训练
对应官方文档: Training with Soft-Actor Critic
与PPO不同的是,SAC(Soft-Actor Critic)是off-policy训练,这意味着它可以从过去任何时候收集的经验中学习。收集经验后,它们被放置在经验回放缓冲区,并在训练期间随机抽取。这使得SAC大大提高了采样效率,与PPO相比学习相同的任务通常采样量少5-10倍。但是,SAC往往需要更多的模型更新。对于较重或较慢的环境(大约每步0.1s或更长时间),SAC是一个不错的选择。SAC也是一种“最大熵”算法,并且可以以固有方式进行探索。
为了训练agent,你需要向agent提供一个或多个奖励信号,agent需要尝试最大化奖励信号。奖励信号有关部分在第六章看。以下配置参数内容有些与PPO重复,也有SAC单独定义的参数。
配置文件参数
-
Reward Signals
在强化训练中,目标就是要学习一种使奖励最大化的策略(Policy)。在基础层面上,奖励是由环境给予的。然而我们可能会遇到奖励拥有不同行为的agent。例如,我们可以让agent探索新的状态而获得奖励,而不是仅仅给予明确的奖励;再例如,我们还可以使用混合奖励信号来帮助学习过程。
使用
reward_signals
可以定义奖励信号。ML-Agents默认提供三种奖励信号:外部(环境)奖励信号、好奇心奖励信号(可用于agent进行探索)和GAIL奖励信号(对抗模仿学习)。具体的Reward Signals一会儿来看。 -
(可选)Number of Updates for Reward Signal
奖励信号的
reward_signal_num_update
对应于在每次更新过程中采样并用于更新奖励信号的小批量数。默认情况下,在每次主policy更新时都会更新一次奖励信号。但是,为了模仿某些学习论文(e.g. Kostrikov et. al, Blondé et. al)中的中的训练过程,我们可能需要更新N次策略,然后将奖励信号(GAIL)更新M次。此时我们可以将SAC的train_interval
和num_update
设置为N,并将reward_signals
下的reward_signal_num_update
改为M。默认操作下,reward_signal_num_update
设置为num_update
。推荐范围:
num_update
-
Buffer Size
buffer_size
对应于在我们对模型进行任何学习或更新前,需要收集多少经验(包括agent的observations、actions以及获得的rewards)。该值应该很大,大概是你的eposodes的数千倍,以便SAC可以从新、旧经验中学习。它也应该比batch_size
大得多。推荐范围:
50000
-1000000
-
Buffer Init Steps
buffer_init_steps
是在尝试进行训练之前预填充缓冲区的经验数。由于未经训练的策略是相当随机的,因此用随机动作预填充缓冲区对于探索非常有用。通常,至少应预填一些episodes经验。推荐范围:
1000
-10000
-
Batch Size
batch_size
是一个梯度下降迭代更新的样本数量。它应该始终是buffer_size
的一小部分。如果你的agent使用的是连续动作空间(Continuous Type),那这个值应该要大一些(大约1000s);如果agent使用的是离散动作空间(Discrete Type),那这个值应该小一些(大约10s)。Continuous Type推荐范围:
128
-1024
Discrete Type推荐范围:
32
-512
-
Initial Entropy Coefficient
init_entcoef
是训练开始时设置的初始熵系数。在SAC中,激励agent使其行为熵化,可以促进更好的探索。熵系数用bonus entropy reward来衡量真正的奖励。熵系数会自动调整为预设的目标熵,因此init_entcoef
仅对应于熵加成的初始值。开始时增加init_entrcoef
以进行更多探索,减少该值则可以更快的收敛于一个解决方案。Continuous Type推荐范围:
0.5
-1.0
Discrete Type推荐范围:
0.05
-0.5
-
Train Interval
train_interval
是每个agent训练事件之间采取的步骤数。通常,我们可以在每个步骤之后进行训练,但是如果环境的步骤很少或者非常频繁,那么在步骤之间不会有任何有趣的新信息,此时可以适当增加train Interval
。推荐范围:
1
-5
-
Number of Updates
num_update
对应于每个训练事件中期间采样并用于培训的最小批量数。在SAC中,单个“update”对应于从经验回放缓冲区抓取一批batch_szie
大小的数据,并使用这个小批量数据更新模型。通常情况下,该值可以保留为1。但是,为了模仿某些沦为(e.g. Kostrikov et. al, Blondé et. al),我们可能需要在获取去其他样本之前,用不同的小批量样本更新N次。我们可以将train_interval
和num_update
设置为N来完成此操作。推荐范围:
1
-
Tau
tau
对应于SAC模型更新期间目标Q更新的大小。在SAC中,有两个神经网络:目标和策略。目标网络用于引导给定状态下策略对未来奖励的估计。然后根据tau
慢慢更新此目标。通常,该值应该保留为0.005
。对于简单问题,以稳定性为代价,可以将tau
增加到0.01可能会减少学习时间。推荐范围:
0.005
-0.01
-
Learning Rate
learning_rate
对应于每个梯度下降更新步骤的强度。如果训练不稳定,该值应该减少,并且奖励不能持续增加。推荐范围:
1e-5
-1e-3
-
(可选)Learning Rate Schedule
learning_rate_schedule
对应于学习率如何随时间变化。对于PPO来说,建议在max_steps
之前降低学习速率,这样学习才能更稳定地收敛。但是在某些情况下(例如训练时间未知),可以禁用此功能。选择项:
linear
(默认):线性衰减learning.rate
,在max_steps
到达最大步数时到达0constant
:在整个训练过程中,保持学习速率恒定。
-
Time Horizon
time_horizon
对应于每个agent添加到经验缓冲区之前要收集的经验步骤。与PPO相比,这个参数对SAC的重要性要小得多,通常可以设置为接近episode长度。推荐范围:
32
-2048
-
Max Steps
max_steps
对应于在训练过程中运行了多少步模拟(乘以跳帧)。对于较复杂的问题,该值应该增大。推荐范围:
5e5
-1e7
-
Normalize
normalize
对应于是否对输入的矢量观测值(vector observation)进行规范化处理。这种归一化是基于矢量观测值的平均值和方差。规范化对于复杂的连续控制(continuous control)问题很有用,但对于较简单的离散控制(discrete control)可能反而有害。 -
Number of Layers
num_layers
对应于观察值输入之后或在视觉观察的CNN编码之后存在多少个隐藏层。对于简单的问题,更少的层数可使得训练更加迅速、高效。对于更复杂的控制问题,可能需要更多的层。推荐范围:
1
-3
-
Hidden Units
hidden_units
对应于神经网络的每个全连接层中有多少个单元。对于简单的问题,正确的操作是将观察输入直接组合,因此该值应该较小。对于动作是观察变量之间非常复杂的交互问题,这个值应该较大。推荐范围:
32
-512
-
(可选)Visual Encoder Type
vis_encode_type
对应于visual observations进行编码的编码器类型。有效地选项包括:simple
(默认):有两个卷积层组成的简单编码器nature_cnn
:由三个卷积层组成,详见 CNN implementation proposed by Mnih et al.resnet
:由三个堆叠的层组成,每个对叠层具有两个剩余块,从而形成了比其他两个更大的网络,详见 IMPALA Resnet implementation
-
(可选)Recurrent Neural Network Hyperparameters
-
Sequence Length
sequence_length
对应于训练过程中通过网络传递的经验序列的长度。该值应该足够大以捕获agent随时间推移可能需要记住的任何信息。例如,如果agent需要记住物体的速度,则该值可能很小。如果agent需要记住一段episode开始时只给出一次的信息,那么该值应该更大。推荐范围:
4
-128
-
Memory Size
memory_size
对应于存储策略的递归神经网络隐藏状态的浮点数数组的大小。该值必须是2的倍数,并且应该与期望agent成功完成任务所需记住的信息量成比例。推荐范围:
32
-256
-
(可选)Save Replay Buffer
save_replay_buffer
设置在退出和重新开始训练时保存和加载经验回放缓冲区以及模型。这将有助备份恢复,因为收集的经验不会被删除。注意,回放缓冲区可能非常大,并且会占用大量磁盘空间。因此默认该功能为禁用状态。默认:
False
-
-
(可选)Behavioral Cloning Using Demonstrations
在某些情况下,你可能希望使用player记录的行为来引导agent的策略。这可以帮助指导agent获得奖励。行为克隆(BC)增加了模拟演示的训练操作,而不是试图使报酬最大化。
要使用BC,请在
trainer_config
中添加一个behavioral_cloning
部分,例如:behavioral_cloning: demo_path: ./Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo strength: 0.5 steps: 10000
以下为BC可用的超参数。
-
Strength
strength
对应于模仿的学习率相对于PPO的学习率,大致对应的使我们允许BC对policy的影响强度。推荐范围:
0.1
-0.5
-
Demo Path
demo_path
是.demo
文件或.demo
文件目录的路径。有关.demo
文件的更多信息,详见imitation learning guide。 -
Steps
在BC期间,通常希望agent在“看到”奖励后停止使用演示,并允许其优化过去可用的demonstrations和/或概括所提供的演示之外的内容。
steps
对应于激活BC的训练步骤。BC的学习率将随步骤逐步提高。将steps
设置为0,以便在整个训练过程中持续模仿。 -
(可选)Batch Size
batch_size
是梯度下降更新的一次迭代的样本数。如果未指定,则默认为SAC的batch_size
。推荐范围(Continuous):
512
-5120
推荐范围(Discrete):
32
-512
-
(可选)Advanced: Initialize Model Path
init_path
可以指定在开始训练之前初始化以前训练的模型。注意,以前的模型的训练配置需要与当前运行的相同,并且使用相同版本的ML-Agents保存。同时要提供全路径存储,例如./models/{run-id}/{behavior_name}
。如果要从不同的运行中初始化不同的行为,则使用该项。大多数情况下,使用
--initialize-from
CLI参数足以从同一运行中初始化所有模型。
-
训练统计参数
-
Cumulative Reward
奖励的总体趋势应随时间不断增减。预计会有小的欺负。根据任务的复杂性,奖励可能不会显著增加,有可能直到训练到数百万步才增加。
-
Entropy Coefficient
SAC是一种“最大化熵”的强化学习算法,使用SAC训练的agent在解决问题的同时被激励产生随机行为。熵系数平衡了激励随机行为与最大化奖励之间的平衡。该值会自动调整,以便agent在训练过程中保留一定程度的随机性。在开始训练时,该值应该稳定下降,并达到一个小的值,然后区域稳定。如果下降得过快或者需要很长时间才能下降,
init_entcoef
的只应该进行调整。 -
Entropy
该值与决策的随机性是一致的。在训练过程中,初始值应该增加,达到一个峰值,然后随着熵系数(Entropy Coefficient)的下降而下降。这是因为在一开始,由于较高的Entropy Coefficient,agent被激励为更随机的探索。如果它下降的太快或者需要太长时间才能下降,则应调整
init_entcoef
。 -
Learning Rate
在默认情况下,该值保持一个常量,除非
learning_rate_schedule
设置为linear
。 -
Policy Loss
该值可能会随着policy的探索而增加,但是随着agent学习如何解决任务而应长期减少。
-
Value Estimate
该值应该随着Cumulative Reward的增加而增加。它对应于agent预测自己在任何给定时间点会收到多少奖励。它们也可能在开始时增加,因为agent被奖励为随机的(see: Entropy and Entropy Coefficient),但是应该随着Entropy Coefficient的减少而减少。
-
Value Loss
该值会随着奖励的增加而增加,一旦奖励变得稳定,该值则应降低。
六、奖励信号(Reward Signals)
对应官方文档:Reward Signals
在强化学习中,agent的最终目标是发现一种使得奖励最大化的行为或策略。通常奖励是由你的环境定义的,并且与达成某个目标相对应。这就是所谓的“外部的(extrinsic)”奖励,因为它们是在学习算法外部定义的。
但是,奖励也可以定义在环境之外,以鼓励agent以某些方式行事,或帮助其学习真正的外部奖励。我们把这些奖励称为“内在的(intrinsic)”奖励。agent将学习最大化的总奖励可以是外部奖励信号和内部奖励信号的结合。
ML-Agents允许以模块化的方式定义奖励信号,一共提供了三种奖励信号,这些信号可以混合和匹配以帮助训练agent的行为。extrinsic
奖励信号表示是环境中定义的奖励,默认情况下时启用的。当外部奖励稀少时,curiosity
奖励信号会帮助agent探索。
开启奖励信号
奖励信号像其他超参数一样,在trainer_config.yaml
文件中定义。config/trainer_config.yaml
和config/gail_config.yaml
提供了一个示例。要启用奖励信号,在配置文件中需要增加reward_signals
部分。例如,除了好奇心奖励信号和GAIL奖励信号外,要启用外部信号,可以按以下方式定义:
reward_signals:
extrinsic:
strength: 1.0
gamma: 0.99
curiosity:
strength: 0.02
gamma: 0.99
encoding_size: 256
gail:
strength: 0.01
gamma: 0.99
encoding_size: 128
demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
除了任何特定类别的超参数外,每个奖励信号还应至少定义两个参数:strength
和gamma
。注意,要删除某个奖励信号,你应该从reward_signals
完全删除其条目,并且任何时候都应该至少留下一个奖励信号。
奖励信号类型
外部奖励信号(Extrinsic Reward Signal)
外部奖励信号仅仅是环境给出的奖励。删除它迫使agent忽略环境奖励。
-
Strength
strength
是原始奖励的倍乘系数。通常范围将根据奖励信号来变化。推荐范围:
1.0
-
Gamma
gamma
对应于未来奖励的折扣因子。可以认为这是agent应该在多远的将来关心可能的回报。在agent为了准备在遥远的将来的奖励情况下,该值应该很大。如果希望奖励更加及时,则该值可能更小。推荐范围:
0.8
-0.995
好奇心奖励信号(Curiosity Reward Signal)
好奇心奖励将启动agent内在的好奇心模块。这是Pathak等人在“Curiosity-driven Exploration by Self-supervised Prediction”中描述的方法的一种实现。它训练两个网络:
-
一个逆向模型,该模型采用agent的当前和下一个观察值,对它们进行编码,并使用编码来预测观察值之间采取的动作。
-
一个正向模型,它采用当前已编码的观测值和动作,并预测下一个已编码的观测值。
正向模型的损失(预测值和实际观测值之间的差异)被用作内在奖励,因此模型越好奇,奖励越大。
更多信息可以查看以下网站:
https://arxiv.org/abs/1705.05363
https://pathak22.github.io/noreward-rl/
https://blogs.unity3d.com/2018/06/26/solving-sparse-reward-tasks-with-curiosity/
下面来看一下具体设置值:
-
Strength
在好奇心奖励信号开启情况下,
strength
对应于内在好奇心模块产生的好奇心奖励的大小。应该对其进行调整,以确保它足够大而不会被环境中的外部奖励淹没。同样,它也不应该太大,以致于掩盖了外部奖励信号。推荐范围:
0.001
-0.1
-
Gamma
gamma
对应于未来奖励的折扣因子。推荐范围:
0.8
-0.995
-
(可选)Encoding Size
encoding_size
对应于好奇心模块使用的编码大小。该值应该足够小,以鼓励ICM压缩原始的观察,但也不应该太小,以防ICM学习区分显示的行为和实际的行为。默认值:
64
推荐范围:
64
-256
-
(可选)Learning Rate
learning_rate
适用于更新内在好奇心模块的学习率。如果训练不稳定且Curiosity Loss不稳定,则通常应该减小该值。默认值:
3e-4
推荐范围:
1e-5
-1e-3
GAIL奖励信号
GAIL,即对抗性生成模仿学习,是一种使用对抗性方法的模拟学习算法,与GANs(Generative Adversarial Networks)相似。在这个框架中,第二个神经网络,即鉴别器,被用来区分观察/动作是来自于demonstration还是来自于agent。这个鉴别器可以检查一个新的观察/动作,并根据它认为这个新的观察/动作所提供的演示的接近程度来提供奖励。
在每个训练过程中,agent都会尝试学习如何最大程度地提高奖励。然后,对鉴别器进行训练,以更好地区分demonstrations和agent的状态/动作。这样,当agent越来越擅长模仿演示时,鉴别器缺变得越来越严格,agent必须努力地“愚弄(fool)”它。
这种方法学习的策略将产生类似于演示的状态和动作,与直接克隆操作相比,所需的演示次数更少。除了单纯从演示中学戏外,还可以将GAIL奖励信号与外部奖励信号混合以知道学习过程。
使用GAIL需要来自Unity环境的记录演示。详见imitation learning guide。
-
Strength
strength
是原始奖励的倍乘系数。注意,将GAIL奖励信号与外部奖励信号一起使用时,如果你的演示不理想(如来自人的操作演示),则应该将该值设置得较低,以便受过训练的agent专注于获得外部奖励,而不是完全地复制演示。在这些情况下,将该值保持在约0.1以下。推荐范围:
0.01
-1.0
-
Gamma
gamma
对应于未来奖励的折扣因子。推荐范围:
0.8
-0.9
-
Demo Path
demo_path
是.demo
文件或.demo
文件目录的路径。详见imitation learning guide。 -
(可选)Encoding Size
encoding_size
对应于鉴别器使用的隐藏层的大小。该值应该足够小,以鼓励鉴别器压缩原始观察结果,但也不能太小,以防止其学习区分演示时和实际的行为。大幅增加该值会对训练时间产生负面影响。默认值:
64
推荐范围:
64
-256
-
(可选)Learning Rate
learning_rate
适用于更新鉴别器的学习率。如果训练不稳定且GAIL loss不稳定,通常应该减少该值。默认值:
3e-4
推荐范围:
1e-5
-1e-3
-
(可选)Use Actions
use_actions
确定鉴别器是应该根据观察和操作进行鉴别,还是仅仅根据观察值进行区分。如果你希望agent模仿演示中的操作,则将其设置为True
,如果你希望agent可能使用不同的操作而达到演示中相同的状态,则将其设置为False
。设置为False
更有可能是稳定的,特别是在演示不完美的情况下,但是学习的速度可能较慢。默认值:
false
-
(可选)Variational Discriminator Bottleneck
use_vail
可启动鉴别器中的变分瓶颈。这迫使鉴别器学习一种更笼统的表示,并降低了其在鉴别方面“太好”的倾向,从而使得学习更加稳定。然而,它确实增加了训练时间。如果你注意到你的模仿学习是不稳定的,或者不能学习手头的任务,那就尝试启动这个功能。默认值:
false
七、总结
以上就是这次的内容,主要就是的官方文档做一个翻译,顺便对各种参数进行一个理解,许多参数其实是和深度学习相关,如果翻译有误请见谅指出,共同学习~
写文不易~因此做以下申明:
1.博客中标注原创的文章,版权归原作者 煦阳(本博博主) 所有;
2.未经原作者允许不得转载本文内容,否则将视为侵权;
3.转载或者引用本文内容请注明来源及原作者;
4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。
来源:oschina
链接:https://my.oschina.net/u/4301845/blog/3273560