强化学习的发展很快,各种算法dqn,ddpg,acer,a2c,a3c,...等等层出不穷,并且不少有实力的组织都发布了各种算法的自己的实现的开源版本,其中最有名的是OPEN AI发布的baselines项目(基准线项目)其中实现了上述各种算法,并且附带了测试代码,只要安装好了就可以自己运行各种atari游戏的测试项目,非常方便。baselines项目是基于tenserflow的,所以安装起来麻烦一点,因为tenserflow比较大。
另外还有一个ChainerRL它是基于chainer这个深度学习框架的,chainer名气不如tenserflow但是它比较小,安装方便,同样也实现了上述的各种算法,也有直接可以运行测试的例子代码。比baselines一点也不差,所以我就在自己的笔记本上的ubuntu 16系统安装了chainerRL然后运行它的a3c算法来测试,在打砖块这个游戏上的表现。
这个测试要运行8千万次打砖块游戏,在我的笔记本上i5-2410m的cpu上(双核),用4线程运行(算法可以指定线程数目),cpu模式没有用gpu加速,运行了12天左右,最终得分是600多分,也就是砖块打光了,然后刷新了再打掉一大半这个水平。其中运行到1千6百万次(时间约一天多将近两天)的时候分数是300多分,也就是打掉一大半砖块。当时分数已经大大超越了人类高手水平了,人类高手是100分上下。
如果不是追求高分,只是想看看算法的自学习进展的话,到1千2百万次,约1天半时间就可以了,此时的分数是120分上下。
实验表明,a3c算法确实比原始dqn算法强很多,并且此算法也不需要很大的内存,dqn要6到10G内存,a3c算法4个线程总共用了不到1G内存。同时我也发现我的前文(回顾深度学习的源头:用神经网络玩打砖块游戏)中的一个错误。但是文章发过超过一定时间了,不能改了,所以就再发一篇来纠错,补遗。
先纠错,前文说:小球在墙和砖上是按照光线反射的方式反弹,但是在接球的板上反弹有一定的随机性,不是完全按照光线反射那样的。另外板和球接触时,板的速度方向和大小也对反弹方向有影响。也就是说一定程度可以人为改变反弹方向,但是没法完全控制球的走向。
这个说法并不对,这个游戏是确定的,在反弹时,没有随机性。如果小球的方向速度,接触板的位置,板的运动方向速度,相同的话反弹就是相同的。通过控制板的位置和运动速度,可以控制反弹的方向。
但是上述错误,并没有导致上文的结论错误,结论还是成立的。就是dqn算法虽然把球打到砖墙的后面,不断反弹得到了高分,但这并不能说明dqn算法学习到了某种长期策略,发现了这个技巧,这只是游戏本身设计就是如此,只要打到一定的分数,比如150上下,就有很大概率出现上述情况。本次实验现发一个新现象更能说明这个问题。
补遗,说说新发现的现象:当打到4百多分时,只剩下了两三个砖块了,接到球了,弹回去没有击中剩下的砖块,通过墙壁又反弹回来,再接到球,球又按上次的线路反弹回去,自然就不可能打中剩下的砖块,如此循环。永无休止了。这就说明a3c算法,没有学会要反弹球击中砖块,它只学会了接球。a3c做不到的事,dqn自然也是无能为力的。所以上文结论还是成立的。
当然实际实验中不会在一个未击中砖块的循环线路上永远反弹下去。算法中有一定的随机性。结果就是空循环若干次,相同的线路后,某次板的位置变了,导致没接到球 game over 或者球击中板的另一个位置,或者板的速度变好了,导致反弹的线路变了,击中砖块了。运气好的话可以把剩下的砖块打光。
这种随机性,是存在于对神经网络的输出进行的解释上的。也就是说上述各种算法,他们的神经网络都是确定的,无论是网络的结构,还是网络的权重都是确定的,对于同样的输入,得到的是唯一不变的输出。如果吧网络的输出看做是各种可能的动作的概率,虽然输出是不变的,但因为是概率,那么最终选择的动作就会有随机性。
由此我们就发现了,虽然科学家们设计了数学上来说非常复杂(在我看了挺复杂,他们可能觉得很简单),非常巧妙的方法来产生最好的(他们认为最好的)随机性,比如说引入了gumbel 分布的一种概率上的方法。但是这种方法本质上和简单的均匀分布的随机方法是相同的。其中没有半点自由意志。
随机的,哪怕是很巧妙的随机选取不同的动作,和知道现在的动作不行,要接到球,但是要用板子的另一个位置或板子的不同运动速度接到球,就必须采取另外的动作。这二者的差别是天差地别。这就是现在的哪怕是最好的(公开的各种算法中)算法都存在的一大不足,他们都是确定的,或者说是固定的方法,没有半点灵活性。
当然现在的各种算法,还是太简单,希望从这种简单网络中,产生某种灵活性,是太奢望了。哪怕是如打砖块这种玩具场景,现在的a3c基本上接近满分了,但是还是有很大的进步空间,比如说用最少的时间打到满分,就要求尽量减少上述的空反弹循环,灵活性并非随机性也许是一个解决之道。
所以呢,哪怕是我们没有没有足够的知识可以慢慢学,很多大神给我们提供了很好的学习条件,开源了高水平的代码。哪怕是没有很高端的硬件,算力很有限,那我们可以运行比如atari游戏这样的玩具项目,一样的可以经行实验。而且这样的玩具项目也是很有深度的,有足够的展示才华的空间,加油吧!
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved