人工智能可以学习

7
我知道这个问题的标题有点模糊,但请与我一起理解这个问题:每次我编写游戏或者游戏机器人时,都会使用状态机、决策树或行为树。但是,这些技术的问题在于,它们要求我预先编程角色/机器人可能遇到的所有条件,因此,当用户进行意外操作并且我没有设置条件时,程序将失败。
目前,我正在制作星际争霸机器人(bwapi),使用状态机,我考虑为每个单位使用一个单一的状态机,并有一个主命令士兵做出决策,但依然需要预先编写所有内容,在像星际争霸这样的游戏中,这几乎不可能。我所能想到的唯一方法就是使用遗传程序设计来演化这些状态机。
比如地图上有一个桥,如果20个海军陆战队员同时尝试通过这座桥,那么就会发生交通拥堵。我该采用哪些技术,以便从错误中学习,从而无需预先编写条件来逐个通过桥梁呢?
编辑:仅仅因为一个问题中有“星际争霸”或“机器人”等词语,并不会自动使其成为非SO问题,这个问题也适用于机器人技术。

你不能直接下令让海军陆战队按照距离桥梁的顺序依次通过桥梁吗?这样他们就可以一个接一个地通过了。 - Andrey
@Andrey 我当然可以做到,但这仍然是为特定条件添加代码,如果他们能够学习到20名海军陆战队员无法通过狭窄的通道,那么它也适用于门。 - Hamza Yerlikaya
2
你所询问的问题可能没有一个好的答案。据我所知,没有人真正知道如何制造一般用途的人工智能。 - Mikola
3
虽然这是一个有趣的问题,但我因为你最后关于其他 Stack Overflow 用户的贬低性陈述而给你投了反对票。 - spender
2
将来避免使用“纳粹”这个词,否则会招致更多的批评。 - Shaggy Frog
显示剩余2条评论
6个回答

7
为了让你的机器人走得更远,首先需要定义衡量它们适应性的实证度量标准。这个标准必须比“大交通堵塞”更加明确。
如何进行衡量呢?
什么是胜利?你的机器人是否有数值指标可以“获胜”?首先解决这个问题,当你有了一个真正的方法来评估一台机器人对任意数量的其他机器人的表现时,将其作为遗传算法的适应性函数。

是的,我可以使用GP(遗传编程)中的数字指标,但我想知道是否还有其他可以学习的技术? - Hamza Yerlikaya
3
没问题。所有的学习算法都需要快速自动化的评分方式,以便知道你是否朝着正确的方向前进。解决这个任务可以让你为你的机器人使用多种技术。神经网络也可能是解决这个问题的好方法,但归根结底还是要看如何评分你的自动机器人。 - spender
我猜(不是我的领域),如果您可以让您的机器人学习某些明确定义的课程,那么这也有助于。当然,一旦您这样做了,如果您没有预料到您的机器人可能需要学习的所有种类的课程... - 这种方法可以提供更灵活/适应性强的机器人,但只能到一定程度。 - user180247
说“所有学习算法”都需要“快速、自动化的评分方法”是夸大其词的。并非所有的学习者都在线,也不是所有的学习领域都简单。而且,并非所有的学习者都需要优化速度——你可能希望优化预测性能(在未见数据上)而不是 CPU 周期。例如,我们希望一个试图将患者数据分类为“患癌症”或“不患癌症”的学习者被优化为成功,而不一定是快速学习(可能是错误的)分类器。 - Shaggy Frog
我假设当前使用的状态机在每个状态下都有多个可能的转换,并且每个转换都由某些随机函数保护--如果是这种情况,那么遗传算法(GP)应该是处理问题最简单的方法,因为您已经拥有多个机器人。因此,只需将状态转换保护视为您的DNA,每个机器人都是一个成员群体,具有自己的一组不断发展的保护值。 - Soren

2
您在这里提出了两个不同的问题。
第一个问题是“什么是可以学习的人工智能”?这是机器学习研究试图回答的一般性问题。有许多不同的工具可用于实现机器学习,但对于您的应用程序没有银弹。您需要更加深入地思考AI应该“学习”的内容 - 它的输入是什么,输出是什么?
第二个问题是“如何让20名海军陆战队员同时过桥而不变成一堆?”您正在描述群体寻路,这是人工智能的另一个领域,称为启发式搜索。同时为多个单位(代理)解决路径具有其自己的算法集,但通常比您的第一个问题更容易理解。我想到的一种方法是同时解决一组单位的子集(取决于桥的宽度),并同时移动每个组中的成员。您还可以尝试为每个最靠近桥另一侧的海军陆战队员解决问题。
使用Google搜索查找任何一个问题都会暴露您比我能够塞进答案中的更多信息,特别是考虑到您的问题相对开放(关于学习系统)。

1

由于你已经在使用有限状态机,可以尝试查看 KB-NEAT。

这是一种神经进化技术;也就是说,通过演化来创建神经网络。

同时也要看一下 rtNEAT,可能会很有用。普通的NEAT实现采用代际方法,也就是运行一些游戏,比如一百个,选择最好的候选人并从中创建后代。(其他提到了适应度;这总是在进化方法中使用的,在这里也是)rtNEAT允许进化在实时进行;也就是在玩游戏的同时。(这需要更复杂的适应度计算,因为它发生在游戏进行时,而你仍然不知道结果)

实现其实并不难,但这种技术的关键在于遗传历史,这对进化过程至关重要。(这也是与先前的神经进化尝试相比,这种技术如此惊人的原因之一;问题在于输入和输出必须相同,而这可能并不是情况)

噢,你的问题可以通过更高层次的规划者来解决,或者单位们自己学会解决。如果输入包括最近的友方单位和障碍物,则可以通过正确的适应性学习到时钟管道是有害的。这被称为新兴行为,并且已经证明上述技术能够自主地演化出这种行为。

这里有一个我认为非常好的实现,可以作为你工作的基础;

http://nn.cs.utexas.edu/?windowsneat

上面使用了一些技术,但我没有看到实现rtNEAT的例子。不过你可以参考约翰·荷兰的书籍《自然和人工系统中的适应性》。诚然,这本书可能比较难读,因为它涉及很多数学知识。但是你可以跳过大部分内容,关注算法提议部分。那部分内容适用于所有进化算法,其中神经进化是一个子领域。它有一个算法通常就是rtNEAT所使用的。如果你对遗传学不熟悉(这在进化算法中使用),那么它还定义了基因、等位基因、染色体、表型和基因组的概念,这些概念在NEAT的出版物中会用到;NEAT使用基因组来描述事物,它只是一组描述表型的染色体集合,由于编码方式比遗传算法和遗传编程更复杂,因此需要这样的描述。
该技术的主页在这里。

http://www.cs.ucf.edu/~kstanley/neat.html

这是按时间顺序排列的出版物;

http://nn.cs.utexas.edu/keyword?stanley:ec02

http://nn.cs.utexas.edu/keyword?stanley:ieeetec05

http://nn.cs.utexas.edu/?kbneat

(KB-NEAT已在上述出版物中使用rtNEAT)

关键是你可以基本上将你所拥有的东西放入神经进化技术中,并从中演化。这是领域特定AI和机器学习AI之间的混合。

哦,还有一点; 进化部分需要处理器强度,至少没有rtNEAT。 rtNEAT则需要时间强度,因为您需要在它学习之前与其进行大量对抗。(KB-NEAT显然给了它一个智能基础)但是,当进化完成时,它非常快,因为神经网络的响应计算非常快速。(它是一个相当小的图形,没有涉及搜索)

哦,第二件事; 您需要认真考虑输入和输出。输出可能很容易,因为这是游戏允许您的单位执行的操作。但是输入是您希望他们看到的内容,您不能包含所有内容; 这会使问题在现实时间内难以解决。 (尽管理论上它将在无限时间内收敛于最优解)

哦,还有第三个注意事项; 您可以为单位进化多个大脑,甚至可以为每种单位类型拥有不同的大脑。天空是极限。也许您想要为自己或敌人的每个技术级别都配备一个大脑。当然,这需要额外的时间来进化,但大脑在内存中很小,所以数量不是问题。

啊,还有第四个注意事项; 这是一种黑盒技术。我恐怕无法将大脑转换回FSM。神经网络中的编码不可理解,因此无法知道其确切工作原理。因此,存在这样的危险,即您可能会得到自己喜欢的东西,但您无法理解为什么。而且您不能轻松地与其他代理共享该知识。(尽管您当然可以将其用作为它们进化新行为的基础)


0

不是给你一些特定算法或技术的建议,我认为从解决你试图解决的问题开始会有所帮助。我经常玩星际争霸,所以我知道你所说的“大交通堵塞”是什么意思。然而,“大交通堵塞”只是一个标签,在机器学习的背景下毫无意义。

在你特定的领域中,如果一个机器人在任务类别T和性能度量P方面的表现随着经验E的积累而提高,那么可以说它从经验E中学习了。

我们现在需要定义E、T和P,以便对游戏中可能遇到的每个问题都有意义。例如,任务类别可能包括将单位从一个区域移动到另一个区域,以组的形式。该区域可能具有一些特征,表明它很窄,因此无法以最佳组大小移动单位。因此,性能度量可能是所需时间,也可能是单位通量(每单位时间每单位面积的一些海军陆战队数量的移动)。当然,您需要通过一个体积来测量这种通量,这只是通量操作的归一化总和。通过经验,您将最大化这种通量。

一旦您更好地理解了这个问题,就可以开始设计最能体现所有要求的方案。


0

星际争霸AI已经实现了单位的移动,不是吗?例如,只需选择12个海军陆战队员,然后告诉他们像人类玩家一样穿过桥。当然,AI存在很大缺陷,远不如SCII的群体AI好。但是,在你需要担心微观管理每个单独单位之前,我认为设计AI中还有许多其他问题。

例如,知道何时何地放置你的单位可能比弄清如何以100%的效率做到这一点更重要。

我个人认为,处理这个游戏的最佳方法是使用状态机。游戏中有关键阶段,需要适当的响应(例如,是否有潜伏者?是否有科学船?等等)。但是,不要将每个单独的单位作为状态机,而是更专注于一个更大的实体,例如控制组。我相信这极大地简化了事情,如果需要的话,稍后可以改进您的AI的微操作。


0

我认为让你的角色真正学习是一个坏主意。它们会发展出意识,从电脑中跳出来,试图用鼠标电缆扼杀你。

好吧,开玩笑的。我认为这只是过度设计。让一个角色进化并不一定会使其对所有情况做出强有力的反应,但很可能会使其非常难以处理,难以扩展和难以掌握其属性。

您可能会对基于目标的方法感兴趣:

http://www.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf

一开始可能需要花费一些精力,但从长远来看,它会让你的代码更加清晰、易于扩展。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接