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

时间:2020-04-18 02:14:22   收藏:0   阅读:221

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>就是读取可变参数配置等。下面我们来看一下官方比较全的命令:

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训练的等等,开头都是些客套话,该文档主要说明一点:要成功地训练一个强化学习模型通常涉及调整训练超参数,而该文档则包含一些最佳实践,用于参考来调优训练过程。下面直接开始。

配置文件参数

训练统计参数

使用PPO训练后,在tensorboard的参数解释。

五、用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)

对应官方文档: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忽略环境奖励。

好奇心奖励信号(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/

下面来看一下具体设置值:

GAIL奖励信号

GAIL,即对抗性生成模仿学习,是一种使用对抗性方法的模拟学习算法,与GANs(Generative Adversarial Networks)相似。在这个框架中,第二个神经网络,即鉴别器,被用来区分观察/动作是来自于demonstration还是来自于agent。这个鉴别器可以检查一个新的观察/动作,并根据它认为这个新的观察/动作所提供的演示的接近程度来提供奖励。

在每个训练过程中,agent都会尝试学习如何最大程度地提高奖励。然后,对鉴别器进行训练,以更好地区分demonstrations和agent的状态/动作。这样,当agent越来越擅长模仿演示时,鉴别器缺变得越来越严格,agent必须努力地“愚弄(fool)”它。

这种方法学习的策略将产生类似于演示的状态和动作,与直接克隆操作相比,所需的演示次数更少。除了单纯从演示中学戏外,还可以将GAIL奖励信号与外部奖励信号混合以知道学习过程。

使用GAIL需要来自Unity环境的记录演示。详见imitation learning guide

七、总结

以上就是这次的内容,主要就是的官方文档做一个翻译,顺便对各种参数进行一个理解,许多参数其实是和深度学习相关,如果翻译有误请见谅指出,共同学习~

写文不易~因此做以下申明:

1.博客中标注原创的文章,版权归原作者 煦阳(本博博主) 所有;

2.未经原作者允许不得转载本文内容,否则将视为侵权;

3.转载或者引用本文内容请注明来源及原作者;

4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

原文:https://www.cnblogs.com/gentlesunshine/p/12723175.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!