孙广东 2018.5.20
Unity 官方github主页上ml-agents 文档,传送门是: (插件在正式发布后,文档肯定会放到 https://docs.unity3d.com/Manual/index.html 中)
中文: https://github.com/Unity-Technologies/ml-agents/tree/master/docs/localized/zh-CN
英文: https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Readme.md
超多Demo案例: https://connect.unity.com/challenges/ml-agents-1Unity中文官方社区发表过的相关文章:
官方描述: Unity Machine Learning Agents (ML-Agents) 是一款开源的 Unity 插件, 使得我们得以在游戏环境和模拟环境中训练智能 agent。您可以使用 reinforcement learning(强化学习)、imitation learning(模仿学习)、neuroevolution(神经进化)或其他机器学习方法, 通过简单易用的 Python API进行控制,对 Agent 进行训练。我们还提供最先进算法的实现方式(基于 TensorFlow),让游戏开发者和业余爱好者能够轻松地 训练用于 2D、3D 和 VR/AR 游戏的智能 agent。 这些经过训练的 agent 可用于多种目的, 包括控制 NPC 行为(采用各种设置, 例如多个 agent 和对抗)、对游戏内部版本进行自动化测试、以及评估不同游戏设计决策的预发布版本。ML-Agents 对于游戏开发者和 AI 研究人员双方 都有利,因为它提供了一个集中的平台, 使得我们得以在 Unity 的丰富环境中测试 AI 的最新进展, 并使结果为更多的研究者和游戏开发者所用。
官方用 多玩家战争主题 游戏 中的 军医 AI介绍, 很多概念。
凭借 ML-Agents,您可以使用各种方法来_训练_这类 NPC (称为 agent)的行为。基本理念很简单。 我们需要在游戏(称为环境)的每个时刻定义 三个实体:
ML-Agents 提供了所有必要工具,从而使我们得以利用 Unity 作为 模拟引擎来学习 Unity 环境中不同对象的 policy。
ML-Agents 是一个 Unity 插件,它包含三个高级组件:
ML-Agents 的简化框图。
学习环境包含三个可帮助组织 Unity 场景的 附加组件:
每个学习环境都会有一个全局的 Academy ,与每一个游戏角色一一对应的多个 Agent。虽然每个 Agent 必须与一个 Brain 相连, 但具有相似观测和动作的多个 Agent 可关联到 同一个 Brain。在我们的示例游戏中,我们有两个各自拥有 自己军医的军队。因此,在我们的学习环境中将有两个 Agent, 每名军医对应一个 Agent,但这两个军医都可以关联到同一个 Brain。 请注意,这两个军医与同一个 Brain 相连的原因是,他们的观测和动作_空间_ 是相似的。这并不意味着在每种情况下 他们都会有相同的观测和动作_值_。换句话说, Brain 定义了所有可能的观测和动作的空间, 而与之相连的 Agent(在本示例中是指军医)可以各自拥有 自己独特的观测和动作值。如果我们将游戏 扩展到包含坦克驾驶员 NPC,那么附加到这些角色的 Agent 不能与连接到军医的 Agent 共享一个 Brain(军医和驾驶员 有不同的动作)。
示例游戏的 ML-Agents 的示例框图。
我们尚未讨论 ML-Agents 如何训练行为以及 Python API 和 External Communicator 的作用。在我们深入了解这些细节之前, 让我们总结一下先前的组件。每个游戏角色上附有一个 Agent, 而每个 Agent 都连接到一个 Brain。Brain 从 Agent 处接收观测结果和奖励并返回动作。Academy 除了能够控制环境参数之外,还可确保所有 Agent 和 Brain 都处于同步状态。那么,Brain 如何控制 Agent 的动作呢?
实际上,我们有四种不同类型的 Brain,它们可以实现广泛的训练和预测情形:
根据目前所述,External Communicator 和 Python API 似乎 只能由 External Brain 所用。实际并非如此。 我们可以配置 Internal、Player 和 Heuristic 类型的 Brain, 使它们也能通过 External Communicator(一种称为 broadcasting 的功能) 将观测结果、奖励和动作发送给 Python API。我们很快就会 看到,这样可以实现其他的训练模式。
一个包含多个 Agent 和 Brain 的场景的 可能配置示例。
鉴于 ML-Agents 的灵活性,我们可以通过多种方式进行训练 和预测。
如前所述,ML-Agents 附带了多种用于训练智能 agent 的 最先进算法的实现。在此模式下, Brain 类型在训练期间设置为 External,在预测期间设置为 Internal。 更具体地说,在训练期间,场景中的所有军医 通过 External Communicator 将他们的观测结果发送到 Python API (这是采用 External Brain 时的行为)。Python API 会处理这些观测结果并发回 每个军医要采取的动作。在训练期间,这些动作大多是 探索性的,旨在帮助 Python API 学习每位军医的 最佳 policy。训练结束后,便可导出每个军医 所学的 policy。由于我们所有的实现都基于 TensorFlow, 因此所学的 policy 只是一个 TensorFlow 模型文件。然后在预测阶段, 我们将 Brain 类型切换为 Internal,并加入从训练阶段 生成的 TensorFlow 模型。现在,在预测阶段,军医 仍然继续生成他们的观测结果,但不再将结果发送到 Python API,而是送入他们的嵌入了的 Tensorflow 模型, 以便生成每个军医在每个时间点上要采取的_最佳_动作。
总结一下:我们的实现是基于 TensorFlow 的,因此, 在训练期间,Python API 使用收到的观测结果来学习 TensorFlow 模型。然后在预测过程中该模型将嵌入到 Internal Brain 中,以便为连接到该 Brain 的所有 Agent 生成 最佳动作。请注意,我们的 Internal Brain 目前是实验性的, 因为它仅限于 TensorFlow 模型并会利用第三方 TensorFlowSharp 库。
3D Balance Ball 示例入门 教程使用 3D Balance Ball 示例环境介绍了此训练模式。
先前的模式中使用 External Brain 类型进行训练, 从而生成 Internal Brain 类型可以理解和使用的 TensorFlow 模型。然而,ML-Agents 的任何用户都可以利用自己的算法 进行训练和预测。在这种情况下,训练阶段和预测阶段 的 Brain 类型都会设置为 External,并且场景中所有 Agent 的行为 都将在 Python 中接受控制。
我们目前没有教程介绍这种模式,但您可以在这里 了解有关 Python API 的更多信息。
此模式是_内置训练和预测_的扩展, 在训练复杂环境中的复杂行为时特别 有用。Curriculum learning(课程学习)是一种训练机器学习模型 的方式,这种训练方式会逐渐引入问题较难理解的方面, 使该模型总是受到最佳挑战。这种思路已经存在了 很长一段时间,这也是我们人类通常学习的方式。比如 任何童年时期的初等教育,课程和主题都会 进行排序。例如,先教算术,再教代数。 同样,先教代数,再教微积分。前期课程中学到的技能和知识为 后期的课程提供了基础。机器学习 也是同样的道理,对较简单任务的训练可以为将来 较难的任务提供基础。
数学课程的示例。从简单主题到复杂主题的课程进度安排, 后一个课程基于前一个课程。
当我们考虑 reinforcement learning(强化学习)的实际原理时, 学习信号是在整个训练过程中偶尔收到的奖励。 训练 agent 完成此任务时的起点将是一个 随机 policy。该起始 policy 将使 agent 随意转圈, 这样的行为在复杂环境中可能永远不会获得奖励或极少 获得奖励。因此,通过在训练开始时简化环境, 我们可让 agent 将随机 policy 快速更新为更有意义的 policy, 即,随着环境逐渐复杂化,policy 也会不断 改进。在我们的示例中,我们可以考虑当每个队只包含一个 玩家时,首先训练军医,然后再反复增加玩家人数 (即环境复杂度)。ML-Agents 支持在 Academy 内设置自定义环境参数。因此, 可以根据训练进度动态调整与难度或复杂性相关的 环境要素(比如游戏对象)。
使用 Curriculum Learning(课程学习)进行训练 教程使用 Wall Area 示例环境介绍了此训练模式。
简单地展示我们希望 agent 执行的行为, 而不是试图通过试错法来让它学习,这种方式 通常会更直观。例如,这种模式不是通过 设置奖励功能来训练军医,而是通过游戏控制器提供军医 应该如何表现的示例。更具体地说, 在这种模式下,训练期间的 Brain 类型设置为 Player, 并且所有使用控制器执行的动作(不仅包括 agent 观测) 都将被记录并发送到 Python API。imitation learning(模仿学习) 算法随后将会使用这些来自人类玩家的观测结果以及他们对应的动作来 学习 policy。
使用 Imitation Learning(模仿学习)进行训练教程 使用 Banana Collector 示例环境介绍了此训练模式。
虽然迄今为止的讨论都主要集中在使用 ML-Agents 对单个 agent 进行训练 方面,但同时实现多种训练方案也是可能的。 我们很高兴看到社区创建了许多新奇而有趣的 环境。刚开始训练智能 agent 的新用户可以参考以下一些示例 来获得灵感:
除了提供灵活的训练方案外,ML-Agents 还 包含其他功能,可用于提高训练过程的灵活性和 解释能力。
按需决策 - 使用 ML-Agents 可以让 agent 仅在需要时 才请求决策,而不是在环境的每一步都 请求决策。这种方案可用于训练基于回合的游戏、 agent 必须对事件作出反应的游戏, 或 agent 可以采取持续时间不同的动作 的游戏。在每一步决策与按需决策之间切换 只需点击一下按钮即可实现。您可以在 此处了解更多关于按需决策功能的 信息。
记忆增强 Agent - 在某些情况下, agent 必须学会记住过去才能做出 最好的决策。当 agent 只能部分观测环境时, 跟踪过去的观测结果可以帮助 agent 学习。我们在 教练中提供了一种_长短期记忆_ (LSTM) 的实现,使 agent 能够存储要在未来步骤中 使用的记忆。您可以在 此处了解有关在训练中启用 LSTM 的更多信息。
监控 Agent 的决策过程 - 由于 ML-Agents 中的通信 是双向通道通信,因此我们在 Unity 中提供了一个 agent Monitor 类, 这个类可以显示经过训练的 agent 的各个方面, 例如 agent 对自己在 Unity 环境中的表现(称为价值估算) 的感知。通过利用作为可视化工具的 Unity 并实时提供 这些输出,研究人员和开发人员可以更轻松地 调试 agent 的行为。您可以在 此处了解更多关于使用 Monitor 类的信息。
复杂的视觉观测 - 在其他平台中,agent 的观测可能 仅限于单个向量或图像,与之不同的是,ML-Agents 允许 每个 agent 使用多个摄像机进行观测。因此,agent 可以 学习整合来自多个视觉流的信息。这在多种情况下 都会很有用,例如训练需要多个摄像头且摄像头具有 不同视角的自动驾驶车辆,或可能需要整合空中视觉和 第一人称视觉的导航 agent。您可以在此处了解更多关于向 agent 添加视觉观测的 信息。
Broadcasting - 如前所述,默认情况下,External Brain 会将 其所有 Agent 的观测结果发送到 Python API。这对 训练或预测很有帮助。Broadcasting 是一种可以为 其他三种模式(Player、Internal、Heuristic)启用的功能, 这种情况下的 Agent 观测和动作也会发送到 Python API (尽管 Agent 不受 Python API 控制)。Imitation Learning(模仿学习) 会利用这一功能,此情况下会使用 Player Brain 的观测和动作 来通过示范的方式学习 agent 的 policy。 不过,这对 Heuristic 和 Internal Brain 也有帮助, 特别是在调试 agent 行为时。您可以在 此处了解更多关于使用 broadcasting 功能的 信息。
Docker 设置(测试功能) - 为了便于在不直接安装 Python 或 TensorFlow 的情况下设置 ML-Agents, 我们提供了关于如何创建和运行 Docker 容器的 指南。由于渲染视觉观测的限制, 该功能被标记为测试功能。
AWS 上的云训练 - 为了便于在 Amazon Web Services (AWS) 机器上使用 ML-Agents,我们提供了一份 指南 让您了解如何设置 EC2 实例以及公共的预配置 Amazon Machine Image (AMI)。
注意因为插件的正式版 没有到来,所有什么都有可能改变,所以还是关注官方的英文文档。 了解最近内容。