注:本文章为官方文档翻译,如有侵权行为请联系作者删除
Training Configuration File - Unity ML-Agents Toolkit–原文链接
ML-Agents:训练配置文件(一)
ML-Agents:训练配置文件(二)
ML-Agents:训练配置文件(三)
奖励信号
reward_signals
部分可指定外在(即基于环境的)和内在奖励信号(例如好奇心和 GAIL)的设置。每个奖励信号应至少定义两个参数 strength
和 gamma
,以及任何特定类别的超参数。请注意,若要移除某个奖励信号,应将其条目从 reward_signals
中完全删除。任何时候都应至少保留一个奖励信号的定义。请提供以下配置以设计您运行训练时的奖励信号。
外在奖励
启用这些设置以确保您的训练运行包含来自环境的奖励信号:
环境 | 描述 |
---|---|
extrinsic -> strength |
(默认值 = 1.0 环境所给奖励的乘数因子。典型范围会因奖励信号的不同而有所变化。 典型范围: 1.00 |
extrinsic -> gamma |
(默认值 = 0.99 )来自环境未来奖励的折扣因子。这可以理解为Agent应该关心未来多远的可能奖励。关注未来奖励的情况下,这个值应该较大。关注即时奖励的情况下,它可以较小。该值必须小于1。 典型范围: 0.8 -0.995 |
好奇心内在奖励
为了启用好奇心,请提供以下设置:
环境 | 描述 |
---|---|
curiosity -> strength |
(默认值 = 1.0 )内在好奇心模块产生的好奇心奖励的大小。应按环境奖励的大小对其进行调整,避免某项过大,使得Agent忽视好奇心奖励或环境奖励。典型范围: 0.001 -0.1 |
curiosity -> gamma |
(默认值 = 0.99 )未来奖励的折扣因子。 典型范围: 0.8 -0.995 |
curiosity -> network_settings |
请参阅“常见训练器配置”下的 network_settings 文档。这是内在好奇心模型所使用的网络规格。 hidden_units 的值应足够小,以促使 ICM 对原始观察结果进行压缩,但也不能太小,以免其无法学会区分预期观察结果和实际观察结果。典型范围: 64 -256 |
curiosity -> learning_rate |
(默认值 = 3e-4 )用于更新内在好奇心模块的学习率。如果训练不稳定且好奇心损失不稳定,通常应降低此值。 典型范围: 1e-5 -1e-3 |
GAIL 内在奖励
要启用 GAIL(假设您已经录制了演示),请提供以下设置:
环境 | 描述 |
---|---|
gail -> strength |
(默认值 = 1.0 )用于乘以原始奖励的系数。请注意,当使用带有外部信号的 GAIL 时,如果您的演示不是最佳的(例如来自人类),则应将此值设置得较低,以便训练有素的Agent将专注于接收外部奖励,而不是完全复制演示。在这些情况下,请将强度保持在 0.1 以下。 典型范围: 0.01 -1.0 |
gail -> gamma |
(默认值 = 0.99 )未来奖励的折扣因子。 典型范围: 0.8 -0.9 |
gail -> demo_path |
(必需,无默认值).demo 文件或 .demo 文件目录的路径。 |
gail -> network_settings |
请参阅“常见训练器配置”下的 network_settings 。这是 GAIL 辨别器的网络规格。 hidden_units 的值应足够小,以促使辨别器压缩原始观察结果,但也不能太小,以免其无法学会区分演示行为和实际行为。大幅增加此值也会对训练时间产生负面影响。典型范围: 64 - 256 |
gail -> learning_rate |
(可选,默认值 = 3e-4 )用于更新鉴别器的学习率。如果训练不稳定,并且 GAIL 损失不稳定,则通常应降低该值。 典型范围: 1e-5 -1e-3 |
gail -> use_actions |
(默认值 = false )确定鉴别器是否应基于观察和动作进行鉴别,还是仅基于观察。如果您希望Agent模仿演示中的动作,则设置为 True;如果您希望Agent访问与演示中相同的状态但可能具有不同的动作,则设置为 False。设置为 False 更可能保持稳定,尤其是在演示不完美的情况下,但学习速度可能会更慢。 |
gail -> use_vail |
(默认值 = false )在 GAIL 鉴别器中启用变分瓶颈。这会迫使鉴别器学习更通用的表示,并减少其在鉴别方面“太好”的倾向,从而使学习更加稳定。但是,这会增加训练时间。如果您注意到您的模仿学习不稳定,或者无法学习手头的任务,请启用此功能。 |
RND 内在奖励
随机网络蒸馏 (RND) 仅适用于 PyTorch 训练器。要启用 RND,请提供以下设置:
环境 | 描述 |
---|---|
rnd -> strength |
(默认值 = 1.0 )内在 rnd 模块产生的好奇心奖励的幅度。应对其进行缩放,以确保其足够大,不会被环境中的外部奖励信号所淹没。同样,它不应太大而淹没外部奖励信号。 典型范围: 0.001 -0.01 |
rnd -> gamma |
(默认值 = 0.99 )未来奖励的折扣因子。 典型范围: 0.8 -0.995 |
rnd -> network_settings |
请参阅“常见训练器配置”下的 network_settings 文档。RND 模型的网络规格。 |
curiosity -> learning_rate |
(默认值 = 3e-4 )用于更新随机网络去噪(RND)模块的学习率。该学习率应足够大,以使 RND 模块能够快速学习状态表示,但又不能过大,以免影响学习的稳定性。 典型范围: 1e-5 -1e-3 |
行为克隆
要将行为克隆作为预训练选项启用(假设您已录制演示),请在 behavioral_cloning
部分提供以下配置:
环境 | 描述 |
---|---|
demo_path |
(必需,无默认值)您的 .demo 文件的路径或包含 .demo 文件的目录的路径。 |
strength |
(默认值 = 1.0 )模仿学习率相对于 PPO 学习率的比例,大致对应于我们允许行为克隆(BC)对策略产生影响的程度。典型范围: 0.1 -0.5 |
steps |
(默认值 = 0 )在行为克隆(BC)期间,通常希望在Agent“看到”奖励后停止使用演示,并允许其在可用演示之外进行优化和/或泛化。steps 对应于行为克隆处于活动状态的训练步数。行为克隆的学习率将在这些步数内逐渐降低。将 steps 设置为 0 可实现整个训练过程中的恒定模仿。 |
batch_size |
(默认值 = 训练器的 batch_size )梯度下降更新一次迭代使用的演示经验数。如果未指定,则默认为batch_size 训练器的。 典型范围:(连续): 512 - 5120 ;(离散):32 -512 |
num_epoch |
(默认 =训练器的num_epoch )梯度下降过程中通过经验缓冲区的次数。如果未指定,则默认为 PPO 设置的时期数。 典型范围: 3 -10 |
samples_per_update |
(默认值 = 0 )在每次模仿更新期间使用的最大样本数量。如果您的演示数据集非常大,您可能需要降低此值以避免策略过度拟合演示数据。设置为 0 可在每次更新步骤中对所有演示进行训练。典型范围: buffer_size |
使用循环神经网络的记忆增强Agent
您可以通过在 network_settings
下添加 memory
部分,并设置 memory_size
和 sequence_length
来启用Agent使用内存:
环境 | 描述 |
---|---|
network_settings -> memory -> memory_size |
(默认值 = 128 )Agent必须保留的内存大小。为了使用 LSTM,训练需要一系列经验,而不是单一经验。对应于用于存储策略的循环神经网络隐藏状态的浮点数数组的大小。此值必须是 2 的倍数,并且应与您预期Agent需要记住的信息量成比例,以便成功完成任务。 典型范围: 32 -256 |
network_settings -> memory -> sequence_length |
(默认值 = 64 )定义训练期间经验序列的长度。请注意,如果此数字太小,Agent将无法在较长时间内记住事物。如果此数字太大,神经网络将需要更长时间进行训练。 典型范围: 4 -128 |
决定使用内存时需要考虑以下几点:
- LSTM 不适用于连续动作。请使用离散动作以获得更好的结果。
- 添加循环层会增加神经网络的复杂性,建议
num_layers
在使用循环时减少循环层。 - 要求
memory_size
能被2整除。
自我博弈
使用自我博弈进行训练会给强化学习通常面临的问题增加额外的混杂因素。一般来说,需要在最终策略的技能水平和通用性与学习稳定性之间进行权衡。与针对一组变化缓慢或不变且多样性较低的对手进行训练相比,针对一组变化迅速且多样性较高的对手进行训练可以获得更稳定的学习过程。在此背景下,本指南讨论了公开的自我博弈超参数以及调整它们的直觉。
如果您的环境包含分成多个团队的Agent,您可以利用我们的自我游戏训练选项,为每个行为提供以下配置:
环境 | 描述 |
---|---|
save_steps |
(默认值 = 20000 )训练器快照之间的步骤数。例如,如果 save_steps=10000 ,则每 10000 个训练器步骤会保存当前策略的快照。注意,训练器步骤是按每个Agent计算的。有关更多信息,请参阅 v0.13 之后的[迁移文档](Migrating - Unity ML-Agents Toolkit)。较大的 save_steps 值会产生涵盖更广泛技能水平和可能游戏风格的对手集合,因为策略接受了更多的训练。因此,Agent训练时面对的对手种类更加多样。学习一种能够击败更多样化对手的策略是一个更难的问题,所以可能需要更多的总体训练步骤,但最终也可能形成更通用和稳健的策略。此值还取决于环境对Agent而言固有的难度。典型范围: 10000 - 100000 |
team_change |
(默认值 = 5 * save_steps )在切换学习团队之间训练器步骤的数量。这是与特定幽灵训练器相关联的团队在另一个团队成为新的学习团队之前进行训练的训练器步骤数量。在不对称游戏中,可能需要较少的训练器步骤才能使对抗团队获得类似的性能提升。这使用户能够在每次团队切换时,为更复杂的Agent团队训练更多的训练器步骤,而不是为更简单的Agent团队训练。较大的 team-change 值能让Agent与对手对战更长时间。Agent与同一组对手对战的时间越长,就越能击败它们。然而,与对手对战时间过长可能会导致过度适应特定对手的策略,因此Agent在面对下一批对手时可能会失败。值 team-change 将决定保存多少个Agent策略的快照,以供用作另一队的对手。因此,我们建议将此值设置为之前讨论的 save_steps 参数的函数。典型范围:4 倍至 10 倍,其中 x = save_steps |
swap_steps |
(默认值 = 10000 )在将对手策略与不同快照交换之间进行的幽灵步数(非训练器步数)。一个“幽灵步”指的是遵循固定策略且不学习的Agent所采取的一步。之所以要区分这一点,是因为在不对称游戏中,我们可能会有Agent数量不等的团队,例如像我们的“前锋对守门员”示例环境中的 2 对 1 场景。拥有两个Agent的团队每环境步收集的Agent步数是拥有一个Agent的团队的两倍。因此,这两个值需要不同,以确保每个团队在相同的训练器步数下进行相同的对手策略交换次数。如果用户希望在总共 team-change 步中,拥有 num_agents 个Agent的团队与拥有 num_opponent_agents 个Agent的对手团队进行 x 次交换,则 swap_steps 的公式为: (num_agents / num_opponent_agents) * (team_change / x) 典型范围: 10000 - 100000 |
play_against_latest_model_ratio |
(默认值 = 0.5 )Agent与最新对手策略进行对战的概率。以概率 1 - play_against_latest_model_ratio ,Agent将与过去某次迭代中对手的快照进行对战。 较大的值 play_against_latest_model_ratio 表示Agent将更频繁地与当前对手对战。由于Agent正在更新其策略,因此对手在每次迭代中都会有所不同。这可能会导致不稳定的学习环境,但会为Agent带来更具挑战性的情况的自动课程,从而可能导致更强大的最终策略。 典型范围: 0.0 -1.0 |
window |
(默认值 = 10 )从中抽样Agent对手的过去快照的滑动窗口的大小。例如,大小window 为 5 将保存最后拍摄的 5 个快照。每次拍摄新快照时,最旧的快照将被丢弃。较大的值window 意味着Agent的对手池将包含更大的行为多样性,因为它将包含训练运行早期的策略。与save_steps 超参数一样,Agent会针对更广泛的对手进行训练。学习一种策略来击败更多样化的对手是一个更难的问题,因此可能需要更多的整体训练步骤,但也可能导致训练结束时产生更通用、更强大的策略。 典型范围: 5 -30 |
关于奖励信号的说明
我们假设轨迹中的最终奖励与情节的结果相对应。最终奖励 +1 表示获胜,-1 表示失败,0 表示平局。ELO 计算(如下所述)取决于此最终奖励是 +1、0 还是 -1。
奖励信号仍应按照其他训练器的文档中所述使用。但是,由于对抗性游戏中学习的不稳定性和非平稳性,我们鼓励用户在塑造奖励函数时要更加保守一些。具体来说,我们鼓励用户从最简单的奖励函数(+1 获胜,-1 失败)开始,并允许更多训练迭代以补偿奖励的稀疏性。
交换步骤说明
举例来说,在 2v1 场景中,如果我们希望在 team-change=200000 步骤中交换发生 x=4 次,则一个Agent的团队的 swap_steps 为:
swap_steps = (1 / 2) * (200000 / 4) = 25000 两名Agent的团队的 swap_steps 为:
swap_steps = (2 / 1) * (200000 / 4) = 100000 注意,如果团队规模相同,则第一个项等于 1,并且 swap_steps 可以通过将总步数除以所需的交换次数来计算。
swap_steps 的值越大,意味着Agent将在更长的训练迭代次数中与同一个固定对手对战。这会带来更稳定的训练场景,但Agent也有可能过度拟合该特定对手的行为。因此,当更换新对手时,Agent可能会比预期更频繁地失败。
鉴于作者水平有限,本文可能存在不足之处,欢迎各位读者提出指导和建议,共同探讨、共同进步。