作者:Kabalan Gaspard

翻译:王紫岳

校对:陈汉青

本文约4000字,建议阅读10+分钟

本文为大家介绍了作者使用不同的算法来解决Free Flow谜题游戏的心路历程,从一开始的A*,Q-learning,到最后的卷积神经网络,作者详细的介绍了在使用这些算法时遇到的困难和得到的启示。

深度学习比古老的蛮力技术更适合解决FlowFree问题吗?

我们都有过这种经历。你拿着手机发呆,想要消磨一些时间,于是你决定放弃自己优秀的思考,打开应用商店的游戏区,看看游戏排行榜。你找到了一个看起来很有趣的谜题游戏,但其实游戏是否有趣并不重要,因为你只想玩半个小时,然后就删掉、忘记它,对么?

2个月以后,我完成了两千多关的Flow Free①游戏,并且坚持每一关都得到“完美”评分。这一游戏(自2012年发行以来,这款游戏在iOS和Android平台上都是最受欢迎的游戏之一)的设定相当简单:将不同颜色的阀门分别连起来,并且不能有线相交。

FreeFlow——你可以通过这个截图来了解游戏

截图中的关卡可能看起来很简单,但是它的难度确实在不断提升。随着关卡的进行,我发现我自己想出了一些可以帮助我更快完成这些高级关卡的策略(例如:尽可能的保留外层边界空白,避免在未填满的方形中创建“港湾”等)。浏览网上论坛时,我看到其他的玩家都有他们自己的技巧,有的和我的一样,有的则略微不同。这就引出了问题——计算机能否通过“经验”,而非蛮力,来学习这些技术?

一个人类解决FreeFlow谜题


从基础开始:A* 

如今的深度学习问题大部分可以归结为要使用哪种算法。我以A*搜索作为开始。尽管它本身不是深度学习,但是它也很好的说明了这个问题内部的复杂性,并且也给了我们一些机会,来使用更高级的、能够自我驱动的启发式算法。

由于空间的复杂性太大,以至于我无法一次性解决问题。所以我开始按颜色递归地解决问题(如果给定路径被“堵塞”,就回溯到上一种颜色)。在启发式算法中,我使用了较为可信的曼哈顿距离。我在四种尺寸的板子上测试了我的算法:微型(2✖4)、小型(5✖5)、中型(8✖8)、大型(14✖14)。我保证了大型和中型的板子上的颜色比一般的颜色要少。因为大、中型的板子的确会使问题更难,对人和计算机都是如此(更多可能的路径/选择/状态)。

这个算法在小型板子上运行的很好,但是花了相当多的时间。因此,我为下一个状态的函数增加了一些规则,以此希望强化学习的算法能够自己找出这些规则:防止同色相邻方格不连接,或者出现空“港湾”。

我那台7岁的电脑得到的结果是很让人开心的,但是仍需改进:

惭愧地说,我可能花在Tkinter图形函数上的时间比实际的AI要多

如果你觉得你是第一个这么做的,那你很有可能就错了

在我使用强化学习之前,我一直尝试优化我的A*算法。当我发现Matt Zucker的一篇优秀的博客文章②时,他已经为Flow Free建立了一个A*解算器(很高兴的看到,我不是唯一一个有这种困扰的人),并且更加仔细地考虑过要把这些状态从他的A*搜索中剔除。更让人惊讶的是,他发现了一个只有6条规则的简单SAT算法,这比他最好的A*搜索法还表现还要好,而且在SAT中求解时间也非常短(对于14x14的板甚至低于1秒)。

到目前为止,我们似乎都得出了同样令人沮丧的结论:对于这类(非对抗性的,封闭的)谜题游戏,简单的蛮力技术将超过基本的人工智能算法。

不过,我不可能止步不前。毕竟,引发这一实验的问题仍然存在:作为人类玩家,在玩了几个关卡后,我们就能发现一些能够更有效地打败Flow Free谜题特定的技巧。为什么机器不能学习同样的技术呢?

提到强化学习

我非常兴奋地在Flow Free问题中尝试了Q-learning算法,因为“AI”中的“I”即将要发挥它真正的作用了。A*搜索的工作也绝不是浪费时间,因为我们可以使用它的结果作为Q-learning智能体的状态-动作空间。状态空间由板上的方块颜色和哪条路径(颜色)目前是“活跃的”两部分组成。一个“动作”是指填充活跃路径的下一个方块。

在一开始犯了一些基础的错误之后,智能体很快就学会了如何解决小型板问题(1.5秒内100次迭代)——到目前为止看起来还不错。但在中板上,花了10分钟,经过10000次迭代后,仍然没有结果:

当你听到“人工智能”时,你想的结果可能和这个不一样。

为了改善这种情况,我开始调试标准Q-learning的参数(学习率α、贴现率γ、勘探/开发率ε),但这并没有很大帮助,所以我将注意力转向到奖励函数。除了实际的“奖励”之外,还需要一个参数与奖励函数进行权衡(否则风险就会变得规范化,这会不利于整个机器学习活动):智能体是否会因为解决了一条路径获得奖励,而不是解决了整个谜题之后。不幸的是,这并没有起到多大作用。

最后,逐渐清晰的是,算法之所以会在更大的板上苦苦挣扎,仅仅是因为操作空间太大了。相比于A*搜索,Q-learning在这种情况下确实做出了更明智、更有帮助的选择,但在大多数情况下,即使在10000次迭代之后,Q-learning 智能体还没有看到确切的结果。因此,下一步自然就是:

近似 Q-learning

近似Q-learning的应用是十分有吸引力的,尤其是在游戏中。与其让智能体在给定的状态下决定最佳的操作,不如让它在每一步都能快速计算出一些直观、独立于具体状态(棋盘的配置)之外的特性,并让它自己决定哪些是最重要的。这在游戏中会担任游戏改变者的角色,例如Pcaman(举个例子,下一步的决策是基于最近的豆子和最近的幽灵,而不是在每种可能状态下的一个动作),当然也可以是状态数量太多,以至于让准确Q-learning失效的Flow Free。

现在是开发人员需要权衡利弊挑选“正确”的特征的时候了。于是,我将列表精简到只有我认为在很多情况下重要的特征(例如,每条路径的剩余曼哈顿距离)。还有一些我认为重要的、只需要让算法计算的特征(但无法证明)。这些特征包括:

  • “转弯”的个数;

  • “盒子”的个数;

  • 盒子中阀门的个数;

  • 没有阀门的盒子的数量(人们可以从逻辑上证明这是不可能发生的——我想看看算法能不能算出来);

  • 一条路径是否“抱墙”(即,一条路径是否可以与相邻的另一条路径相连)。

不幸的是,有了这些特征之后,Q-learning智能体甚至不能解决小型板问题,即使我们改变了Q-learning的参数也不行。但是,这也是个有趣的实践。例如,该算法在“没有阀门的盒子”上附加了一个强大的负权重,这意味着它能够了解到,没有阀门的盒子会导致谜题无法解决。

近似Q-learning发现了更好的游戏策略

或许有了更大的谜题样本,它就能更好地学会如何真正地解决它们,但我很兴奋地看到它能真正地找到重要的东西。这在AI中是一个非常有趣的现象,尤其是在游戏AI中非常普遍:即使一个算法不能赢得游戏,它也可以帮助人类找到玩的更好的技巧。

走向监督学习:卷积神经网络

一开始,我对通过监督的方法来实现Free Flow的想法存有偏见。首先,这需要大量的Free Flow游戏样本,而这些游戏很难在公共互联网上找到。其次,似乎与Free Flow最接近的监督学习方法——神经网络——是一个臭名昭著的黑盒算法,它会妨碍这个练习最有趣的部分:查看算法学习何种技术来解决这个难题。

然而,后来我偶然读到了Shiva Verma在《Towards Data Science 》③杂志上的一篇文章,他在其中做了一些与数独游戏非常相似的事情:本质上是把一个数独游戏板当作一个图像,然后使用卷积神经网络(CNN)来解决它。作者在数独游戏中取得了很好的效果,这让我重新审视了我最初的想法,并尝试了这种方法来实现Flow Free。

当然,第一个困难是获得输入的数据:用解析文本格式来寻找Free Flow谜题的答案,要比数独谜题更困难。最初,我发现寻找文件最好的方法是查看Android应用程序的代码,它有一千多个以文本格式存储的谜题:

CNN的初始结果是令人失望的:尽管CNN正在学习它任务是创建路径,而不是仅仅在孤立地填充颜色,但在测试样本中只有0%的谜题被解决了。

我们需要更多的数据

调整分层、训练次数、内核大小和其他类似的常见疑点并没有多大帮助。这似乎又回到了数据科学家最常见的问题:没有足够的数据,世界上最好的算法也什么都不是。我找到的其他最好的数据来源是www.flowfreesolutions.com,它有成千上万的对于全新的Free Flow问题的解法,比我的解法要多... 但是是图片格式的。

尽管我尝试了无数次,通过各种渠道联系他们(甚至提供了经济奖励),我还是没能让他们给我发送一个可解析的文本版本的解决方案。好吧,这不是一篇免费的人工智能文章——当一个人有现代图像处理器的时候,谁还需要底层的解决方案矩阵呢?使用子项目建立一个Free Flow④解决方案图像处理器:

Scikit-image FTW

利用对称性来增加我们可用的数据

这就产生了几千个用来研究的数据点,但这仍然不是很多。但后来我意识到,就CNN而言,颜色的确切值并不重要,重要的是颜色是不同的。所以我们可以将颜色重新排列,并且仍然有另一个非冗余的数据点。即使对一个只有六种颜色的5x5的板来说,这可以给我们的CNN提供多达6!= 720倍的研究数据点(当然,等大的板和更多的颜色会有更多可选的组合)。

数学家将从群论中认识对称群S_n

一位朋友指出,这实际上是游戏AI中增加数据点的常见方式。在720x的数据点的情况下,我们最终在一个20-epoch模型,使用大小约为200k的数据点测试集,在我7岁的GPU上运行了20分钟后得到的准确率为12%。需要注意的是,我们在这里使用了一个严格的衡量成功的标准:即使板子少用了一个单元格,我们也将其视为失败。

但是,失败比成功有趣得多。在几乎所有的失败中,CNN正确地解决了板子的很大一部分,剩下的部分人们则很容易完成它。从这个意义上讲,CNN能够解决文章最初的问题:凭直觉学习人类的技巧:

CNN的误差分布

结论

  • 对于解决基于网格的、非对抗性的谜题游戏来说,简单的方法通常更好。事实上随着方法逐渐变得高级,他们的表现会越来越差。

  • 然而,尽管更高级的机器学习方法不能很快地解决这个难题,但它们确实发现了一些有趣的见解,并帮助人类得到更好的解决方案——卷积神经网络在这方面做得最好。而且,它们的性能比传统的解决方法更好。

  • 更好的数据比更好的算法重要。

后续:读者和编者的建议

我们请了一些更有经验的AI/ML专家(非常感谢Matt Zucker⑤、Youssef Keyrouz⑥和Mark Saroufim⑦)来检阅这篇文章,他们建议尝试以下想法来改进CNN算法。第2部分文章的主题可能会详细介绍,您也可以在https://github.com/kgaspard/flow-free ai上自己动手尝试这些想法(以及本文中详细介绍的方法):

  • 改变CNN的层数(减少特征看上去似乎没有什么用);

  • 除了使用对称来增加我们的数据点,还使用旋转、反射等方法;

  • 使用CNN的预测结果作为特征的强化学习智能体。

链接:

①:https://www.bigduckgames.com/

②:https://mzucker.github.io/2016/08/28/flow-solver.html

③:https://towardsdatascience.com/solving-sudoku-with-convolution-neural-network-keras-655ba4be3b11

④:https://github.com/kgaspard/flow-free-ai/blob/master/imageParser.py

⑤:https://mzucker.github.io/swarthmore/

⑥:https://www.researchgate.net/profile/

Youssef_Keyrouz

⑦:https://medium.com/@marksaroufim

原文标题:

Deep Learning vs Puzzle Games

原文链接:

https://towardsdatascience.com/deep-learning-vs-puzzle-games-e996feb76162

编辑:黄继彦

校对:汪雨晴

译者简介

王紫岳,悉尼大学Data Science在读研究生,在数据科学界努力奋斗的求知者。喜欢有挑战性的工作与生活,喜欢与朋友们热切交谈,喜欢在独处的时候读书品茶。张弛有度,才能够以最饱满的热情迎接有点忙碌的生活。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

独家 | 深度学习 V.S. 谜题游戏相关推荐

  1. 案例 :深度学习 V.S. 谜题游戏

    作者:Kabalan Gaspard  翻译:王紫岳   校对:陈汉青 本文约4000字,建议阅读10+分钟. 本文为大家介绍了作者使用不同的算法来解决Free Flow谜题游戏的心路历程,从一开始的 ...

  2. Udacity利用深度学习玩赛车小游戏

    Udacity利用深度学习玩赛车小游戏 简单介绍 准备工作 训练网络 效果 简单介绍 这是Udacity无人驾驶课程里一个利用深度学习实现的玩赛车小游戏, 附上链接:github项目 原理就是玩家手动 ...

  3. 独家 | 深度学习基础——激活函数以及什么时候使用它们?(附代码)

    作者:Dishashree Gupta 翻译:王紫岳 校对:王琦 本文约5200字,建议阅读20分钟 本文简要介绍了作者在初次进行机器学习的操作时所遇到的情况与得到的教训. 摘要 激活函数是神经网络的 ...

  4. 深度学习目标检测在游戏领域的应用

    原理 1.每秒15-25次截取指定窗口屏幕(录屏原理),帧率不用那么高比职业选手快就可以 2.根据每帧截取的图片进行目标检测推理返回所有敌人坐标 3.根据坐标计算截图中所有敌人的头部中心点 4.计算选 ...

  5. python游戏csgo开挂_V社:用深度学习检测CSGO中的开挂行为

    作者:Bot 编者按:事实上这是几个月前的一个PPT演讲.在GDC 2018上,Valve游戏工程师John McDonald介绍了度假社用深度学习提高CSGO用户游戏体验的尝试.之所以说是" ...

  6. 基于深度学习的一款五子棋小游戏

    今天分享一个基于深度学习而开发的AI小游戏 简单介绍 这一款基于深度学习的五子棋小游戏的界面是使用Unity开发的,而网络结构是使用keras搭建的. 环境 笔者的环境如下 操作系统 windows ...

  7. PyTorch核心贡献者开源书:《使用PyTorch进行深度学习》完整版现已发布!

    来源|新智元 [导读]<使用PyTorch进行深度学习>一书的完整版现已发布!教你如何使用PyTorch创建神经网络和深度学习系统,内含图解与代码,操作易上手. 由Luca Antiga. ...

  8. 迁移学习让深度学习更容易

    深度学习在一些传统方法难以处理的领域有了很大的进展.这种成功是由于改变了传统机器学习的几个出发点,使其在应用于非结构化数据时性能很好.如今深度学习模型可以玩游戏,检测癌症,和人类交谈,自动驾驶. 深度 ...

  9. 深度解析】Google第二代深度学习引擎TensorFlow开源(CMU邢波独家点评、白皮书全文、视频翻译)

    新智元原创1 作者:王嘉俊 王婉婷 TensorFlow 是 Google 第二代深度学习系统,今天宣布完全开源.TensorFlow 是一种编写机器学习算法的界面,也可以编译执行机器学习算法的代码. ...

最新文章

  1. ubuntu install opengl
  2. Chrome OS 设备或将允许用户自行选择 Linux 发行版
  3. 漫画:什么是囚徒困境?
  4. 第2课 贝贝的图形(vhist)-2019-07-11《聪明人的游戏-提高篇》
  5. listview中getview异步加载网络图片
  6. 面试官:select......for update会锁表还是锁行?
  7. figsize, dpi参数
  8. 实用软件工程(吕云翔版)——第一章
  9. SpringBoot修改内置tomcat版本
  10. DM数据库归档备份还原
  11. django3 websockets
  12. thinkpkp typecho maccms 全站加密不改动源码方法,多数php程序通用
  13. c软件查表获得电量代码_energy.c 源代码在线查看 - 基于单片机的多费率电能表源程序 资源下载 虫虫电子下载站...
  14. HDU5855 Less Time, More profit(最大权闭合子图)
  15. 清除计算机垃圾cmd命令,dos命令清理垃圾,教你dos命令清理垃圾的方法
  16. 3D建模游戏动漫模型制作软件都有哪些?最全解析,工具免费领
  17. 电脑调节屏幕亮度快捷键失灵の解决方案
  18. MySQL5.7用group by分组根据组中某个字段的最大值求取那条记录(注意是整条记录)
  19. c语言win32课程表,用C语言怎么编出来课程表
  20. python 解析yaml文件

热门文章

  1. 提高ActiveMQ工作性能
  2. linux磁盘管理系列一:磁盘配额管理
  3. Struts2漏洞的前因后果
  4. iphone开发 NSURL中fileURLWithPath和URLWithString的区别
  5. Fckeditor常见漏洞的挖掘与利用整理汇总
  6. 我所知道的网络管理软件
  7. 把Nginx注册成Windows的系统服务
  8. Python staticmethod() 函数
  9. hashmap 和 hashcode还是有点关系的
  10. 在Eclipse中导入Java程序