强化学习七日打卡营终极复现之flappy bird
7天的實戰(zhàn)很快就過去了,在調(diào)參調(diào)到懷疑人生時,“標準答案”卻出奇的簡單,另外每次訓(xùn)練時間都非常長,要是有加快訓(xùn)練的方法就好了。最后有一個終極復(fù)現(xiàn)可以自由發(fā)揮,這就來實現(xiàn)曾經(jīng)想玩的flappy bird。
這里是目錄
- 原理
- 基本概念
- Q學(xué)習(xí)
- 環(huán)境
- 實現(xiàn)過程
- 模型選取
- 圖像預(yù)處理
- 調(diào)試與優(yōu)化
- 總結(jié)與展望
原理
基本概念
強化學(xué)習(xí)是一種在與環(huán)境交互過程中學(xué)習(xí)的方法。
通過動作施加影響 動作的收益 反饋環(huán)境的變化 智能主體 環(huán)境比如在日常生活中,
- 前方有一棵樹(環(huán)境)
- 人向前走了一步(動作)
- 撞到了樹(環(huán)境變化)
- 并且覺得痛(收益)
- 下次碰到樹換個方向走(更新策略)
強化學(xué)習(xí)的問題定義:
給定馬爾可夫決策過程MDP= { S , A , P r , R , γ } \{S,A,Pr,R,\gamma\} {S,A,Pr,R,γ},尋找一個最優(yōu)策略 π ? \pi^* π?,對任意 s ∈ S s\in S s∈S,使得價值 V π ? ( s ) 值 最 大 V_{\pi^*}(s)值最大 Vπ??(s)值最大。
Q學(xué)習(xí)
Q學(xué)習(xí)是基于價值的方法,即對價值函數(shù)進行建模和估計,以此為依據(jù)制定策略。它使用一個Q表格來記錄不同狀態(tài)下不同動作的價值。決策時根據(jù)狀態(tài)選擇價值最高的動作。
Q學(xué)習(xí)也是基于時序差分的方法 ,即基于時序差分進行價值函數(shù)更新。
具體過程如下
當狀態(tài)數(shù)非常多甚至連續(xù)分布時,有些狀態(tài)很難采樣到,也不可能用一張表來記錄q函數(shù)。
這時候可以使用值函數(shù)近似(將q函數(shù)參數(shù)化),用一個非線性模型來擬合它,比如說神經(jīng)網(wǎng)絡(luò),DQN就是這樣一種算法。
環(huán)境
深度學(xué)習(xí)框架
- PaddlePaddle
- PARL
Flappy Bird GYM環(huán)境
- PyGame Learning Environment (PLE)
- OpenAI PLE environment (gym-ple)
實現(xiàn)過程
模型選取
根據(jù)所學(xué)知識,有DQN和PG兩個方案,在PARL倉庫給的例子中有雅達利游戲DQN的例子,便以它為基礎(chǔ)修改和改進。模型為4層卷積池化加輸出層。
圖像預(yù)處理
原始圖像是288×512×3的圖像:
使用OpenCv庫將其變?yōu)?0×80的灰度圖像:
最后進行歸一化,所有像素除以255。
調(diào)試與優(yōu)化
最開始把每次動作后環(huán)境返回的1幀圖像作為輸入,跑了一晚上都沒有收斂,猜測是一幀圖像不足以表現(xiàn)當前狀態(tài),比如說測不出速度和加速度。剛開始圖像預(yù)處理沒有歸一化也可能是一個原因。
游戲環(huán)境是輸入一個動作,運行1幀,為了得到多幀圖像,可以將一個動作作用多次,這里用的4次,即一個動作作用4次,得到4幀圖像作為狀態(tài)。
剛開始由于回放經(jīng)驗池設(shè)的較大,跑到中途崩潰了,斷續(xù)跑了總共不到1000個episode,就得到了比較不錯的效果,最長一次測試跑了將近4分鐘。
奇怪的是,后面的測試小鳥都在同一個地方失利:
這里我覺得模型根據(jù)經(jīng)驗做出了正確的動作,但是心有余而力不足,限于“手速”,而飛不上去。于是改小動作作用幀數(shù),改為3之后,仍不能避免這個問題,還出現(xiàn)了一些極限操作:
猜測由于在極限上升上的失利,模型偏向于將狀態(tài)轉(zhuǎn)移到安全的極限下降。
為了進一步減小動作作用幀數(shù),同時不減少狀態(tài)幀數(shù),需要分離這兩個超參數(shù),前者稱為“跳幀”,后者稱為“環(huán)境長度”,跳幀可以沿用之前寫的代碼,狀態(tài)幀數(shù)則使用一個數(shù)組記錄每個episode所有原始狀態(tài),每次取最后”環(huán)境長度“個原始狀態(tài)作為狀態(tài)。
減小跳幀后訓(xùn)練速度和效果都沒有達到之前的水平,這里我想到先用跳幀4訓(xùn)練,然后改為跳幀1微調(diào)。
20000步左右,跳幀4模型給出了一次4分多鐘的測試結(jié)果,最后一個障礙前,小鳥選擇了直接放棄:
模型大概在說:“我能怎么辦?我也很絕望啊。”
跳幀1的微調(diào)仍然非常慢,訓(xùn)練了80000多步,模型可以給出穩(wěn)定30s以上的測試結(jié)果,可惜的是,最后仍不能通過這個極限上升障礙。
總結(jié)與展望
總的來說DQN在圖像輸入的flappy bird環(huán)境下表現(xiàn)非常不錯,在動作間隔和環(huán)境長度設(shè)為4時表現(xiàn)最好。對于最后一個不能越過的極限上升障礙,在增加訓(xùn)練時間和增大探索概率重新訓(xùn)練后仍然不能通過,大概率是游戲環(huán)境問題,查看源碼,得到管道間隔100,最大高度差168,x方向速度為4,有大約25幀時間用來上升,每次點擊加速度為9,小鳥上升速度個位置,但是每次點擊會讓速度變?yōu)?,所以最多只能以速度8勻速上升,用環(huán)境自帶的getGameState()函數(shù)測得,兩個管道內(nèi)間距為85,這段距離大約能上升170個單位,可謂是極限操作,即只有完美操作才有可能通過。
另外,“你已經(jīng)是一個成熟的AI了,要學(xué)會自己確定超參數(shù)了”,讓模型自適應(yīng)步長,輸出跳幀數(shù),可以讓模型不受“手速”限制,同時加快預(yù)測速度,為此需要加上一項速度獎勵,即與通過每個障礙用的操作次數(shù)負相關(guān)的獎勵。
預(yù)留的github地址:https://github.com/bnpzsx/DRL-FlappyBird
總結(jié)
以上是生活随笔為你收集整理的强化学习七日打卡营终极复现之flappy bird的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Application.streamin
- 下一篇: C语言---移盘子----Hanoi(汉