探索强化学习 DQN 在2048游戏中的应用初步分析
文章作者:张小凡
编辑整理:Hoh Xil
内容来源:作者授权发布
出品平台:DataFunTalk
注:欢迎转载,转载请留言。
导读:强化学习也火了好久,最近才有空来充充电。老实说,最开始强化学习的知识点还挺多的,看了好久也没太弄清楚几个算法的关系,所以本着实践出真知的想法,找个案例做下。2048小游戏感觉本身复杂度还可以,又是个 model-base 的模型,检查起来比较方便,并且可以简化到2x2,3x3,所以感觉是个很不错的 demo 案例。顺便学习下传统的 DP 那一套东西,所以也做了一些很简单的实验来巩固下知识。本文还是会参杂很多个人想法,很多想法来自一些实验测试结果。关于理论的东西网上讲的已经很多了。因为查阅资料的时候,看到很多人在尝试 DQN on 2048 的时候遇到了不少问题,所以和大家进行下分享。
▌最终效果
大概率能玩出2048
最高可以玩 3w 多分
均值 1w 多分
仍有上升空间 ( 可能有啥 bug,跑久了容易挂,就没继续跑了 )
网上能查到的比较厉害的差不多到4096 (AI),比例也比较小。
▌实验过程
1. 随机测试:
定义:
max_tile:4x4格子中最大方块数
max_score:n局下来最大总分数 ( n in 50-100 )
avg_score:n局平均分数 ( n in 50-100 )
4x4的游戏中随机算法评测:
max_tile:256
avg_score:700+
max_score:2k+
这里大概评估下随机水平,方便后面评估。
2. DQN 初探:
按照自己的想法构建了一个最初版本的 DQN
net:4*4直接reshape(-1,16) - dense_layer(128) - dense_layer_(4)
memory_sie:100w
lr:0.001(固定)
reward:每次运行后得分
gamma(延迟衰减):1
e-greedy:指数衰减,最小0.1
结果:网络到 max_score:3000 之后,好像跑不动了。这里一脸蒙,不知道有啥可以改的。于是发现这个事情并不简单,就想简化问题到2x2看看能不能有啥收货,顺便补习下传统的一些 RL 算法,验证下最优原理。
▌值迭代、策略迭代、蒙特卡洛、Q-learning
1. 值迭代:
值迭代
2. 策略迭代:
策略迭代
值迭代、策略迭代、蒙特卡洛、Q-learning:2*2上可以快速收敛。
Q-learning 感觉会稍微有点波动。
3. DQN 在2x2
当用值迭代、策略迭代得到了理论最优值之后,又用 DQN 测试了一把。发现 DQN 结果比最优值总是差点,这就说明网络和学习策略确实有点问题,但同时侧面又反映了,2x2的时候能很接近最优策略,4x4差的比较远,那么很大部分问题可能来自参数化和探索方面。(空间变大会涉及到的点)
总结几个提升慢原因:
没有找到足够高分的点训练
- e-greedy
- 游戏本身随机性
找到高分点后,没有训练到
被训练数据淹没-memory_size
lr 和高分没有匹配上,太小了
reward 设计不合理
4. DQN-2013 + 网络层迭代、bug 修复
从2x2的地方看出,参数化有问题,那么第一个想法就是优化下网络,dnn 还是太粗暴了,还是得 cnn,这里就有几个方案:
原始值 + cnn
one-hot + cnn
emb + cnn
cur + next-step + cnn(github上看到别人的做法,借鉴的alphaGoZero)
新版本改进:修复了探索的 bug,reward 做了 log 变化,网络换成了 emb+cnn,新结果如下:
max_score:6000
max_tile:1024
但是问题也暴露的很明显:
loss 出现了非常夸张的发散问题,预测值过估计严重。如下图,大概意思就是 loss 变得巨大无比之后,效果就开始变差,loss 也下来了。
loss 图
5. DDQN/DQN2015
一般讲 DQN 的三个优化:DDQN/Prioritized Experience Replay/dueling-DQN
DDQN/DQN2015 的两个方案在2048的案例中都没有啥效果,过估计仍然很严重。
后面两个没有提到对过估计的问题,所以没有尝试。
dueling-dqn 在别人的一篇文章中有测试,dueling-dqn 比 ddqn 的上限要高,早期好像差别也不大。
到这里,其实有点调不下去了,后来在网上翻到了一个代码。能跑出2048,天呐,发现宝了,做了很多测试,发现我和他的方案上差异还是蛮大的,然后就开始了一点点比较的阶段。
6. 复现 Github 方案
先提出别人和我方案的差异点:
lr别人用了离散衰减,start-lr = 0.0005
reward:用了max_tile增量+合并单元数
memory_size:6000!!!
更新方案:dqn2013,没用target
gamma:0.9
egreedy:0.9,10000步后快速收敛到0
net:一个比较定制化的one-hot + cnn
我在他的方案上做了一系列实验:
实验1:把 e-greedy 改成最小0.1
实验结果:
max_score 到 1w+ 后开始增长变得很慢,很久都没有提升。说明该任务本身具有比较强的前后相关性和随机性,最终还保持较高的探索难以发现最佳值。
实验2:用数值网络代替 one-hot+cnn
实验结果:
提升没有之前快了,这个实验没跑完就挂了,但是 raw 的效果不如 cnn。说明网络结构影响比较大
实验3:reward 改成每步获取 score
监控几乎和之前差不多,说明两个 reward 设计都可行。
实验4:在原基础上只用 max_tile 来作为回报,拿掉合并分数
无法达到2048,在1024前就好像不涨了。说明 reward 也不能设计的太随意,要保持和训练方案比较高的协调性,只用 max 的话,reward 会比较稀疏。
在做完上述一系列实验后,我大致有了个数,然后对自己的实验进行了优化。
优化方案:
lr设计成离散衰减
gamma:1 (没变)
reward:score (没变)
更新方案:dqn-2013(没变)
memory_size:6000
egreedy:0.9指数衰减,10000步后快速收敛到0
net:emb+普通2*2的cnn2层 (不变)
结果:
max_score:3.4w
max_tile:2048
avg_score:10000
截张图看下:
2048
上一篇: 安卓开发报告:2048小游戏的Android版本开发报告
下一篇: 对 游戏 《 2048 》 的一些思考
推荐阅读
-
探索强化学习 DQN 在2048游戏中的应用初步分析
-
【摩尔线程+Colossal-AI强强联手】MusaBert登上CLUE榜单TOP10:技术细节揭秘 - 技术实力:摩尔线程凭借"软硬兼备"的技术底蕴,让MusaBert得以从底层优化到顶层。其内置多功能GPU配备AI加速和并行计算模块,提供了全面的AI与科学计算支持,为AI推理和低资源条件下的大模型训练等场景带来了高效、经济且环保的算力。 - 算法层面亮点:依托Colossal-AI AI大模型开发系统,MusaBert在训练过程中展现出了卓越的并行性能与易用性,特别在预处理阶段对DataLoader进行了优化,适应低资源环境高效处理海量数据。同时,通过精细的建模优化、领域内数据增强以及Adan优化器等手段,挖掘和展示了预训练语言模型出色的语义理解潜力。基于MusaBert,摩尔线程自主研发的MusaSim通过对比学习方法微调,结合百万对标注数据,MusaSim在多个任务如语义相似度、意图识别和情绪分析中均表现出色。 - 数据资源丰富:MusaBert除了自家高质量语义相似数据外,还融合了悟道开源200GB数据、CLUE社区80GB数据,以及浪潮公司提供的1TB高质量数据,保证模型即便在较小规模下仍具备良好性能。 当前,MusaBert已成功应用于摩尔线程的智能客服与数字人项目,并广泛服务于语义相似度、情绪识别、阅读理解与声韵识别等领域。为了降低大模型开发和应用难度,MusaBert及其相关高质量模型代码已在Colossal-AI仓库开源,可快速训练优质中文BERT模型。同时,通过摩尔线程与潞晨科技的深度合作,仅需一张多功能GPU单卡便能高效训练MusaBert或更大规模的GPT2模型,显著降低预训练成本,进一步推动双方在低资源大模型训练领域的共享目标。 MusaBert荣登CLUE榜单TOP10,象征着摩尔线程与潞晨科技联合研发团队在中文预训练研究领域的领先地位。展望未来,双方将携手探索更大规模的自然语言模型研究,充分运用上游数据资源,产出更为强大的模型并开源。持续强化在摩尔线程多功能GPU上的大模型训练能力,特别是在消费级显卡等低资源环境下,致力于降低使用大模型训练的门槛与成本,推动人工智能更加普惠。而潞晨科技作为重要合作伙伴,将继续发挥关键作用。