资源 | Facebook开源人工智能框架ParlAI:可轻松训练评估对话模型(2)
2017-05-06 编辑:
Actions 和 Observations
所有的 agent(包括 teacher)都以简单的格式互相对话——observation/action 对象(这是一个 python 字典)。这被用于传递 agent 之间的文本、标签和奖励。这和当在对话(行动)或听(观察)时是同类对象,但是不同视角(在这些字段中有不同的值)。这些领域如下所述:
尽管'text'(文本)领域将几乎可能在全部交流(exchange)中被使用,但是技术上来说,基于你的数据集,这些领域中的每个都是可选的。
对于一个固定的监督式学习数据集(比如 bAbI)来说,一个典型的从数据集进行交流(exchange)例子可以像如下这样(该测试集不包含标签):
Teacher: {
'text': 'Sam went to the kitchennPat gave Sam the milknWhere is the milk?',
'labels': ['kitchen'],
'label_candidates': ['hallway', 'kitchen', 'bathroom'],
'episode_done': False
}
Student: {
'text': 'hallway'
}
Teacher: {
'text': 'Sam went to the hallwaynPat went to the bathroomnWhere is the milk?',
'labels': ['hallway'],
'label_candidates': ['hallway', 'kitchen', 'bathroom'],
'episode_done': True
}
Student: {
'text': 'hallway'
}
Teacher: {
... # starts next episode
}...
代码
代码被设置进了几个主要目录:
core:它包含了框架的首要代码。
agents:包含了可以凭不同任务交互的代理(比如:机器学习模型)。
example:包含了不同循环的一些基本样例(构建词典、训练/评价、显示数据)。
tasks:包含了可来自于 ParlAI 的不同任务的代码。
mturk:包含了设置 Mechanical Turk 的代码和作为样例的 MTurk 任务。
下面我们会更具体地说明每个目录,我们根据依赖项(dependency)来组织行文。
Core 库
core 库包含了如下文件:
agent.py:这个文件包含了一些可被你自己模型延展的基本 agent。
Agent:这是所有 agent 的基本类,实现了 act() 方法,该方法接受一个观察表(table)并且返回一个作为回复的表。
Teacher:它是 Agent 的子代,也实现了针对返回量度(returning metric)的报告方法。任务实现了 Teacher 这个类。
MultiTaskTeacher:它创造了一个基于「任务字符串」的 teacher 集,该集可以传递给 Teacher。在其中它创建了多个 teacher 并且在它们之间交替轮换。
create_task_teacher:它从一段给定的任务字符串中实例化了一个 teacher(比如「babi:task:1」或「squad」)。
build_data.py:用于设置任务数据的基本功能。如果你的文件系统需要不同的功能,你可以覆盖它。
dialog_teacher.py:包含了用于和固定交谈(chat)日志进行对话(dialog)的一个基本 teacher 类,同时它也包含了一个用于储存数据的数据类(data class)。
dict.py:包含了从观察中构建一般 NLP 风格字典的代码。
DictionaryAgent:在一个字典中跟踪索引和词频的 agent,可以将一个句子解析成它字典或 back 中的指数(indice)。
fbdialog_teacher.py:包含了一个 teacher 类,该类实现了一个 setup_data 函数,这个函数用 Facebook 的 Dialog 数据格式来解析数据。
metrics.py:计算对话的评价量度,比如对排名的量度等。
params.py:用 argparse 来为 ParlAI 解释命令行 argument。
thread_utils.py:用于 Hogwild 多线程(多重处理)的工具类/函数。
SharedTable:提供一个锁保护、记忆分享、类字典的用于追踪度量的的界面。
worlds.py:包含了一套用于内部开展任务的基本 world。
World:所有 world 的基本类,实现了 parley,shutdown,__enter__,和__exit__。
DialogPartnerWorld:用于双 agent 回合交流的默认 world。
MultiAgentDialogWorld:用于两到多个 agent 的循环(round-robin)回合 agent 交流。
HogwildWorld:当使用多线程(多重处理)时。这是用于设置一个对每个线程而言分别独立的 world 的默认 world。
Agents 目录
agents 目录包含了已被认可进入 ParlAI 框架用于分享的 agent。目前有这些可用的目录:
drqa:这是一个很周全的 LSTM 模型,它叫「DrQA」(问答博士,论文地址:https://arxiv.org/abs/1704.00051)。它用 PyTorch 框架实现,在 SQuAD 数据集上,它得到的结果相比其它模型更具竞争力。
memnn:它是在 Lua Torch 中用于端到端记忆网络的代码。
remote_agent:连接 ZMQ 的任意 agent 的基本类(memnn_luatorch_cpu 就使用这个)。
ir_baseline:简单的信息检索基准(baseline),它用 TFIDF-权重匹配为候选者的反馈评分。
repeat_label:仅重复(repeating)发送给它的所有数据的基本类(如连接(piping)到一个文件、调试)。
实例
这个目录包含了部分基本循环的具体例子。
base_train.py:一个非常简单的例子,展示了一个使用默认 Agent 亲本类的训练/验证循环的轮廓。
display_data.py:使用 agent.repeat_label 来显示来命令行给出的特定任务的数据。
display_model.py:显示对一个给定模型在命令行给出的特定任务之上的预测。
eval_model.py:使用命名后的 agent 来计算一个命令行给出的特定任务的评价量度(evaluation metric)数据。
build_dict.py:使用 core.dict.DictionaryAgent 建立一个来自命令行给出的特定任务的 dictionary。
memnn_luatorch_cpu:展示了一些在几个数据集上训练端到端记忆网络的例子。
drqa:展示了如何在 SQuAD 训练集上训练一个周全的 LSTM「DrQA」模型(论文地址:https://arxiv.org/abs/1704.00051)。
任务
这个第一版本支持超过 20 种任务,包括 SQuAD、bAbI tasks、MCTest、WikiQA、WebQuestions、SimpleQuestions、WikiMovies、QACNN、QADailyMail、CBT、BookTest、bAbI Dialog tasks、Ubuntu、OpenSubtitles、Cornell Movie 和 VQA-COCO2014 等流行的数据集。
我们的第一版包含以下数据集,见下图左栏;获取它们也非常简单,只需在命令行的选项中指定对应任务的名称即可,如右栏的数据集展示实用程序所示。查阅当前完整任务列表请访问:https://github.com/facebookresearch/ParlAI/blob/master/parlai/tasks/task_list.py