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 the Heuristic() 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

官方文档:https://github.com/Unity-Technologies/ml-agents/blob/release_19/docs/Training-Configuration-File.md#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 parametersstrength and gamma, in addition to any class-specific hyperparameters. Note that to remove a reward signal, you should delete its entry entirely from reward_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_19\ml-agents\mlagents\trainers\torch\utils.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  ..\torch\csrc\utils\python_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 来在运行代码时禁用此警告。

2.2 报错

2.2.1 Curl error 60

Curl error 60: Cert verify failed: UNITYTLS_X509VERIFY_FLAG_USER_ERROR1

Curl error 60通常表示SSL证书验证失败。该错误提示指出SSL证书的验证过程中出现了问题,可能是由于证书不受信任、证书过期、证书链不完整或证书配置错误等原因导致的。

错误消息中的"UNITYTLS_X509VERIFY_FLAG_USER_ERROR1"是Unity引擎中使用的SSL库的一个错误代码,表示用户自定义的证书验证错误。这可能是在使用Curl库进行网络请求时,遇到了证书验证错误,因此导致了该错误消息的出现。

解决此问题的方法通常有以下几种:

①证书信任链:确保你的请求目标网站的SSL证书是由受信任的证书颁发机构(CA)签发的,而不是自签名证书。如果使用自签名证书,你可能需要将其添加到信任证书存储区,或者在代码中禁用SSL证书验证(不推荐,因为会存在安全风险)。

②证书有效性:检查目标网站的SSL证书是否已过期。过期的证书会导致验证失败。确保目标网站及其证书都是有效的。

③证书配置:检查证书的配置是否正确。这包括证书的有效性、证书链的完整性、证书的密钥匹配等。确保证书的配置没有问题。

④Curl选项:在使用Curl库时,你可以尝试设置一些特定的选项来处理证书验证问题。例如,禁用证书验证可以使用CURLOPT_SSL_VERIFYPEER选项设置为false,但这会降低安全性,因此不推荐在生产环境中使用。

请注意,具体的解决方法可能因你的具体环境和代码实现而有所不同。建议仔细检查证书配置和证书验证过程,确保证书的有效性和正确性。如有需要,还可以查阅Curl和Unity文档,以获取更多关于证书验证和SSL连接的信息和指导。

 为何刷新之后,错误就消失了?

当你刷新之后错误消失的情况,可能是由于以下原因之一:

①证书更新:目标网站可能在你刷新页面之后更新了其SSL证书。如果之前的证书存在问题(如过期、配置错误等),而在刷新之后进行了更新,那么验证错误就不再出现。

②缓存问题:有时,浏览器或其他网络客户端会对SSL证书进行缓存。如果之前的证书已经缓存,并且出现了验证错误,刷新页面可能会清除缓存并重新获取最新的证书信息。这可能导致错误不再出现。

③临时网络问题:在某些情况下,网络连接可能会出现临时问题,导致证书验证失败。刷新页面可能会重新建立连接,并且在重新验证证书时可能会解决此类临时问题。

无论是哪种情况,当刷新页面后错误消失时,可以认为是与证书相关的问题在刷新后得到了解决。然而,仍然建议确保目标网站的证书配置正确,并且与你的应用程序的证书验证过程保持一致。这样可以确保在日常使用中不会遇到类似的证书验证错误。

2.2.2 行尾符问题

There are inconsistent line endings in the 'Assets/ML-Agents/Examples/Soccer/Scripts/SoccerEnvController.cs' script. Some are Mac OS X (UNIX) and some are Windows. This might lead to incorrect line numbers in stacktraces and compiler errors. Many text editors can fix this using Convert Line Endings menu commands. UnityEditor.AssetDatabase:Refresh () Microsoft.Unity.VisualStudio.Editor.VisualStudioIntegration/<>c__DisplayClass8_0:<RunOnceOnUpdate>b__0 () (at Library/PackageCache/com.unity.ide.visualstudio@2.0.17/Editor/VisualStudioIntegration.cs:100) UnityEditor.EditorApplication:Internal_CallUpdateFunctions ()

这个错误提示表明在脚本文件"Assets/ML-Agents/Examples/Soccer/Scripts/SoccerEnvController.cs"中存在不一致的行尾符问题,一些行尾符为Mac OS X(UNIX)格式,而另一些行尾符为Windows格式。这可能会导致堆栈跟踪中的行号不正确,并且可能引发编译器错误。

为了解决这个问题,你可以使用文本编辑器的"Convert Line Endings"菜单命令将所有行尾符转换为统一的格式。在Unity编辑器中,你可以尝试执行"AssetDatabase.Refresh()"方法来刷新资源数据库,然后重新打开脚本文件,这有助于解决该问题。

另外,根据错误信息中的堆栈跟踪,它似乎涉及到Visual Studio的集成插件。你可以尝试更新或重新安装Visual Studio插件以确保其正常运行。

是因为我在脚本添加了中文注释的原因吗?

通常情况下,中文注释不会导致行尾符不一致的问题。这个警告通常是由于不同操作系统(如Mac OS X和Windows)在处理行尾符时使用了不同的约定。

如果你的脚本文件在不同操作系统之间进行了复制、转移或共享,并且这些操作系统使用了不同的行尾符约定,那么就可能出现这个问题。

为了解决这个问题,你可以使用文本编辑器的相关功能将整个脚本文件中的行尾符转换为一致的格式(例如,统一使用UNIX风格的行尾符)。这样可以确保脚本在不同操作系统上都能正常工作。

请注意,中文注释本身并不是导致行尾符不一致的原因,但是在解决问题时,你可以尝试移除或暂时禁用中文注释,以确认它们是否与行尾符问题相关。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天寒心亦热

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值