0
在文本世界中玩游戲
第一個文本世界( textworld)挑戰(zhàn)賽是由微軟研究組織的機器學習比賽,比賽于 2019 年 1 月至 7 月進行,目標是建立一個能夠玩基于文本的游戲的代理。代理不能是硬編碼規(guī)則的集合,他們必須從提供的大量集合中學習玩游戲。
我的解決方案在游戲隱藏測試集中以 91.9%(70.8% 的殘障)的原始分數(shù)贏得了比賽。
解決方案源代碼:github 上的 CogniTextWorldAgent
競賽結果:微軟博客。
在文本游戲中,典型的流程是讓游戲引擎只返回初始介紹文本,然后根據(jù)玩家輸入的命令返回反饋文本。在這個文本世界的競賽中,我們有可能從游戲引擎獲得更多的信息,使代理決策更容易。附加信息列表包括游戲中使用的動詞列表、命令模板列表、實體列表、食譜或給定游戲狀態(tài)的可接受命令列表。通過選擇獲得這些額外的信息,我們的分數(shù)(殘差)會降低一個百分比。我的第一個方法是忽略分數(shù),使用所有可能的信息,試圖建立一個解決更多游戲的代理。我的初始代理使用的是可接受的命令,因此對于每個位置,代理都有一個可能的命令列表,只需要從列表中選擇要使用的最佳命令。
例如,在此場景中:
地點: Kitchen =- Ah, the kitchen。這是一種廚房,對這個地方來說說很普通,處于一種美妙的氛圍中…
庫存:你帶的是:一個桔子甜椒,一個生的紫色土豆,…
食譜:食譜 1 收集以下所有配料,按照說明準備這頓美味的飯菜…
可接受的命令:關上門,用烤箱煮桔子甜椒,放下紫薯,往南走,…
我將游戲狀態(tài)定義為位置、庫存和食譜描述。此外,我在清單中添加了元素的數(shù)量,因為在某些游戲中,清單中的項目限制為 3 個,代理可能需要在獲取新項目之前刪除一些清單。在文本中顯式地使用數(shù)字可以使模型更容易地學習這種關系。
<number of items sin inventory><inventory text><recipe text><location text>
利用博弈狀態(tài)和可接受命令列表,我訓練了一個二進制模型,該模型預測給定命令成為博弈狀態(tài)的正確命令的概率。在運行所有命令之后,它使用概率對命令進行排序。對于這個模型,我使用了一個預先訓練的 bert 模型(12 層無基礎模型)和一個用于二分類的頭部。模型輸入是一對句子,第一句是游戲狀態(tài),第二句是命令。這與問答模型的公式相同。
文本世界在訓練模式下提供的另一個附加信息是解決游戲的正確命令序列。為了訓練模型,我生成了一個數(shù)據(jù)集,其中包含游戲狀態(tài)和正確的命令(正樣本)、相同的游戲狀態(tài)以及從允許的命令列表中采樣的其他命令(負樣本)。我為每個游戲狀態(tài)采樣了最多 8 個錯誤命令。為了測試和驗證,使用了 200 個游戲,其余的用于訓練模型。
模型共訓練 5 個階段,學習速率為 2e-5。批處理大小為 14,最大序列長度為 342(選擇的參數(shù)符合所用 8GB GPU 的內(nèi)存限制)。模型是使用 pytorch 和 transformers 實現(xiàn)的。
通過這個模型,代理能夠得到每個可接受的命令是正確命令的概率。為了決定使用什么命令,我應用了一個類似 ucb1 的公式,基于在給定狀態(tài)下嘗試命令的次數(shù),增加代理探索較少嘗試命令的概率。在游戲過程中,增加在每個狀態(tài)下每個命令執(zhí)行次數(shù)的計數(shù)器。
在執(zhí)行過程中,由于每個游戲都玩了 10 次,我添加了一個簡單的規(guī)則來捕獲使游戲過早結束(當玩家死亡時)的命令,并且在下一次運行游戲時,此命令將對模型分數(shù)有很大的懲罰,因此代理永遠不會重復它。
當代理從位置 A 向北到達位置 B 時,在 B 位置將有一個南出口。當A 到達新位置時,該模型很好地預測在該位置上是否有一些動作,或者它是否應該繼續(xù)導航。
UCB1 調(diào)整的模型概率和兩個簡單的規(guī)則是代理解決游戲驗證集所需要的全部內(nèi)容。
接下來,我讓代理搜索菜單,并閱讀菜單中的食譜,而不是在附加信息中使用菜單(以減少分數(shù)上的障礙)。為此,我不得不重新編寫解決游戲問題的命令序列,首先導航到菜單并閱讀食譜,然后執(zhí)行操作。這產(chǎn)生了一個不同的數(shù)據(jù)集,用于訓練新版本的模型。在游戲狀態(tài)下,當代理不知道食譜時,該部分文本設置為「缺少食譜」。這就足以讓模型學會不同的行為,當食譜丟失時,模型會預測更高的導航概率,直到找到食譜,在這之后,它才會預測食物的元素。
在一個較低級別中,我們有一個完整的列表,上面有所有游戲可能的命令模板。命令模板顯示了要由實體填充的動詞、介詞等,下面的列表顯示了一些示例??偣灿?31 個模板。
drop {o} go west cook {f } with {stove} chop {f } with {o}
命令模板中的插槽表示可以在命令中使用的實體組。通過分析游戲引擎提供的可接受命令,可以推斷出這些組的含義,例如 hp9dxjh 是打開或關閉的門或容器,{f} 是食物, {o} 是可以獲取的對象。基于這一分析,游戲?qū)嶓w被分為 5 類:門、容器(冰箱、工具箱等)、結構體(桌子、工作臺等)、食物(香蕉、歐芹等)、活動物(刀、食譜等)和基點(南、西等)。使用這些標簽構建了一個數(shù)據(jù)集,用于命名實體識別(ner)。游戲位置和庫存描述用已知游戲?qū)嶓w的列表進行注釋,以構建 ner 數(shù)據(jù)集。使用相同的文本增強了數(shù)據(jù)集,但是使用了游戲中不存在的其他實體,以改進模型泛化(例如金屬門、剪刀、南瓜)。
針對命名實體識別任務,訓練了具有 token 分類頭的 bert 模型。利用 bert 12 層無基礎模型對 ner 模型進行了 3 個時期的訓練。
在代理的最終版本中使用的命令是通過在命令模板中填充,由 ner 模型為位置和庫存文本標識的實體來生成的。命令模板被簡化為只考慮一個插槽(第一個),當然,相應實體的烤箱、烤面包機和烤爐不在此范圍內(nèi)??赡艿拿盍斜韺诿钅0迮c具有適合模板槽類型的實體的組合。
使用通過使用命令模板生成的命令重新訓練決策模型。
總之,代理使用的邏輯是從游戲引擎中讀取位置描述和庫存(這相當于從「look」和「inventory」命令中獲得的反饋),然后構建游戲狀態(tài),使用 ner 模型預測實體,使用游戲引擎中的命令模板,從實體和命令模板生成可能的命令列表,使用決策模型對命令列表進行排序,應用 UCB1 公式并以最高的概率執(zhí)行命令。
使用所描述的模型和算法的代理能夠解決驗證集中的游戲(最大可能有 95%)。
文本游戲很有趣,這使得文本世界成為自然語言研究的一個偉大工具。
via:
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)版權文章,未經(jīng)授權禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。