概述
強(qiáng)化學(xué)習(xí)也火了好久狸臣,最近才有空來(lái)充充電。老實(shí)說(shuō)昌执,最開(kāi)始強(qiáng)化學(xué)習(xí)的知識(shí)點(diǎn)還挺多的烛亦,看了好久也沒(méi)太弄清楚幾個(gè)算法的關(guān)系,所以本著實(shí)踐出真知的想法懂拾,找個(gè)案例做下煤禽。2048小游戲感覺(jué)本身復(fù)雜度還可以,又是個(gè)model-base的模型岖赋,檢查起來(lái)比較方便檬果,并且可以簡(jiǎn)化到2x2,3x3,所以感覺(jué)是個(gè)很不錯(cuò)的demo案例唐断。順便學(xué)習(xí)下傳統(tǒng)的DP那一套東西选脊,所以也做了一些很簡(jiǎn)單的實(shí)驗(yàn)來(lái)鞏固下知識(shí)。本文還是會(huì)參雜很多個(gè)人想法脸甘,很多想法來(lái)自一些實(shí)驗(yàn)測(cè)試結(jié)果恳啥。關(guān)于理論的東西網(wǎng)上講的已經(jīng)很多了。因?yàn)椴殚嗁Y料的時(shí)候丹诀,看到很多人在嘗試DQN on 2048的時(shí)候遇到了不少問(wèn)題钝的,所以和大家進(jìn)行下分享翁垂。
最終效果
- 大概率能玩出2048
- 最高可以玩3w多分
- 均值1w多分
- 仍有上升空間(可能有啥bug,跑久了容易掛硝桩,就沒(méi)繼續(xù)跑了)
- 網(wǎng)上能查到的比較厲害的差不多到4096(AI)沮峡,比例也比較小。
實(shí)驗(yàn)過(guò)程
隨機(jī)測(cè)試:
定義:
- max_tile:4x4格子中最大方塊數(shù)
- max_score:n局下來(lái)最大總分?jǐn)?shù)(n in 50-100)
- avg_score:n局平均分?jǐn)?shù)(n in 50-100)
4x4的游戲中隨機(jī)算法評(píng)測(cè):
- max_tile:256
- avg_score:700+
- max_score:2k+
這里大概評(píng)估下隨機(jī)水平亿柑,方便后面評(píng)估。
DQN初探:
按照自己的想法構(gòu)建了一個(gè)最初版本的DQN
- net:4*4直接reshape(-1,16) - dense_layer(128) - dense_layer_(4)
- memory_sie:100w
- lr:0.001(固定)
- reward:每次運(yùn)行后得分
- gamma(延遲衰減):1
- e-greedy:指數(shù)衰減棍弄,最小0.1
結(jié)果:網(wǎng)絡(luò)到max_score:3000之后望薄,好像跑不動(dòng)了。這里一臉蒙呼畸,不知道有啥可以改的痕支。于是發(fā)現(xiàn)這個(gè)事情并不簡(jiǎn)單,就想簡(jiǎn)化問(wèn)題到2x2看看能不能有啥收貨蛮原,順便補(bǔ)習(xí)下傳統(tǒng)的一些RL算法卧须,驗(yàn)證下最優(yōu)原理。
值迭代儒陨、策略迭代花嘶、蒙特卡洛、Q-learning
值迭代:
策略迭代:
- 值迭代蹦漠、策略迭代椭员、蒙特卡洛、Q-learning:2*2上可以快速收斂笛园。
- Q-learning感覺(jué)會(huì)稍微有點(diǎn)波動(dòng)隘击。
DQN 在2x2
當(dāng)用值迭代、策略迭代得到了理論最優(yōu)值之后研铆,又用DQN測(cè)試了一把埋同。發(fā)現(xiàn)DQN結(jié)果比最優(yōu)值總是差點(diǎn),這就說(shuō)明網(wǎng)絡(luò)和學(xué)習(xí)策略確實(shí)有點(diǎn)問(wèn)題棵红,但同時(shí)側(cè)面又反映了凶赁,2x2的時(shí)候能很接近最優(yōu)策略,4x4差的比較遠(yuǎn)窄赋,那么很大部分問(wèn)題可能來(lái)自參數(shù)化和探索方面哟冬。(空間變大會(huì)設(shè)計(jì)到的點(diǎn))
總結(jié)幾個(gè)提升慢原因:
- 沒(méi)有找到足夠高分的點(diǎn)訓(xùn)練
- e-greedy
- 游戲本身隨機(jī)性
- 找到高分點(diǎn)后,沒(méi)有訓(xùn)練到
- 被訓(xùn)練數(shù)據(jù)淹沒(méi)-memory_size
- lr和高分沒(méi)有匹配上,太小了
- reward設(shè)計(jì)不合理
DQN-2013 + 網(wǎng)絡(luò)層迭代忆绰、bug修復(fù)
從2x2的地方看出浩峡,參數(shù)化有問(wèn)題,那么第一個(gè)想法就是優(yōu)化下網(wǎng)絡(luò)错敢,dnn還是太粗暴了翰灾,還是得cnn缕粹,這里就有幾個(gè)方案:
- 原始值 + cnn
- one-hot + cnn
- emb + cnn
- cur + next-step + cnn(github上看到別人的做法,借鑒的alphaGoZero)
新版本改進(jìn):修復(fù)了探索的bug纸淮,reward做了log變化平斩,網(wǎng)絡(luò)換成了emb+cnn,新結(jié)果如下:
- max_score:6000
- max_tile:1024
但是問(wèn)題也暴露的很明顯:
- loss出現(xiàn)了非逞士椋夸張的發(fā)散問(wèn)題绘面,預(yù)測(cè)值過(guò)估計(jì)嚴(yán)重。如下圖侈沪,大概意思就是loss變得巨大無(wú)比之后揭璃,效果就開(kāi)始變差,loss也下來(lái)了亭罪。
DDQN/DQN2015
一般講DQN的三個(gè)優(yōu)化:DDQN/Prioritized Experience Replay/dueling-DQN
- DDQN/DQN2015的兩個(gè)方案在2048的案例中都沒(méi)有啥效果瘦馍,過(guò)估計(jì)仍然很?chē)?yán)重。
- 后面兩個(gè)沒(méi)有提到對(duì)過(guò)估計(jì)的問(wèn)題应役,所以沒(méi)有嘗試情组。
- dueling-dqn在別人的一篇文章中有測(cè)試,dueling-dqn比ddqn的上限要高箩祥,早期好像差別也不大院崇。
到這里,其實(shí)有點(diǎn)調(diào)不下去了袍祖,后來(lái)在網(wǎng)上翻到了一個(gè)代碼亚脆。能跑出2048,天吶盲泛,發(fā)現(xiàn)寶了濒持,做了很多測(cè)試,發(fā)現(xiàn)我和他的方案上差異還是蠻大的寺滚,然后就開(kāi)始了一點(diǎn)點(diǎn)比較的階段柑营。
復(fù)現(xiàn)Github方案
先提出別人和我方案的差異點(diǎn):
- lr別人用了離散衰減,start-lr = 0.0005
- reward:用了max_tile增量+合并單元數(shù)
- memory_size:60004迨印9偬住!
- 更新方案:dqn2013蚁孔,沒(méi)用target
- gamma:0.9
- egreedy:0.9 昌粤,10000步后快速收斂到0
-
net:一個(gè)比較定制化的one-hot + cnn
我在他的方案上做了一系列實(shí)驗(yàn):
實(shí)驗(yàn)1:把e-greedy改成最小0.1
實(shí)驗(yàn)結(jié)果:
- max_score到1w+后開(kāi)始增長(zhǎng)變得很慢姐仅,很久都沒(méi)有提升。說(shuō)明該任務(wù)本身具有比較強(qiáng)的前后相關(guān)性和隨機(jī)性,最終還保持較高的探索難以發(fā)現(xiàn)最佳值椒丧。
實(shí)驗(yàn)2:用數(shù)值網(wǎng)絡(luò)代替one-hot+cnn
實(shí)驗(yàn)結(jié)果:
- 提升沒(méi)有之前快了商佛,這個(gè)實(shí)驗(yàn)沒(méi)跑完就掛了愁茁,但是raw的效果不如cnn。說(shuō)明網(wǎng)絡(luò)結(jié)構(gòu)影響比較大
實(shí)驗(yàn)3:reward改成每步獲取score
- 監(jiān)控幾乎和之前差不多摆尝,說(shuō)明兩個(gè)reward設(shè)計(jì)都可行。
實(shí)驗(yàn)4:在原基礎(chǔ)上只用max_tile來(lái)作為回報(bào)因悲,拿掉合并分?jǐn)?shù)堕汞。
- 無(wú)法達(dá)到2048,在1024前就好像不漲了晃琳。說(shuō)明reward也不能設(shè)計(jì)的太隨意讯检,要保持和訓(xùn)練方案比較高的協(xié)調(diào)性,只用max的話卫旱,reward會(huì)比較稀疏视哑。
在做完上述一系列實(shí)驗(yàn)后,我大致有了個(gè)數(shù)誊涯,然后對(duì)自己的實(shí)驗(yàn)進(jìn)行了優(yōu)化。
優(yōu)化方案:
- lr設(shè)計(jì)成離散衰減
- gamma:1 (沒(méi)變)
- reward:score (沒(méi)變)
- 更新方案:dqn-2013(沒(méi)變)
- memory_size:6000
- egreedy:0.9指數(shù)衰減蒜撮,10000步后快速收斂到0
- net:emb+普通2*2的cnn2層 (不變)
結(jié)果: - max_score:3.4w
- max_tile:2048
- avg_score:10000
- 截張圖看下:
之后測(cè)試了下ddqn暴构,發(fā)現(xiàn)收斂比較。本身把memory_size設(shè)置小了之后段磨,過(guò)估計(jì)就沒(méi)有這么嚴(yán)重了取逾。這里簡(jiǎn)單分下,過(guò)估計(jì)本身在Q-learning中就存在苹支,回訪池過(guò)大之后砾隅,訓(xùn)練越多,過(guò)估計(jì)越嚴(yán)重债蜜,在沒(méi)有很好的高分?jǐn)?shù)據(jù)前晴埂,就給搞過(guò)估計(jì)了,所以后面就不好迭代了寻定。反而用小點(diǎn)的話儒洛,過(guò)估計(jì)不嚴(yán)重,在高分出現(xiàn)后也不會(huì)淹沒(méi)在數(shù)據(jù)中狼速,對(duì)于這個(gè)任務(wù)可能更好一點(diǎn)琅锻。很多結(jié)論可能都與這種需要長(zhǎng)期規(guī)劃的性質(zhì)相關(guān)。
蒙特卡洛樹(shù)搜索探索
出于對(duì)alphaGo的膜拜向胡,我也想過(guò)恼蓬,dqn很多時(shí)候不好訓(xùn)練,就是很難拿到高分訓(xùn)練數(shù)據(jù)僵芹,能不能和alphaGo一樣处硬,用個(gè)mcts,就簡(jiǎn)單做了下。結(jié)果如下:
- 純蒙特卡洛樹(shù)搜索的方案:每步模擬100-200拇派,可以輕松到達(dá)2048郁油,均值2w+(這里測(cè)試數(shù)據(jù)不多本股,跑的很慢,所以想用mcts來(lái)訓(xùn)練dqn的方案也被pass了)桐腌。
需要監(jiān)控的點(diǎn)
- loss:DQN過(guò)估計(jì)嚴(yán)重拄显,需要密切關(guān)注loss情況
- max-label:如果沒(méi)有出現(xiàn)過(guò)大值,看看探索過(guò)程是不是有問(wèn)題案站。后期探索不能太大躬审。
- e-greedy:關(guān)注探索程度
- episode:關(guān)注大致進(jìn)度和速度
- lr:這個(gè)和loss配合著看
- 評(píng)估指標(biāo):avg/max score
RL的任務(wù)感覺(jué)需要監(jiān)控的內(nèi)容更多,不光是監(jiān)督學(xué)習(xí)的部分蟆盐,探索的部分也很重要承边。
訓(xùn)練情況
- 訓(xùn)練出2048,要2個(gè)小時(shí)左右石挂。大概2w episode這個(gè)樣子博助。
小結(jié)
到此,2048的探索可能就先告一段落痹愚,雖然很多事情并沒(méi)有研究太明白富岳。但是對(duì)于整個(gè)算法有了個(gè)基礎(chǔ)的認(rèn)識(shí)。并對(duì)算法中可能存在的優(yōu)化點(diǎn)有了一些了解拯腮。后續(xù)可能會(huì)嘗試下策略梯度那一趴的東西窖式。