ML-Agents命令及配置大全
Posted 微笑小星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ML-Agents命令及配置大全相关的知识,希望对你有一定的参考价值。
关于ML-Agents插件的入门,请查看我前面的博文: Unity强化学习之ML-Agents的使用
本文内容基于ML-Agents的官方文档:Training ML-Agents以及Training Configuration File
ML-Agents命令
查看所有的命令:
mlagents-learn --help
训练的基本命令是:
mlagents-learn <trainer-config-file> --env=<env_name> --run-id=<run-identifier>
注意:命令前面的是两条杠,不是一条杠
-
<trainer-config-file>
是训练器配置 YAML 的文件路径。里面包含所有超参数值。<env_name>
(可选)是包含要训练的代理的Unity 可执行文件的名称(包括路径) 。如果不写,则训练将在编辑器中进行。<run-identifier>
是一个唯一的名称,主要用于命名保存的训练模型、统计信息以及模型名称。训练过程产生的文件都保存在results/<run-identifier>
文件夹中。 -
–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。当然如果是发布的程序,你就可以多开几个程序让训练数据更多。 -
–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)时才有效。 -
–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帧每秒。
ML-Agents配置
参数配置
在配置文件YAML文件中,你可以添加以下参数:
环境设置:
env_settings:
env_path: FoodCollector
env_args: null
base_port: 5005
num_envs: 1
seed: -1
max_lifetime_restarts: 10
restarts_rate_limit_n: 1
restarts_rate_limit_period_s: 60
引擎设置:
engine_settings:
width: 84
height: 84
quality_level: 5
time_scale: 20
target_frame_rate: -1
capture_frame_rate: 60
no_graphics: false
检查点设置:
checkpoint_settings:
run_id: foodtorch
initialize_from: null
load_model: false
resume: false
force: true
train_model: false
inference: false
Torch设置:
torch_settings:
device: cpu
所有功能展示(基于PPO)
如果我们使用了所有的训练功能的PPO算法(包含记忆,行为克隆,好奇心,GAIL和self-play),配置文件应该这样写(自己灵活选择功能):
behaviors:
BehaviorPPO:
trainer_type: ppo
hyperparameters:
# Hyperparameters common to PPO and SAC
batch_size: 1024
buffer_size: 10240
learning_rate: 3.0e-4
learning_rate_schedule: linear
# PPO-specific hyperparameters
# Replaces the "PPO-specific hyperparameters" section above
beta: 5.0e-3
beta_schedule: constant
epsilon: 0.2
epsilon_schedule: linear
lambd: 0.95
num_epoch: 3
# Configuration of the neural network (common to PPO/SAC)
network_settings:
vis_encode_type: simple
normalize: false
hidden_units: 128
num_layers: 2
# memory
memory:
sequence_length: 64
memory_size: 256
# Trainer configurations common to all trainers
max_steps: 5.0e5
time_horizon: 64
summary_freq: 10000
keep_checkpoints: 5
checkpoint_interval: 50000
threaded: false
init_path: null
# behavior cloning
behavioral_cloning:
demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
strength: 0.5
steps: 150000
batch_size: 512
num_epoch: 3
samples_per_update: 0
reward_signals:
# environment reward (default)
extrinsic:
strength: 1.0
gamma: 0.99
# curiosity module
curiosity:
strength: 0.02
gamma: 0.99
encoding_size: 256
learning_rate: 3.0e-4
# GAIL
gail:
strength: 0.01
gamma: 0.99
encoding_size: 128
demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
learning_rate: 3.0e-4
use_actions: false
use_vail: false
# self-play
self_play:
window: 10
play_against_latest_model_ratio: 0.5
save_steps: 50000
swap_steps: 2000
team_change: 100000
SAC部分展示
如果使用的是SAC而不是PPO算法,只需要做简单的修改:
behaviors:
BehaviorSAC:
trainer_type: sac
hyperparameters:
# SAC-specific hyperparameters
# Replaces the "PPO-specific hyperparameters" section above
buffer_init_steps: 0
tau: 0.005
steps_per_update: 10.0
save_replay_buffer: false
init_entcoef: 0.5
reward_signal_steps_per_update: 10.0
# 下面内容相同
配置说明
batch_size:一次性抽取多少条数据样本一起训练。连续动作空间推荐:512-5120,离散动作空间推荐:32-512
buffer_size:经验池容量。推荐:2048-409600
epsilon:影响策略在训练过程中的成型速度。对应新旧策略之间可接受的差异阈值,较小有较稳定的稳定,但会减慢训练过程。推荐:0.1-0.3
init_entcoef:在训练开始时,agent应该探索多深。
learning_rate:学习率,数据更新强度,训练不稳定应降低该值。推荐:1e-5-1e-3
learning_rate_Schedule:对应于学习率如何随时间变化,逐渐降低学习速率可以更稳定收敛。linear指线性衰减,maxSteps达到0,constant不衰减。
max_steps:每一个episode执行的最大步数。推荐:5e5-1e7
normalize:是否自动标准化观测值。这对于复杂连续控制问题很有用,但对于简单离散控制可能反而有害。
behavioral_cloning:使用演示引导神经网络的策略。strength:模仿学习的学习率,推荐:0.1-0.5。demo_path:是.demo文件的路径。Steps:对应于激活BC的步骤,,BC的学习率随步骤逐步提高,设置为0会在整个训练过程中持续模仿。
save_replay_buffer:退出训练时保存到回放缓冲区,并在恢复时加载。
summary_freq:设置多久一次保存统计数据。主要决定了在tensorboard中显示数据点的数值。
time_horizon:在将每个agent添加到经验缓冲池之前,需要经过多少步训练。推荐:32-2048
train_interval:更新智能体的频率。
use_recurrent:是否使用循环神经网络。以下参数在use_recurrent为true时使用。sequence_length:训练中通过网络传递的经验序列的长度,较大的值可以记住较长时间的信息。推荐:4-128。memory_size:对应了存储策略的循环神经网络隐藏状态的浮点数数组大小,必须是2的倍数,并且与期望agent成功完成任务所需记住的信息量成比例。推荐:32-256
Reward Signals:在强化训练中,目标就是要学习一种是奖励最大化的策略。在基础层面上将来是由环境给出的。然而我们很可能遇到鼓励探索的agent。我们可以让agent探索新的状态而获得奖励,而不是仅仅给予明确的奖励;我们还可以使用混合奖励信号来帮助学习过程。使用reward_signals可以定义奖励信号。ML-Agents默认提供三种奖励信号:外部奖励信号(环境给予)、好奇心奖励信号(鼓励探索)、GAIL奖励信号(对抗模仿学习)。
lambd:agents更新估计值时依赖于当前值的多少,趋近于1时则靠近更新值,趋近于0靠近当前的估计值。推荐:0.9-0.95
num_epoch:梯度下降过程中通过经验池的次数。batch_size越大它可以设置得越大。减小该值可以确保更新稳定,但降低学习速率。推荐:3-10
num_layer:观察值输入后或CNN之后存在的隐藏层的数量,复杂的问题需要更多的层,推荐:1-3
hidden_units:对应神经网络每个全连接层有多少个单元。推荐:32-512
vis_encode_type:对应于可视化观测进行编码的编码器类型,选项包含:simple(默认):两个卷积层组成的简单编码器,nature_cnn:三个卷积层组成,详见https://www.nature.com/articles/nature14236。resnet:由三个堆叠的层构成,是比其他两个更大的网络,详见https://arxiv.org/abs/1802.01561。
init_path:指定在开始训练之前训练的模型,注意以前的模型的训练配置需要与当前运行的相同,并且使用相同版本的ML-Agents保存,同时要提供全路径存储。
reward_signal_num_update:对应于每次更新过程中采样并用于更新奖励信号的小批量数。默认在每次主policy更新时都会更新一次奖励信号,但为了模仿某些论文中的训练过程,我们需要更新N次策略,然后将奖励信号(GAIL)更新M次。此时我们可以将SAC的train_interval和num_update设置为N,将reward_signals下的reward_signal_num_update设置为M。默认其值为num_update。
buffer_init_steps训练之前预填充经验池的数据量。未经训练的策略是随机的,用随机动作预填充对于探索十分有用。
num_update:每个训练时间期间采样并用于训练的最小批量数。通常情况下,该值为1。
tau:SAC模型更新期间目标Q网络更新的快慢,因为存在Q和Target Q两个网络,每隔一段时间需要对Target Q进行更新,推荐:0.005-0.01
strength:原始奖励的倍乘系数,范围根据奖励信号变化。推荐:1.0
gamma:对应未来奖励的折扣因子。推荐:0.8-0.995
好奇心奖励信号:包括正向模型:采用当前已编码的观测值和动作,预测下一个已编码的观测值,逆向模型:采用agent的当前和下一个观测值,对它们进行编码,并使用编码来预测观测值之间采取的动作。正向模型的损失(预测值和实际值之间的差异)被用作内在奖励。
encoding_size:好奇心模块使用的编码大小,该值足够小可以鼓励ICM压缩原始的观察值,但太小也会导致ICM学习区分输出的行为和实际的行为。推荐:64-256
GAIL:即生成对抗模仿学习。和GANs类似。对于strength的设置取决于人的水平,人的演示很好这个值设高一点,推荐:0.01-1。
use_actions:鉴别器是根据观察和操作进行区分,还是仅仅根据观察值进行区分,如果希望agent模仿操作,则应该设为true,如果希望agent使用不同的操作达到相同的状态,则设为false。设为false更加稳定,特别是演示不完美的情况下,但学习速度较慢。
use_vail:是鉴别器学习一种更笼统的表示,降低了其在鉴别方面的过拟合,使学习更加稳定,但也会增加训练时间,如果模仿学习不成功,可以启用这个功能。
环境参数
为了控制环境参数,可以在下方再加上一段配置:
behaviors:
BehaviorY:
# < Same as above >
# Add this section
environment_parameters:
my_environment_parameter: 3.0
然后再Unity仿真中,可以通过以下方式访问参数:
Academy.Instance.EnvironmentParameters.GetWithDefault("my_environment_parameter", 0.0f);
为了使参数随机,我们可以不直接提供数值,而是让它自己采样,下面是包含三个环境参数的示例:
behaviors:
BehaviorY:
# < Same as above >
# Add this section
environment_parameters:
mass:
sampler_type: uniform
sampler_parameters:
min_value: 0.5
max_value: 10
length:
sampler_type: multirangeuniform
sampler_parameters:
intervals: [[7, 10], [15, 20]]
scale:
sampler_type: gaussian
sampler_parameters:
mean: 2
st_dev: .3
其中uniform是统一采样器,从给定最大值和最小值的范围中采样,gaussian是高斯采样器,给定均值和标准差从正态分布中采样。multirange_uniform是多范围均匀采样,根据区间的相对长度从一组区间中采用一个区间。从这个区间中统一采样一个单浮点值。
在3DBall的第二个配置文件中有这个用法。
定义采样器配置后,输入响应命令可以启用参数随机化的训练器配置(如下):
mlagents-learn config/ppo/3DBall_randomize.yaml --run-id=3D-Ball-randomize
Curriculum Learning
如果想启用课程学习,需要添加一段配置:
ehaviors:
BehaviorY:
# < Same as above >
# Add this section
environment_parameters:
my_environment_parameter:
curriculum:
- name: MyFirstLesson # The '-' is important as this is a list
completion_criteria:
measure: progress
behavior: my_behavior
signal_smoothing: true
min_lesson_length: 100
threshold: 0.2
value: 0.0
- name: MySecondLesson # This is the start of the second lesson
completion_criteria:
measure: progress
behavior: my_behavior
signal_smoothing: true
min_lesson_length: 100
threshold: 0.6
require_reset: true
value:
sampler_type: uniform
sampler_parameters:
min_value: 4.0
max_value: 7.0
- name: MyLastLesson
value: 8.0
name是用户定义的课程名称,completion_criteria决定了需要模拟的世间,当满足条件是课程转到下一个lessons,value就是环境参数在课程中需要采用的值。
measure是衡量学习进度和课程进展的依据,behavior指定正在跟踪的行为,可以有多个名称不同的行为,每个行为处于不同的训练点。此设置允许课程仅跟踪其中之一。threshold确定在measure的哪里增加课程的值。
min_lesson_length指的是更改课程之前应完成的最少episode数。如果measure
设置为reward
,min_lesson_length
将使用最后一集的平均累积奖励来确定课程是否应该更改。必须是非负的。重要提示:与阈值比较的平均奖励不同于记录到控制台的平均奖励。例如,如果min_lesson_length
是100
,则在最后一100
集的平均累积奖励超过当前阈值后,课程将增加。记录到控制台的平均奖励由summary_freq
上面定义的参数决定。
signal_smoothing决定是否按以前的值对当前进度度量进行加权。
require_reset决定更改课程是否需要重置环境(默认:false)。
一旦我们指定了我们的元课程和课程,我们就可以启动 mlagents-learn
指向包含我们课程的配置文件,PPO 将使用课程学习进行训练。例如,要通过课程学习在 Wall Jump 环境中训练智能体,我们可以运行:
mlagents-learn config/ppo/WallJump_curriculum.yaml --run-id=wall-jump-curriculum
后记
对于上面的命令不理解的不用着急,ML-Agents提供了一系列实例来演示大部分的功能,后面会一一开文章进行讲解。
以上是关于ML-Agents命令及配置大全的主要内容,如果未能解决你的问题,请参考以下文章