讲人话系列——DQN初探之2048

2019-12-09  本文已影响0人  张凡宇

概述

强化学习也火了好久,最近才有空来充充电。老实说,最开始强化学习的知识点还挺多的,看了好久也没太弄清楚几个算法的关系,所以本着实践出真知的想法,找个案例做下。2048小游戏感觉本身复杂度还可以,又是个model-base的模型,检查起来比较方便,并且可以简化到2x2,3x3,所以感觉是个很不错的demo案例。顺便学习下传统的DP那一套东西,所以也做了一些很简单的实验来巩固下知识。本文还是会参杂很多个人想法,很多想法来自一些实验测试结果。关于理论的东西网上讲的已经很多了。因为查阅资料的时候,看到很多人在尝试DQN on 2048的时候遇到了不少问题,所以和大家进行下分享。

最终效果

实验过程

随机测试:

定义:

4x4的游戏中随机算法评测:

这里大概评估下随机水平,方便后面评估。

DQN初探:

按照自己的想法构建了一个最初版本的DQN

结果:网络到max_score:3000之后,好像跑不动了。这里一脸蒙,不知道有啥可以改的。于是发现这个事情并不简单,就想简化问题到2x2看看能不能有啥收货,顺便补习下传统的一些RL算法,验证下最优原理。

值迭代、策略迭代、蒙特卡洛、Q-learning

值迭代:


值迭代

策略迭代:


策略迭代

DQN 在2x2

当用值迭代、策略迭代得到了理论最优值之后,又用DQN测试了一把。发现DQN结果比最优值总是差点,这就说明网络和学习策略确实有点问题,但同时侧面又反映了,2x2的时候能很接近最优策略,4x4差的比较远,那么很大部分问题可能来自参数化和探索方面。(空间变大会设计到的点)

总结几个提升慢原因:

DQN-2013 + 网络层迭代、bug修复

从2x2的地方看出,参数化有问题,那么第一个想法就是优化下网络,dnn还是太粗暴了,还是得cnn,这里就有几个方案:

新版本改进:修复了探索的bug,reward做了log变化,网络换成了emb+cnn,新结果如下:

但是问题也暴露的很明显:

DDQN/DQN2015

一般讲DQN的三个优化:DDQN/Prioritized Experience Replay/dueling-DQN

到这里,其实有点调不下去了,后来在网上翻到了一个代码。能跑出2048,天呐,发现宝了,做了很多测试,发现我和他的方案上差异还是蛮大的,然后就开始了一点点比较的阶段。

复现Github方案

先提出别人和我方案的差异点:

我在他的方案上做了一系列实验:

实验1:把e-greedy改成最小0.1
实验结果:

实验2:用数值网络代替one-hot+cnn
实验结果:

实验3:reward改成每步获取score

实验4:在原基础上只用max_tile来作为回报,拿掉合并分数。

在做完上述一系列实验后,我大致有了个数,然后对自己的实验进行了优化。
优化方案:

之后测试了下ddqn,发现收敛比较。本身把memory_size设置小了之后,过估计就没有这么严重了。这里简单分下,过估计本身在Q-learning中就存在,回访池过大之后,训练越多,过估计越严重,在没有很好的高分数据前,就给搞过估计了,所以后面就不好迭代了。反而用小点的话,过估计不严重,在高分出现后也不会淹没在数据中,对于这个任务可能更好一点。很多结论可能都与这种需要长期规划的性质相关。

蒙特卡洛树搜索探索

出于对alphaGo的膜拜,我也想过,dqn很多时候不好训练,就是很难拿到高分训练数据,能不能和alphaGo一样,用个mcts,就简单做了下。结果如下:

需要监控的点

训练情况

小结

到此,2048的探索可能就先告一段落,虽然很多事情并没有研究太明白。但是对于整个算法有了个基础的认识。并对算法中可能存在的优化点有了一些了解。后续可能会尝试下策略梯度那一趴的东西。

资料

上一篇下一篇

猜你喜欢

热点阅读