看我AK甩槍,舊文重讀《Playing FPS Games with Deep Reinforcement Learning》

其實這篇也不算太久,是17年的AAAI中的論文,但是感覺好久之前有看過,所以就叫久文重讀吧。

此外感覺最近有點喪,蹉跎了幾周,借著組會要講這個,整理一下,發出來和大家交流。

對doom和RL感興趣的同學,可以看我之前貢獻過代碼的Github倉庫:github.com/awjuliani/De,裡面有個A3C-Doom.ipynb,可以先把這個跑以來然後再改一改

核心問題

1. 研究問題:在3D first-person shooter game中訓練agent

2. 假設條件:在遊戲(doom)環境中,可以訪問遊戲中的信息,比如是否有敵人

3. 主要想法:通過射擊reward函數,直接用DRQN來訓練agent

4. 解決方案:擴展DRQN與遊戲中的特徵相結合,通過最大化自己的累積reward來學習到相應的行為,同時利用遊戲中的信息來幫助學習(減小設計reward的難度)

Background:

DQN:

就是簡單的DQN

DRQN:

在很多假設中是full observation,比如Atari,然後DQN利用疊加幾個frame的方法(或者其他的),使的通過輸入s可以infer a very good sequence of actions。

但是在實際中的部分可觀察,上面的做法並不是特別有效,因為觀察到的數據並不能夠enough to infer the full state of the system。比如FPS遊戲,比如DOOM

這類部分可觀察的環境可以考慮採用DRQN(deep recurrent q-networks),相當於在輸入引入 h_t ,通過 h_t 來記錄以前的信息。

演算法部分

game feature augmentation:

起因:只用DRQN在一些比較簡單的scenarios效果還行(比如只有兩個動作:轉動和攻擊),但是如果變複雜,比如需要移動導航,撿東西,設計等等時,效果就不行了。比如只用DRQN在deathmatch: agent會一直射擊(如果可以射擊的話), 希望對手在移動時會被射中. 給予懲罰並沒有效果: 小的懲罰沒有任何效果, 大的懲罰則agent不會再選擇射擊.

為了解決上面的射擊的問題(這是FPS,所以學會射擊是主要目的),一種可能的原因是不知道敵人是否出現了,因為有意義的射擊:1. 對手存在 2. 選擇射擊 3. 射擊到對手。這一系列動作最初的條件就是對手出現了,所以這個假設還是比較有意義的。

對手是否出現,因為這是個遊戲,所以我們可以直接訪問模擬器來這個信息,然後設置一個bool變數來代表這個信息:1就是對手出現了,0就是對手沒有出現。

利用這個信息的一種方法就是設計一個輔助任務,在當前輸入s下判斷是否有對手,label就是模擬器中的bool變數。在DL中就是體現在設計網路結構上:在幾層卷積之後,做一個分支(連接幾層全連接),然後這個分支的目的就是判斷是不是有對手,這樣在訓練時就可以將對手的一些信息體現在卷積中,幫助主任務移動射擊了。

同理,相同的方法可以擴展到其他的信息上,這裡只採用了這個信息。

這裡設計的輔助任務在實際test並沒有要求要知道對手,反而能夠利用輸出來檢測對手是否出現,所以假設還是蠻合理的。另外一種設計的方法就是:設計一個網路來檢測是否出現敵人,然後將這個網路的輸出與主任務的網路做拼接,這樣在test的時候可以利用這個訓練好的網路來預測敵人做拼接,在實驗中效果並沒有第一種結構好。

在DRQN中,訓練的時候,是採用抽取出一些列的$<s_1, a_1, r_1, s_2, a_2, r_2...>$來做訓練的,所以在預測時候,梯度更容易學。但是在DQN中,抽取了$<s_1, a_1, r_1, s_2>$,雖然$s_1$是幾個frame疊在一起,相當於用前面幾個frame預測最後一個frame有沒有敵人。所以DRQN用game feature比DQN更方便,同時效果更好(這個解釋我覺得有點不靠譜)

Divide and conquer:

起因:對於DOOM這類FPS遊戲,遊戲的操作大致就可以分為2類:一類就是在地圖中移動,來尋找補給(然後撿起來)與敵人即navigation phases,另外一類就是遇見敵人之後如何射擊,躲避即action phases。

所以我們可以針對不同任務來學習出不同的網路來做不同的操作,然後在實際使用時候,可以根據是否出現了敵人來選擇使用不同網路(上面設計的網路結構會判斷是否出現敵人,如果這個值超過一個閾值就可以使用交戰的網路),然後這裡說這樣自然會提升更好的表現,(這裡我表示存疑,我覺得是因為設計reward函數的問題,使的在出現敵人時候應該選擇攻擊敵人還是躲開探路之類的,這邊的做法實際上是加了一個無限強的規則進去,通過規則來控制行為,我覺得實際上更好的行為應該讓agent自己學。)

此外分開訓練網路還有一些優點:

1. 網路可以分開訓練,針對不同特點構造不同的情景,並行的訓練可以充分利用資源,更快地訓練不同的網路

2. 2個網路需要控制的action不一樣,比如navigation phases就只需要控制前進,左轉,右轉,通過對action的限制,限制了action的space,使的探索與學習更加有效

3. 同時可以緩解使用單一網路,訓練agent一直呆在這一個角落裡面等對手的情況,讓agent更主動地去探索地圖(實際中,比如我玩cs之類的,就喜歡躲在角落裡,所以我感覺這個問題更多是的策略問題,並沒有優劣)

總結就是:訓練2個網路來做不同任務,如果沒有彈藥或者沒有敵人的時候,使用探索地圖的網路來獲得資源,如果出現敵人而且有彈藥的話,就使用交戰的網路

訓練trick

reward shaping:

起因:原來用來衡量演算法好壞的指標是:擊殺敵人數減掉自己死掉的數目()。如果直接拿這個做reward函數的話,首先就是reward會很稀疏,只有在自己死的時候或殺掉敵人的時候才會有相關reward的變化,大部分時間都沒有reward信號。同時產生reward變化很難,需要探索地圖,發現敵人,射擊殺死敵人獲得正的reward,被殺獲得負的reward,這樣對於探索的方法要求很高,甚至可能都不會有正的reward,使的最終的agent只學會躲避。

所以我們可以自己設計一些reward來讓agent學出我們想要的行為,同時降低學習的難度。在殺死敵人獲得正的reward,被殺獲得負的reward的基礎上,增加下面的reward:

1. 撿起物品有正的reward

2. 損失生命值有負的reward

3. 射擊或者損失彈藥有負的reward(這個reward要考慮和殺死敵人的reward的關係)

在訓練navigation網路時,我們就簡單地設計撿起物品獲得正的reward,踩到熔岩獲得負的reward(會扣血),同時為了鼓勵探索更遠的地方,給予一個與上次位置距離成比例的小的正的reward,這樣agent更容易探索全圖

frame skip:

和DQN的frame skip一樣的技術,就是k個frame才做一個action,這個action進行k個frame。這個k選擇是一個權衡的過程,越大的k學的越快,但是不適合一些精細的操作,比如:瞄準敵人。需要根據具體情況調整,這裡採用k=4(感覺這一節就是在湊字數的)

sequential updates:

這個是更新RNN,LSTM常見的問題,就是我們要在sample出的數據的第幾步才利用信息進行訓練,在較早的時候訓練,$h_t$等變數實際上是沒有太多信息的,所以做出的決策並不一定有效,所以實際上,我們會延遲一定的step再開始訓練。

比如下面,我們從第五個step開始訓練。此外最後一個step並不訓練,因為沒有下一個target。

效果如下(c), 更大的間隔反而傷害了性能,這裡的解釋是說更大的update間隔,本質上是減少了數據的量,因為量少了,sample更容易sample一樣的,這樣就與replay buffer的初衷衝突了,所以性能變差了。

實際訓練

hyperparameters:

優化器: RMSProp algorithm

batch size:32

Network weights were updated:4 steps

replay memory:one million

discount factor:0.99

探索策略 e-greedy:e was linearly decreased from 1 to 0.1 over the first million steps, and then fixed to 0.1

使用16/9 resolution,從440x225 resize to 108x60

使用彩色圖片(灰度化反而效果不好)

scenario:

1. Limited deathmatch on a known map:使用同一張地圖訓練與測試,武器只有火箭桶,有補血與彈藥的補給

2. Full deathmatch on unknown maps:訓練與測試使用不同的地圖,agent開始時候的武器為手槍,地圖上有不同的武器可以替換,同時也有彈藥與補血的補給。作者採用10張地圖去訓練,用3張地圖去測試,同時在訓練中隨機修改地圖中的紋理,來讓agent更泛化。

Limited deathmatch on a known map可以幫助更好的挑選不同超參數,Full deathmatch on unknown maps訓練出的agent更厲害

Evaluation Metrics:

1. Kill to death (K/D) ratio

2. number of kills to determine if the agent is able to explore the map to find enemies

3. the total number of objects gathered

4. the total number of deaths

5. the total number of suicides

結果

在both the tracks Visual Doom AI Competition with the highest K/D Ratio (Chaplot and Lample 2017)中都是第二名

Navigation network enhancement:

在full deathmatch中是有出生點的,同時出生有的手槍比較難殺人,所以比較好的策略是去撿武器與補給,所以有navigation的效果更好。此外有navigation能夠讓agent更主動地去撿補給補血,所以能夠活得更久,分數更高

Comparison to human players:

一句話,比人類好,人類需要更多的時間瞄準(這裡沒有說誰是人類,我感覺人類間的水平差異蠻大的)

Game features:

相比沒有game features的在訓練效果上好很多。有利於卷積能夠提取出對手的信息,幫助訓練

推薦閱讀:

【恢復更新】寫給大家看的機器學習書(第八篇)——線性回歸(下)
cs.CL weekly 2016.09.26-2016.09.30
從高斯分布、機器人誤差、EM演算法到小球檢測
機器學習系列-word2vec篇

TAG:强化学习ReinforcementLearning | 人工智能 | 机器学习 |