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