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

  • 相关阅读:
    Day4
    Day 4 -E
    Day4
    Day4
    Day4
    Day4
    Day4-F-产生冠军 HDU
    Day4
    Day4-B-最短路径问题 HDU3790
    HackerRank
  • 原文地址:https://www.cnblogs.com/gentlesunshine/p/12723175.html
Copyright © 2011-2022 走看看