ML-Agents(七)训练指令与训练配置文件

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.yamlconfig/sac_trainer_config.yamlgail_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 PPOTraining 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到达最大步数时到达0
    • constant:在整个训练过程中,保持学习速率恒定。
  • 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进行编码的编码器类型。有效地选项包括:

  • (可选)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-fromCLI参数足以从同一运行中初始化所有模型。

训练统计参数

使用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_intervalnum_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_intervalnum_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到达最大步数时到达0
    • constant:在整个训练过程中,保持学习速率恒定。
  • 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进行编码的编码器类型。有效地选项包括:

  • (可选)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-fromCLI参数足以从同一运行中初始化所有模型。

训练统计参数

  • 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.yamlconfig/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

除了任何特定类别的超参数外,每个奖励信号还应至少定义两个参数:strengthgamma。注意,要删除某个奖励信号,你应该从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”中描述的方法的一种实现。它训练两个网络:

  1. 一个逆向模型,该模型采用agent的当前和下一个观察值,对它们进行编码,并使用编码来预测观察值之间采取的动作。

  2. 一个正向模型,它采用当前已编码的观测值和动作,并预测下一个已编码的观测值。

正向模型的损失(预测值和实际观测值之间的差异)被用作内在奖励,因此模型越好奇,奖励越大。

更多信息可以查看以下网站:

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.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

posted @ 2020-04-17 23:01  煦阳  阅读(879)  评论(1编辑  收藏