您现在的位置是:首页 >技术教程 >Unity-ML-Agents注意事项及报错、警告等解决方式网站首页技术教程
Unity-ML-Agents注意事项及报错、警告等解决方式
1.注意事项
1.1 ml-agents 0.28.0找不到Scripts/Brain组件?
在 ml-agents 0.16.0 版本中,Unity 中的 ML-Agents 插件中包含了名为 Brain
的组件,用于控制智能体的决策过程。然而,在 ml-agents 0.28.0 版本中,该组件已经被重构为 IAgent
接口和 Agent
类。因此,如果您正在使用 ml-agents 0.28.0 或更高版本,您不会在 Unity 的 "Add Component" 菜单中找到 Brain
组件。相反,您应该使用 IAgent
接口和 Agent
类来控制智能体的行为和决策过程。
1.2 ML-Agents SDK
ML-Agents SDK(Machine Learning Agents Software Development Kit)是由Unity Technologies开发的一款用于训练AI智能体的开发工具包。该工具包利用深度强化学习技术,使开发者可以通过Unity引擎创建虚拟环境,让AI智能体在其中进行学习,最终实现自主决策的能力。
ML-Agents SDK提供了一系列组件和工具,包括智能体、环境、训练、评估和推理等,使得开发者可以更加方便地进行机器学习和深度强化学习的开发工作。同时,ML-Agents SDK还支持多种深度学习框架,如TensorFlow和PyTorch等。它包含了许多功能模块,例如Agent、Brain、Environment等,这些模块可以协同工作,使得用户可以方便地构建和训练强化学习模型。
其中,Agent表示智能体,它是一个能够感知环境、做出决策并执行动作的实体。Brain表示智能体的大脑,它用于训练智能体,并且决定智能体在不同状态下应该采取何种动作。Environment表示虚拟环境,用于模拟智能体在现实世界中的行为和情境。用户可以使用Unity创建一个虚拟环境,并在其中创建Agent和Brain,然后使用ML-Agents SDK进行训练和测试。
总的来说,ML-Agents SDK是一个非常强大的工具,可以帮助用户快速构建和训练强化学习模型,特别适合需要在虚拟环境中进行试验和仿真的应用场景。
1.3 perform inference
Inference Only
- the Agent will always perform inference.
Inference是机器学习中一种使用训练好的模型对新数据进行预测或分类的过程。在这个场景中,"perform inference"的意思是Agent只会使用已经训练好的模型,而不会进行任何的训练。也就是说,Agent只会进行推断,根据已有的知识来做出决策,而不会再进行学习。
Heuristic Only
- the Agent will always use theHeuristic()
method.
Heuristic() 方法是指在强化学习中,一种基于规则或经验的决策方法。当 Agent 被设置为“仅启发式方法”时,它将始终使用此方法作为其行为策略。在这种情况下,Agent 将不会接受任何来自外部环境的观察和奖励信息,而是将根据其启发式方法进行动作选择。一般而言,这种方法是一种简单的“手工设计”的策略,可能不具备在复杂环境中进行智能决策所需的复杂度和灵活性。
当使用 "Heuristic Only" 模式时,代理程序将忽略神经网络模型,而是直接使用 "Heuristic()" 方法来决定每一步的行动。这意味着您可以手动编写一个简单的算法来控制代理的行动,而不需要训练神经网络。这在调试和测试模型时非常有用,因为您可以随时查看代理程序的行为,而不必等待训练完成。但是,这种方法也存在一些限制,因为它可能无法探索所有可能的策略,并且通常比使用深度强化学习训练的代理程序的性能差。
Default
- the Agent will train if they connect to a python trainer, otherwise they will perform inference.
在 Unity ML-Agents 中,Default 是默认的 Agent 行为模式,它根据 Agent 是否与 Python Trainer 相连来判断 Agent 的操作模式。如果 Agent 与 Python Trainer 相连,则会进行训练;否则,将执行推断(inference)操作。推断是指 Agent 将使用训练好的模型进行预测并采取行动,而不会在此过程中更新模型的权重。在 Default 模式下,如果 Agent 未与 Trainer 相连,那么它将仅仅使用模型进行推断操作。
1.4 MonoBehaviour 和 Agent 基类
Unity 中的 MonoBehaviour
是一个重要的基类,它提供了许多实用的方法和属性,用于处理游戏对象的生命周期、输入事件、物理事件等。MonoBehaviour
可以在自己的派生类中被重载和扩展,以实现更加具体的功能。
在 ML-Agents 的 Agent 中,它的基类是 Agent
,它提供了许多与强化学习相关的方法和属性,用于与智能体环境进行交互,例如:观察环境、决策动作、接收奖励等。与此同时,Agent 还可以重载 MonoBehaviour
中的方法,例如:Update()
、OnTriggerEnter()
等,以实现更加具体的功能。
1.5 Training on Headless Server
Training on Headless Server是指在没有显示器和图形界面的服务器上进行训练。这种服务器通常被称为Headless Server,因为它们没有图形界面,用户只能通过终端或者远程登录进行操作。在这种情况下,训练过程需要通过命令行界面进行配置和启动,并且所有的输出结果都会以文本形式在终端中显示。
使用Headless Server进行训练的好处在于可以充分利用服务器的计算资源,而不必担心图形界面对计算性能的影响。此外,使用Headless Server还可以节省成本,因为通常来说,Headless Server比带有图形界面的服务器价格更低。
在深度学习领域,使用Headless Server进行训练是非常常见的,特别是在大规模模型训练或者超参数调整时。例如,训练大规模的神经网络模型需要大量的计算资源和内存,这些计算资源可以通过Headless Server来获得,同时通过使用分布式训练技术,可以进一步提高训练效率。
1.6 ML-Agents Toolkit (v0.14)中的0.14
在 ML-Agents Toolkit (v0.14) 中的版本号“0.14”指的是软件的版本号。这是一种常见的方式,开发人员通常使用版本号来跟踪软件的不同版本,以便用户和其他开发人员可以知道他们正在使用哪个版本,并根据需要进行更新或回滚。在 ML-Agents Toolkit 中,版本号通常表示软件的主要功能和更新内容。
ML-Agents Toolkit (v0.14) 对应的是 ML-Agents Release 0.14.x 版本。其中的 "0.14" 指的是该版本的主要版本号,即该版本是从 ML-Agents 项目的主要版本中发布的。".x" 表示在该主要版本中的某个特定的次要版本中发布的。因此,ML-Agents Release 0.14.x 包括所有次要版本为 0.14 的发布。
1.7 Elo rating system
Elo评分系统是一种常见的用于测量竞技比赛中选手等级的算法。它最初是由国际象棋大师艾洛(Arpad Elo)为了计算棋手等级而提出的,现在也广泛应用于其他竞技项目中。
在Elo评分系统中,每个选手都有一个初始的分数,一般为1500分。比赛结束后,赢者将获得一定数量的分数增加,而输者将失去一定数量的分数。分数变化的多少取决于两个选手的初始分数以及他们在比赛中的表现。分数变化的计算方式采用的是一个称为期望胜率的数学公式。
通过这种方式,Elo评分系统可以根据选手的表现动态调整他们的等级,从而更加准确地反映选手的实际水平。该系统还可以应用于团队竞技项目中,例如足球、篮球等,通过对每个队员的分数进行加权平均来计算整个团队的等级。
1.8 Reward Signals
The
reward_signals
section enables the specification of settings for both extrinsic (i.e. environment-based) and intrinsic reward signals (e.g. curiosity and GAIL). Each reward signal should define at least two parameters,strength
andgamma
, in addition to any class-specific hyperparameters. Note that to remove a reward signal, you should delete its entry entirely fromreward_signals
. At least one reward signal should be left defined at all times.
reward_signals 是一个配置项,可以用来设置训练中使用的奖励信号,包括外在奖励(即基于环境的奖励)和内在奖励(例如好奇心和 GAIL 等)。每个奖励信号都应该定义至少两个参数,即强度(strength)和折扣率(gamma),以及任何类特定的超参数。注意,如果要删除一个奖励信号,应该完全从 reward_signals 中删除其条目。同时,至少应该始终定义一个奖励信号。
问:如果要删除一个奖励信号,应该完全从 reward_signals 中删除其条目。同时,至少应该始终定义一个奖励信号?
这句话的意思是,如果你想要删除一个奖励信号,你不仅需要将该奖励信号的参数值设置为 0,还需要从 reward_signals
配置项中完全删除该奖励信号的条目,即删除包含该奖励信号名称及其参数的整个字典。如果只是将其参数值设置为 0,该奖励信号仍然会在训练过程中存在,但是它不会对智能体的行为产生任何影响。
另外,reward_signals
配置项中至少需要定义一个奖励信号,因为至少需要一个奖励信号来引导智能体进行学习。如果你将所有的奖励信号都删除了,智能体就不会接收到任何奖励信号,也就无法进行学习。
例子:
假设在 reward_signals
中定义了两个奖励信号,分别为 "extrinsic"
和 "intrinsic"
,其中 "extrinsic"
为外部环境提供的奖励,而 "intrinsic"
为基于智能体行为的奖励信号。如果你想要删除 "intrinsic"
奖励信号,那么你需要从 reward_signals
中完全删除 "intrinsic"
的配置,即将该奖励信号的条目从字典中删除。
如果你只是将 "intrinsic"
奖励信号的参数值设置为 0,例如:
reward_signals:
extrinsic:
strength: 1.0
gamma: 0.99
intrinsic:
strength: 0.0
gamma: 0.99
那么 "intrinsic"
奖励信号仍然会存在,虽然其强度(strength)设置为 0,但在训练过程中它仍然会占据计算资源,这可能会导致训练速度变慢或占用过多的内存。因此,建议在删除奖励信号时,要从 reward_signals
中完全删除其条目。
2.警告和报错
2.1 警告
e:ml-agents-release_19ml-agentsmlagents rainers orchutils.py:309: UserWarning: This overload of nonzero is deprecated:
nonzero()
Consider using one of the following signatures instead:
nonzero(*, bool as_tuple) (Triggered internally at .. orchcsrcutilspython_arg_parser.cpp:882.)
res += [data[(partitions == i).nonzero().squeeze(1)]]
这个 UserWarning 提示是由 PyTorch 在调用 nonzero()
函数时触发的。这是因为在 PyTorch 1.7 版本中,nonzero()
函数的函数签名有所更改,原先的 nonzero()
函数签名已被弃用,现在的建议使用新的函数签名。但是,此更改不应该对代码的运行产生任何实际影响,仅仅是一个警告。
如果您想避免此警告,可以根据警告信息提供的提示,使用新的 nonzero(*, bool as_tuple)
函数签名。例如,将 nonzero()
替换为 nonzero(as_tuple=True)
可以消除此警告。或者,您也可以通过设置环境变量 PYTHONWARNINGS=ignore::UserWarning
来在运行代码时禁用此警告。