赞
踩
本文首发于:行者AI
Unity 是全球最受欢迎的游戏开发引擎之一,有大量的游戏开发者在使用Unity开发他们的游戏。在这个AI、大数据等流行词遍布各行各业的时代,Unity也没有被潮流抛下,推出了他们自己的基于深度强化学习来训练游戏AI的工具包Unity ML-agents。这个工具包功能丰富,十分强大。可以帮助你在你的游戏内实现一个新的AI算法,并且快速的用到你的游戏当中。这么强大的工具包难以在一篇文章里面概括其所有功能。本文就先抛砖引玉,稍微讨论一下Unity ML-agents训练的时候需要用到的各种参数的意义,其常用的取值又是如何。
本文所有内容参考Unity ML-agents的官方文档(地址:https://github.com/Unity-Technologies/ml-agents/tree/main/docs)
在你开始你的训练之前,你需要针对你的训练任务设定一个训练参数文件(一般是一个.yaml文件)。
接下来就简单介绍一下ml-agents环境里的参数设置概要。本文主要参考ml-agents最新版本关于参数设置的官方文档,做了一些概括性的翻译并加入一定个人理解。
具体文档地址:https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Training-Configuration-File.md
训练参数主要分为常用训练参数(Common Trainer Configurations), 训练方式专用参数(Trainer-specific Configurations),超参数(hyper-parameters) ,奖励信号参数(Reward Signals), 行为克隆(Behavioral Cloning),使用RNN增强智能体记忆能力的参数(Memory-enhanced Agents using Recurrent Neural Networks),以及自我对抗训练参数(Self-Play)这几个大的模块。这几个模块下面又有一些小的模块,在后文会进一步说明,而且这些模块并不需要总是全都去设定。事实上,除了前三个模块是几乎每个环境训练必须的参数之外,其他的模块仅用在需要使用到对应功能的训练任务。接下来具体说明每个参数的含义。
trainer_type: (default = ppo
) 这个参数决定了使用什么智能体训练算法,现在暂时只支持Proximal Policy Gradient(PPO,具体应为OpenAI版本的PPO2),Soft Actor-Critic(SAC),以及MA-POCA。前两种都只是单智能体训练算法。 注意:在你改动了训练算法后,记得去调整一下后面的相应参数。对于不同的算法,下面的参数也往往有不同的适用范围,并非无缝衔接的。下面会具体说明。
summary_freq: (default = 50000
) 这个参数决定了多少步数(step)之后,开始记录我们的训练统计数据。
time_horizon: (default = 64
) 这个参数决定了在多少步数之后,开始把收集到的经验数据放入到经验池(experience buffer)。这个量同样也决定了使用多少步后的采样来对当前动作的预期奖励进行训练。简单来说,这个值如果越大,就相当于你更接近于一局(episode)游戏的真实回报,从而偏差更小。但是由于要进行一局游戏才能更新一个动作的奖励预期,这个过程相当的长,并且每局游戏可能情况变化很大。不同局之间,做同样的动作可能最终收益大相径庭(因为这个动作可能其实对这个游戏的影响根本没有那么大),从而导致方差较大。反过来,当你采样的步数太小,可能对最终的奖励预估会偏差很大,但是可能带来较小的方差。其实这也跟机器学习里面经典的简单模型复杂模型(过拟合欠拟合)问题一样,需要在方差和偏差当中取一个平衡。官方建议当你的环境太大(跑一步耗时太长)或者你设置的奖励比较密集的时候,可以把这个值设的低一点,反之则需要增大。比如在足球比赛这样奖励非常稀疏的任务当中,范例文档设置的该参数值为1000。 注意,这个参数决定了采样的步数,和batch_size、 buffer_size、 epoch等参数亦有联系。后面提到这些参数的时候会再对其中关系加以说明。常见范围:32 - 2048
max_steps: (default = 500000
) 这个参数决定了本次训练任务总共会进行多少步数。如果你有多个同样动作的智能体,他们每个的步数都会计入到这个总步数当中;同样的,如果你有多个环境并行的在多台服务器上运行,所有环境里的智能体的总步数都会计入考虑。所以,当你并行训练多agent算法的时候,务必将这个值设的更大一些。常见范围:5e5 - 1e7
keep_checkpoints: (default = 5
) 这个参数决定了保留多少个训练时候产生的checkpoint,其中每一个checkpoint都是在checkpoint_interval步数后产生的。
checkpoint_interval: (default = 500000
) 如前文所说,这个参数决定了每多少步数以后,你的模型会存储一个节点。
init_path: (default=None) 这个参数决定了你的模型是否从某个之前训练好的模型存储点继续训练。需要提供模型的确切位置,比如说,./models/{run-id}/{behavior_name}
。其实在训练的时候,使用–initialize-from这个CLI参数就足以让所有的训练任务从同一个存储模型继续训练,提供这个参数是为了方便让不同的训练从不同的模型继续训练(需要逐个设定)。很少用到
threaded:(default = false
) 开启python的多线程功能来实现一边训练一边存储模型,避免I/O消耗太多时间。官方建议在开启self-play功能的时候尽量避免使用该功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。