现在深度学习非常热门,它在棋类上已经超过人类了,它的源头是强化学习。强化学习受到瞩目,最初是因为它成功的学会了玩打砖块游戏。本文就是详细的介绍整个过程,会介绍很多的细节,让您详细的了解整个事情。我认为初学者学习AI,这是最好的学习材料。
首先介绍打砖块游戏,如果你没有亲自打过这个游戏,其中很多细节你肯定是不知道的。这个游戏是1976年雅立达公司制作的,是世界上最早的电子游戏之一。运行在雅立达游戏机上,它的大小只有2k,是现在一个普通游戏大小的百万分之一或者更小。游戏画面见下图。
打砖块游戏截图
上面数字055是得分数,第二个数字2是剩余的命还有几条,初始5条命,最右边的1是双人游戏用的,不用管它。外围左右和上方的白色边是墙,小球会在上面反弹。底部没有墙,有一块可以移动的板子,由玩家控制左右移动,挡住球反弹回去,没接到球就掉下去,扣1条命。
中间靠上有颜色的是砖块,一共6层砖块,每层18块砖。小球击中砖块,砖块就消失,小球也被反弹开,越上层的砖,小球反弹的速度越快。游戏的难度就在这里,打到上面的砖,反应慢了就接不到球。还有小球从顶上的墙反弹后,接球的板子长度会变短,这同样是增加了难度。第一二层砖块分数是1,第三四层分数4,第五六层是7,所以砖块全打完分数是18*24共432分。砖块全打完还会重新刷出来一次,所以这游戏,最高分数是864分。
另外小球在墙和砖上是按照光线反射的方式反弹,但是在接球的板上反弹有一定的随机性,不是完全按照光线反射那样的。另外板和球接触时,板的速度方向和大小也对反弹方向有影响。也就是说一定程度可以人为改变反弹方向,但是没法完全控制球的走向。
2015年deepmind的一个研究员Andriy Mnih发布了一个视频,显示了他们用神经网络玩这个游戏的情况。下面是这个视频的截图:
视频开始是训练100轮的效果,得分很低5分以内,打了几个砖块,常常接不到小球。
训练100轮
然后是训练200轮,此时得分到了接近10分。
训练200轮
然后是训练了400轮,得分到了17分了。
训练400轮
然后是600轮训练,出现了一个神奇的状况,此时得分到了70分左右,视频上说神经网络找到并使用了最好的策略,它把砖墙打穿了,把球打到了砖墙后面的空间,不断反弹,得到高分。
训练600轮
这个视频当时引起了轰动,但是正如我们刚才分析反弹的细节。反弹是有随机性的,不是想打去什么地方,然后又控制的好就可以打去什么地方。如果我们自己玩这个游戏足够多次,或者复现DQN的方法用程序实验足够多次,你就会发现只要你打的分足够高比如80分左右,上面的打穿墙到后面反弹的情况是大概率出现的,不用你刻意控制反弹方向,就会自然出现这种情况。
与其说是网络学会了某种高级策略,不如说是游戏的设计者,设计得高明,砖墙到后面的屋顶留下一块空间这是独具匠心的巧妙设计,只要打到一定分数就会出上述种奇妙的情况。当然这里不是否定神经网络的作用,它确实从一无所知学会了打这个游戏,而且超过了人类水平。只是说这里并没有高级策略。关于这一点后面还有其他的佐证。
这个视频到训练600轮就没了,那么训练800轮会如何呢?根据我的经验,学习的摆动幅度是很大的,打通砖墙,分数取得大提升后,肯定会得分急速下降,然后要经过很长的训练再度缓慢上升。最终能否通关呢,deepmind的第一版和第二版网络,我认为是不行的。当然后来围棋那么困难的项目都突破了,通关这个肯定是没问题。
后来deepmind发表了相关论文,开源了他的网络设计。接下来看看deepmind用神经网络是如何打这个游戏的,它的程序包含几个部分,一个是游戏的模拟器,可以用程序控制游戏的进程;第二部分是一个神经网络;第三部分就是连接以上二者的控制程序,它负责把模拟器输出的图像输入神经网络,并把网络的输出转换成游戏的输入。这样就可以让网络不断地打这个游戏,进行自我训练。
网络输入的是游戏的白色墙范围内的截图,是210 X 160 像素的图像。经过压缩转换成84 X 84 的黑白图像输入网络中,另外一个输入是当前的得分和剩余几条命。网络输出一共四个,接球板左移,接球板右移,发球,球板原地不动。
可见系统里面没有和打砖块游戏有关的信息,比如球板位置,球的位置,球的速度,砖块位置等等,这些统统没有。它仅仅提供图像和得分数和命的数量信息。训练开始的时候,基本上是随机乱动,比如说,它甚至不知道要先发球。可能出现它球都没发,一直在左右移动球板这种尴尬状况。
但是它不断随机的采取动作,它终究会发出球的,并且终究会很偶然的接到球。成百上千甚至更多次的重复后,接球成功率会慢慢的提高。根据我的经验,在一台最普通的笔记本,2010年的主流配置,仅仅用cpu来运行,运行两三个小时之后就可以看到明显的进步。此时大约可以成功接球三五次,得分十分左右。观看这个程序从一无所知到慢慢进步,是很震撼的。这种感觉和阿尔法零,自我对弈,自我进步,是一样的。
纵坐标是得分,横坐标是训练次数
但是事情并不是一帆风顺,看上面的图,训练3000次之后,平均得分超过10分了。最高分甚至到了30分。随着打掉的砖块多了,上层的砖块就露出来了。打中第三层的砖块反弹球的速度就快的多了。打中第五层反弹速度就更快了。而球板运动速度是有限的,很可能反应不过来。此时第一个策略:在球下落时,板要靠近球。就不够用了。需要第二个策略:要在球的上升阶段把球板放到中间位置,才会在下落时有足够的时间来接球。这道是一个实打实的高级策略。
根据我的经验,在上述硬件的情况下,采用deepmind开源的网络结构(先后有两个不同版本的网络)都很难学会上述高级策略。分数会在30到70之间摆动。打穿砖墙,打到后面得高分的情况很难出现。并且由于网络采用的是ReLU激活神经元,学习率大了会出现无穷大,网络会爆掉。为什么做不成deepmind论文的效果呢?有可能是硬件太弱,训练次数不够,也可能是其它原因,我也没弄清楚。
总结一下,我们可以用很一般的硬件,采用github上面的其他人复现deepmind的DQN的代码,来自己做实验。在几个小时以内就可以看到得分的稳步提高。达到人类玩这个游戏的水平(30分上下)是不难的。但是要达到deepmind的水平(得分400左右)就很难。
当年deepmind做到400分就转向围棋研究了,没有继续在打砖块上深入。其实别看这是个玩具项目,它的难度还是有的,而且是越到后面越难。最高分是864分。400分还差的远呢。这也从侧面佐证了deepmind的DQN也没有学到最高级的策略,它并不能主动控制球的走向。打到后期,剩下的砖块很少的时候,就有必要控制球的反弹方向了,不然会一直打不到剩下的砖块。并且它的400分还是好几条命累加的,不是一命通关。
所以说这是个很好的人工智能入门项目,还有挖掘的空间。爱好者可以关注一下。
这篇文章并没有涉及具体的网络结构和程序,因为这样的文章已经很多了,但是讲打砖块细节的文章却不多。希望能丰富一点大家对这个事情的了解。如果有人想知道自己做实验的过程,然后再网上找了很多相关文章看了后,任然不得要领,或者碰到爬不过的坑,可以在评论留言,人多的话,我就另写一篇,介绍实际操作过程。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved