我的一个朋友开始构建一个NetHack机器人(一个玩Roguelike游戏:NetHack的机器人)。对于类似的游戏Angband,有一个非常好的工作机器人,但它的工作部分原因是回到城镇的容易程度,并且总是能够通过虐低等级来获取物品。
在NetHack中,问题要困难得多,因为游戏奖励大胆的实验,并且基本上是由1000个边缘情况构建的。
最近,我建议使用某种朴素贝叶斯分析,就像创建垃圾邮件一样。
基本上,机器人首先会建立一个语料库,尝试它发现的每个物品或生物的每一种可能动作,并存储该信息,例如,它与死亡,受伤或负面影响有多接近。随着时间的推移,似乎可以生成一个相当可玩模型。
有没有人能指出我们一个好的开始方向? 我是不是在白费力气或者误解了贝叶斯分析的概念?
编辑:我的朋友上传了一个 github repo of his NetHack patch,它允许python绑定。它仍然处于相当原始的状态,但如果有人感兴趣…
回答:
尽管贝叶斯分析包含的内容更多,但垃圾邮件过滤器中广为人知的朴素贝叶斯算法是基于一个非常基本的假设:所有变量本质上都是彼此独立的。因此,例如,在垃圾邮件过滤中,每个单词通常被视为一个变量,这意味着假设如果电子邮件包含单词“viagra”,那么该知识不会影响它也包含单词“medicine”(或“foo”或“spam”或任何其他单词)的概率。有趣的是,当涉及到自然语言时,这个假设显然是错误的,但仍然设法产生合理的结果。
现在,人们有时规避独立性假设的一种方法是定义技术上是事物组合的变量(例如搜索token“buy viagra”)。如果你知道要寻找的具体案例,这可能有效,但总的来说,在游戏环境中,这意味着你通常无法记住任何东西。因此,每次你必须移动、执行动作等等,它都完全独立于你到目前为止所做的任何事情。我认为即使是最简单的游戏,这也是一种非常低效的游戏学习方式。
我建议你研究一下q-learning。你发现的大多数例子通常只是简单的游戏(例如,学习在避开墙壁、陷阱、怪物等的同时导航地图)。强化学习是一种在线非监督学习,在可以建模为智能体与环境交互的情况下(例如游戏或机器人),它确实表现出色。它通过尝试找出环境中每个状态的最佳动作来实现这一点(每个状态可以包含尽可能多的变量,而不仅仅是“我在哪里”)。诀窍在于,保持足够的状态,以帮助机器人做出好的决策,而无需在状态“空间”中为每个可能的先前动作组合设置一个不同的点。
更具体地说,如果你要构建一个国际象棋机器人,如果你试图创建一个基于所有先前动作做出决策的决策策略,你可能会遇到麻烦,因为所有可能的国际象棋动作组合的集合增长得非常快。即使是棋盘上每个棋子位置的更简单的模型仍然是一个非常大的状态空间,因此你必须找到一种方法来简化你跟踪的内容。但请注意,你确实可以跟踪一些状态,这样你的机器人就不会一遍又一遍地尝试向左转入墙壁。
维基百科的文章充满了术语,但这个教程在将概念转化为现实世界的例子方面做得更好。
需要注意的是,你确实需要能够定义奖励作为积极的“强化”。也就是说,你需要能够定义机器人试图达到的状态,否则它将永远继续下去。