在虚幻引擎4和5中创建机器学习AI代理

思想制造者概论:https://www.youtube.com/watch?v=mer_pzhapia
蓝图概述:https://youtu.be/tuo423nujek
Discord组:https://discord.gg/shxfwtmsha
Mindmaker AI插件是一个开源插件,可在UE4和UE5中的游戏和仿真充当培训自动驾驶机器学习剂的OpenAI健身环境。该插件促进了包含学习环境的不真实引擎项目与一个Python ML库之间的网络连接,该项目将来自虚幻引擎的数据接收到来自自定义的OpenAI健身房环境中,以培训代理商。如果您使用Mindmaker的远程ML Server创建自己的ML工具,则独立的机器学习库可以是自定义的Python脚本,或者它可以是预编译的学习引擎,例如Mindmaker的DRL引擎(稳定的Baselines3算法)。无论您选择哪种选项,使用Mindmaker AI插件开发人员和研究人员都可以轻松培训2D,3D和VR项目的机器学习代理。
可能的应用程序将超越游戏设计扩展到各种科学和技术努力。这些包括机器人模拟,自动驾驶,生成架构,程序图形等。该API提供了一个中心平台,从该平台中,机器学习的进步可以到达许多这些领域。对于游戏开发人员而言,用于自优化剂的用例包括控制NPC行为(在多种设置中,例如多代理和对抗性),原型游戏设计决策以及对游戏构建的自动测试。
DRL学习引擎包含在示例项目的链接中,以及用于修改它的Python源代码,在内容 MindMaker source Directory中找到。 Algorithms presently supported by the DRL Learning Engine include : Actor Critic ( A2C ), Sample Efficient Actor-Critic with Experience Replay (ACER), Actor Critic using Kronecker-Factored Trust Region ( ACKTR ), Deep Q Network ( DQN ), Proximal Policy Optimization ( PPO ), Soft Actor Critic ( SAC ), Twin Delayed DDPG ( TD3 ), Trust Region Policy Optimization ( TRPO ),深层确定性政策梯度(DDPG)。该插件在功能上与Unity的ML代理相似,具有一些优势 - 而不是为每个应用程序创建自定义的OpenAI健身房环境,而是使用一个环境,只需选择代理的观察值和操作即可暴露于ML算法。瞧,让学习开始!
与Mindmaker插件合作时,您将使用两个主要组件,一个包含学习环境的虚幻工程项目,以及代理使用的独立机器学习库来优化尝试学习的任何内容。在您使用Mindmaker的远程ML Server创建自己的ML工具的情况下,独立的机器学习库可以是自定义的Python脚本,或者它可以是预编译的学习引擎,例如Mindmaker DRL引擎(稳定的基线算法)。
要与Mindmaker结合使用不同的ML库进行实验,请使用Mindmaker远程ML Server。使用它,您可以自定义自己的Python学习引擎,而不是使用预先编译的Mindmaker DRL引擎。要使用远程ML Server,请按照以下步骤:
如果您想使用多个将连接到单个学习环境的ML客户端,例如在多代理方案中,可以使用MindMaker服务器和插件来完成。
要创建多个学习代理,请首先设置学习代理,如示例蓝图之一所示。对于每个新的学习代理,您需要将新的AI控制器中的套接字端口设置增加1。在启动服务器时,将自动为您启动的MindMaker.exe的每个新实例创建新服务器端口号,从3000开始,从那里开始,从那里开始,总共需要100个。
例如,如果您将第二个学习代理添加到地图中,则需要在第一个学习代理(启动Mindmaker blueprint节点等)中使用的所有相同功能,但是您不必为端口3000分配此功能,而是将其分配给blueprints中的端口3001。除了更改蓝图中的Socketio端口设置外,您还需要更改以更改连接socketio蓝图函数,将“地址”和“在地址”和“端口”修改为您创建的“ http:// localhost:3001”的新数字。
完成此操作后,您只需要创建一个将连接到第二个学习代理的MindMaker_Client.py文件的第二个实例即可。可以同时进行培训。您需要对MindMaker_Client.py进行的唯一修改是在文件底部更改sio.connect('http:// localhost:3000')to sio.connect('http:// localhost:3001')或您正在与之合作的新学习者的数量是什么。如果您有五个学习代理人,那么您将拥有五个客户端的实例,每个实例都将拥有一个新的端口号,直至3005
使用稳定的baselines模仿学习3可以修改Mindmaker Python来源以使用支持的稳定baselines模仿学习算法来支持模仿学习
要保存训练有素的模型,请在启动Mindmaker功能中设置“训练后保存模型”复选框。您将需要确保您的培训剧集数量是一个非零号码。培训完成后,该模型将节省。要加载训练有素的型号,请取消选中“训练后保存模型”复选框,然后将启动Mindmaker功能中的“负载预先训练的模型”复选框设置为TRUE。您还需要将培训情节的数量设置为零,因为不会进行任何培训。确保评估发作的数量是一个非零整数,因为这将是预训练的模型如何证明学习的方式。模型在您的计算机的“ AppData漫游”文件夹中保存,例如C: Users Leon appdata roaming
默认情况下,MindMaker仅保存到Windows机器上的AppData/漫游目录。要启用张板记录,请按照以下步骤操作。
这是一个三个步骤,您需要确定代理商可以采取的行动,其奖励标准是什么以及代理商将需要对其环境进行的观察,才能成功地学习获得奖励。
启动Mindmaker -------->接收操作-------->进行OBS ----->检查奖励--------->发送OBS并将RWRD发送给Mindmaker --------------------------------------------
在学习过程中,必须首先使用代理使用的观察空间以及代理可用的操作总数配置。您不需要提供任何奖励信息在初始化时,只会在培训期间遇到。
学习的总体过程是,一旦启动并连接到虚幻引擎,Mindmaker Learning Engine将开始为不真实的发动机代理提供随机的动作,并且为了响应,使用UE的经纪人还将发送一旦采取了该动作的观察列表,此外,除了收到的任何奖励之外,它都将进行。参见上图。在许多情节中,Mindmaker使用的算法将根据从UE获得的观察结果和奖励来优化代理的行动。无论是哪种机器学习算法选择与Mindmaker一起使用,此过程都是相同的。有了这些信息,学习算法将开始优化代理的行动决策,理想情况下发现始终获得奖励所需的顺序。随机动作与故意动作之间的权衡是在您选择的ML库的探索/开发参数中控制了与Mindmaker一起使用的,例如稳定的基准。每个训练的每集都重复此过程。经过固定数量的培训情节后,您可以完全切换到使用算法来预测“最佳”动作,而不是随机采取行动。
Mindmaker通过以Openai Gym兼容的格式包装不真实的环境来发挥功能,以便任何旨在与OpenAI健身房合作的ML库都可以在您的虚幻发动机环境中部署。使用开放AI健身房的目的是标准化学习的相关因素,即接受代理观察,奖励和行动的格式,以便任何ML AlgorityHM都可以访问无需为每个特定任务进行翻新的相关学习变量。与OpenAI健身房合作的算法比使用使用标准化OpenAI协议的任何环境和代理人都可以使用。
一开始就配置Mindmaker学习引擎,您需要为您的学习代理配置启动Mindmaker功能。这是通过在Mindmaker中设置Action_Space变量来等于代理可用的操作总数来完成的。您还需要配置Observation_Space变量,以匹配您的代理商将尝试使用的奖励的数量和类型。默认情况下,观察值是从虚幻的数组传递的,请参见示例项目。根据您的代理商发现使用必要的观测值的数量,Observation_space的大小将会改变。
奖励 - 奖励是根据您选择的特定标准为代理人学习或优化的变量。在UE4蓝图中,您将使用分支节点来确定必须实现哪些环境条件和代理操作才能激活奖励。这比Socketio连接传递给Mindmaker。请参阅项目示例。操作 - 这是一个包含代表代理商采取的任何操作的整数值的变量。您还需要确定代理可用的操作总数,并将最大值设置为MindMaker等于此数字。观察 - 终止您将要处理的最棘手的变量。正确设置此设置的关键是要了解,除了在奖励功能中引用的任何其他环境标准外,代理行动本身必须包括在观测变量中。代理需要知道采取了哪些行动或行动,影响奖励以及任何变化的环境变量。这些被传递给Mindmaker学习引擎作为数组,并在其中的观测变量中进行了更新。
在这里,我们将讨论LaunchMindMaker蓝图节点的各个参数,这是Mindmaker蓝图功能的主要组成部分。
RL算法 - 这是可以选择RL算法的风味的地方。下拉菜单中有十个选项,每种算法都有自己的优点和缺点。可以在此处找到有关相关算法及其用例的可用讨论。 https://spinningup.openai.com/en/latest/spinningup/rl_intro2.html
NUM Train EP - 这是一个整数输入,代表人们希望进行的培训发作的数量。训练发作的数量越大,代理商在过渡到训练过程中获得的战略行为之前所做的探索越多。代理商试图学习的动作的复杂性通常确定所需的训练发作的数量 - 更复杂的策略和行为需要更多的培训情节。
NUM ADER EP-这也是一个整数输入,代表了训练后代理商将进行的评估发作的数量。这些是代理商展示其学到的行为的情节。
连续的动作空间 - 这是一个布尔值输入,它决定了代理是否使用连续的动作空间。连续的动作空间是代理可以采取的无限数量的动作,例如,如果它正在学习引导汽车,而转向柱可以更改的角度范围是0到180之间的小数点值,而不是在该范围内的无限值,例如.12和.12和145.77744454。如果您的代理商具有无限数量的操作或有限的数字操作,则需要在使用开始时识别使用。动作空间必须是连续的或离散的,它不能兼具。
离散的动作空间 - 这是一个布尔值输入,它决定了代理是否使用离散的动作空间。离散的动作空间是代理可以采取的有限动作的空间,例如AI只能移动一个空间或留下一个空间。在这种情况下,它只有两个可用的操作,并且动作空间是离散的。用户在使用MindMaker之前确定代理商将使用哪种操作空间并相应地设置这些值。
动作空间形状 - 这定义了代理可用的动作的下部和上限。如果您使用的是离散的动作空间,那么这仅仅是代理可用的操作总数,例如2或8。如果您使用的是连续的动作空间,则情况更为复杂,必须定义动作空间的低和高界限。这样做的格式如下:低= lowboundary,高= highboundary,shape =(1,)在这种情况下,lowboundary是-100.4之类的值,而highboundary是一个值,例如298.46。然后,这些边界之间的所有小数值将表示代理可用的操作。如果您有一系列此类操作,则可以更改形状部分以反映这一点。
观察空间形状 - 正确地说,此输入是开放AI自定义环境类的Python导数,并在采取行动后定义了观测值的下部和上限。这样做的格式如下:low = np.Array([[lowboundary]),high = np.Array([[Highboundary]),dtype = np.float32。想象一下,一个需要连续采取三个特定动作才能获得奖励的代理商,其观察空间将需要包括对这三个动作的访问,每三个动作都由独特的观察来表示。因此,一系列观测值必须包括三个不同的值,每个值都有独特的边界。例如,这样的动作空间可以定义为:低= np.array([[0,0,0]),high = np.array([[100,100,100]),dtype = np.float32,如果观察代理所需要的每个行为中的每个行为中的每个行为都需要一个值,则在某些情况下,如果某个奖励是一个奖励,则是奖励的一部分。观察空间必须包括对该值的引用。如果必须满足五个条件才能获得奖励,那么这五个条件中的每一个都必须是代理观察空间的一部分。
负载预训练的模型 - 这是一个布尔值,它确定您是否想让代理商加载一些以前保存的预训练的行为。如果将其设置为true,则需要在“保存 /加载模型名称输入框”中指定文件名。默认情况下,所有模型都保存到计算机的应用数据漫游目录,例如C: Users Username username AppData roaming
训练后保存模型 - 这是一个布尔值,它确定您是否要向代理商保存训练后学到的行为。如果将其设置为true,则需要在“保存/加载模型名称输入框”中指定文件名。默认情况下,所有模型都保存到计算机的应用数据漫游目录,例如C: Users Username username AppData roaming
保存/加载模型名称 - 这是代表您要保存或加载的模型名称的字符串。文件保存到计算机的应用数据漫游目录中
使用自定义参数 - 这是布尔值,它确定是否要使用已选择或希望修改其参数的算法的库存版本。如果您希望使用自定义参数,则可以通过自定义参数结构变量访问这些参数。如果单击它们,例如A2CPARAMS,您将看到这些结构中可以设置的所有值。可以在此处找到每种算法的参数的详细分解:https://stable-baselines.readthedocs.io/en/master/
下面介绍了示例项目的功能示例列表,以了解如何在Mindmaker和Unreal Engine之间传递信息,所有与玩具问题相关的UE资产都包含在资产/深度LarearningNPC文件夹中。尤其重要的是蓝图在AI_CHARACTER_CONTROLER_BP蓝图中称为AI_CHARACTER_CONTROLER_BP,所有环境变量均配置用于传递到MindMaker独立应用程序。这些包括以下基本功能
负载感官输入函数 - 导入AI可以访问或操纵其环境控制功能的对象
定义动作空间函数 - 将所有可能的代理操作编码为单个数字值,该值可以传递给独立应用程序以通过RL算法评估
启动mindmaker函数 - 在开始游戏开始时,请调用独立应用程序,以便它可以从UE环境开始评估数据。启动此操作后,RL应用程序开始使用它会产生的随机操作来探测环境,就像一个在黑暗中搜索光的盲人一样。光是奖励,它在UE功能检查奖励功能中指定。启动LearlearningEngine还将一些基本的UE环境信息传递给独立应用程序,例如代理商可以采取的动作数量,要训练的情节总数以及在培训后显示代理商获得的策略的情节数量。展示所有代理商随机培训将花费太长时间。
应收功能 - 在启动学习引擎功能开始后,下一个要发射的功能是recieveaintion。这将收到由独立应用程序选择的操作,并对它进行许多后续过程,例如更新环境中的代理位置,检查新操作是否满足奖励条件,如果我们通过培训进行了训练,并更新了对环境的训练,则可以在下一情节中传递给代理的观察。
使观察功能函数 - 目的是在其刚采取的措施之后更新代理观察到其环境的观察。例如,这些将包括具有环境的代理位置以及自上次采取行动以来发生的任何其他环境数据。这些存储在自定义结构变量中。
CheckReward - 这指定了环境中代理商的奖励条件。如果在执行诉讼的代理之后满足了此奖励条件,则此信息将传递给随后的发送观测值函数中的独立应用程序。发送观察功能 - 获取代理商进行的新观察以及任何奖励信息,并将其传递给独立应用程序。这就是RL算法将能够评估其刚刚采取的动作的方式,并相应地更新其策略。在此功能启动之后,游戏的一个迭代或情节已经完成,并且该过程重复AD Infinitum。
某些任务可能需要长时间的训练,在这些任务中可以看到代理动作会非常耗时。因此,在某些示例中可视化代理人的运动已被禁用,但是一旦示例运行并完成后,培训就在后台进行,代理将演示获得的策略。
在这种情况下,随机是意味着代理使用随机数生成器在训练过程中可用的操作之间进行选择。然后,RL算法观察这些随机操作的结果以及收到的任何奖励,并使用此信息在“剥削”阶段选择更好的动作。这就是学习策略的制定方式。
学习期间的信息收集采用了每个代理人随机操作后生成的一系列观察结果的形式。如果使用MindMaker插件,则在启动Mindmaker蓝图功能的观察大小属性中定义了数组的确切形状,并将取决于代理在该特定游戏或学习任务中观察的必要变量。它将根据学习任务或游戏而改变。
代理只感知游戏设计师暴露于环境的环境部分。使用Mindmaker插件时,这些观察值在Make观测值中填充了虚幻引擎中的蓝图函数。这将生成由启动Mindmaker蓝图功能的观察尺寸属性定义的形状的数组。应选择观察结果,以便它们仅构成代理商学习所需的数据,否则培训可能会过时耗时。
在香草Q学习中 - 不需要神经网络,学习以表格格式存储。当使用Mindmaker深入强化学习时,可以在包括RNN,CNN等各种神经网络体系结构之间进行选择。可以将它们设置在每种算法的启动Mindmaker blueprint功能调用的自定义属性中。
创建自定义深入的增强学习环境
简介。为视频游戏AI进行加强学习
强化学习 - 这是诺言和危险
稳定的基线文档