0

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