0
在文本世界中玩游戏
第一个文本世界( textworld)挑战赛是由微软研究组织的机器学习比赛,比赛于 2019 年 1 月至 7 月进行,目标是建立一个能够玩基于文本的游戏的代理。代理不能是硬编码规则的集合,他们必须从提供的大量集合中学习玩游戏。
我的解决方案在游戏隐藏测试集中以 91.9%(70.8% 的残障)的原始分数赢得了比赛。
解决方案源代码:github 上的 CogniTextWorldAgent
竞赛结果:微软博客。
在文本游戏中,典型的流程是让游戏引擎只返回初始介绍文本,然后根据玩家输入的命令返回反馈文本。在这个文本世界的竞赛中,我们有可能从游戏引擎获得更多的信息,使代理决策更容易。附加信息列表包括游戏中使用的动词列表、命令模板列表、实体列表、食谱或给定游戏状态的可接受命令列表。通过选择获得这些额外的信息,我们的分数(残差)会降低一个百分比。我的第一个方法是忽略分数,使用所有可能的信息,试图建立一个解决更多游戏的代理。我的初始代理使用的是可接受的命令,因此对于每个位置,代理都有一个可能的命令列表,只需要从列表中选择要使用的最佳命令。
例如,在此场景中:
地点: Kitchen =- Ah, the kitchen。这是一种厨房,对这个地方来说说很普通,处于一种美妙的氛围中…
库存:你带的是:一个桔子甜椒,一个生的紫色土豆,…
食谱:食谱 1 收集以下所有配料,按照说明准备这顿美味的饭菜…
可接受的命令:关上门,用烤箱煮桔子甜椒,放下紫薯,往南走,…
我将游戏状态定义为位置、库存和食谱描述。此外,我在清单中添加了元素的数量,因为在某些游戏中,清单中的项目限制为 3 个,代理可能需要在获取新项目之前删除一些清单。在文本中显式地使用数字可以使模型更容易地学习这种关系。
<number of items sin inventory><inventory text><recipe text><location text>
利用博弈状态和可接受命令列表,我训练了一个二进制模型,该模型预测给定命令成为博弈状态的正确命令的概率。在运行所有命令之后,它使用概率对命令进行排序。对于这个模型,我使用了一个预先训练的 bert 模型(12 层无基础模型)和一个用于二分类的头部。模型输入是一对句子,第一句是游戏状态,第二句是命令。这与问答模型的公式相同。
文本世界在训练模式下提供的另一个附加信息是解决游戏的正确命令序列。为了训练模型,我生成了一个数据集,其中包含游戏状态和正确的命令(正样本)、相同的游戏状态以及从允许的命令列表中采样的其他命令(负样本)。我为每个游戏状态采样了最多 8 个错误命令。为了测试和验证,使用了 200 个游戏,其余的用于训练模型。
模型共训练 5 个阶段,学习速率为 2e-5。批处理大小为 14,最大序列长度为 342(选择的参数符合所用 8GB GPU 的内存限制)。模型是使用 pytorch 和 transformers 实现的。
通过这个模型,代理能够得到每个可接受的命令是正确命令的概率。为了决定使用什么命令,我应用了一个类似 ucb1 的公式,基于在给定状态下尝试命令的次数,增加代理探索较少尝试命令的概率。在游戏过程中,增加在每个状态下每个命令执行次数的计数器。
在执行过程中,由于每个游戏都玩了 10 次,我添加了一个简单的规则来捕获使游戏过早结束(当玩家死亡时)的命令,并且在下一次运行游戏时,此命令将对模型分数有很大的惩罚,因此代理永远不会重复它。
当代理从位置 A 向北到达位置 B 时,在 B 位置将有一个南出口。当A 到达新位置时,该模型很好地预测在该位置上是否有一些动作,或者它是否应该继续导航。
UCB1 调整的模型概率和两个简单的规则是代理解决游戏验证集所需要的全部内容。
接下来,我让代理搜索菜单,并阅读菜单中的食谱,而不是在附加信息中使用菜单(以减少分数上的障碍)。为此,我不得不重新编写解决游戏问题的命令序列,首先导航到菜单并阅读食谱,然后执行操作。这产生了一个不同的数据集,用于训练新版本的模型。在游戏状态下,当代理不知道食谱时,该部分文本设置为「缺少食谱」。这就足以让模型学会不同的行为,当食谱丢失时,模型会预测更高的导航概率,直到找到食谱,在这之后,它才会预测食物的元素。
在一个较低级别中,我们有一个完整的列表,上面有所有游戏可能的命令模板。命令模板显示了要由实体填充的动词、介词等,下面的列表显示了一些示例。总共有 31 个模板。
drop {o} go west cook {f } with {stove} chop {f } with {o}
命令模板中的插槽表示可以在命令中使用的实体组。通过分析游戏引擎提供的可接受命令,可以推断出这些组的含义,例如 {d} 是打开或关闭的门或容器,{f} 是食物, {o} 是可以获取的对象。基于这一分析,游戏实体被分为 5 类:门、容器(冰箱、工具箱等)、结构体(桌子、工作台等)、食物(香蕉、欧芹等)、活动物(刀、食谱等)和基点(南、西等)。使用这些标签构建了一个数据集,用于命名实体识别(ner)。游戏位置和库存描述用已知游戏实体的列表进行注释,以构建 ner 数据集。使用相同的文本增强了数据集,但是使用了游戏中不存在的其他实体,以改进模型泛化(例如金属门、剪刀、南瓜)。
针对命名实体识别任务,训练了具有 token 分类头的 bert 模型。利用 bert 12 层无基础模型对 ner 模型进行了 3 个时期的训练。
在代理的最终版本中使用的命令是通过在命令模板中填充,由 ner 模型为位置和库存文本标识的实体来生成的。命令模板被简化为只考虑一个插槽(第一个),当然,相应实体的烤箱、烤面包机和烤炉不在此范围内。可能的命令列表对应于命令模板与具有适合模板槽类型的实体的组合。
使用通过使用命令模板生成的命令重新训练决策模型。
总之,代理使用的逻辑是从游戏引擎中读取位置描述和库存(这相当于从「look」和「inventory」命令中获得的反馈),然后构建游戏状态,使用 ner 模型预测实体,使用游戏引擎中的命令模板,从实体和命令模板生成可能的命令列表,使用决策模型对命令列表进行排序,应用 UCB1 公式并以最高的概率执行命令。
使用所描述的模型和算法的代理能够解决验证集中的游戏(最大可能有 95%)。
文本游戏很有趣,这使得文本世界成为自然语言研究的一个伟大工具。
via:
雷锋网雷锋网雷锋网
雷峰网版权文章,未经授权禁止转载。详情见转载须知。