ParlAI基本使用【文档翻译】

Intro to ParlAI

What is ParlAI?

ParlAI 是一个基于 python 的平台,用于启用对话 AI 研究。

其目标是为研究人员提供:

  • 用于共享、训练和测试对话模型的统一框架

  • 许多流行的数据集都在一个地方可用,并且能够对它们进行多任务处理

  • 无缝集成 Amazon Mechanical Turk,用于数据收集和人工评估

  • 与 Facebook Messenger 等聊天服务集成,在聊天界面中将代理与人类联系起来

Core Concepts

我们将介绍我们在 ParlAI 框架中使用的一些术语。在 ParlAI 中,我们将环境称为world。在每个world中,都有agents。agents的示例包括模型和数据集。agents之间通过彼此轮流的 acting and observing acts 进行交流。【acting ,observing 属于agent的两个acts】

为了实现这一点,我们将在我们的 Quick Start 中考虑用于在 Twitter 数据集上训练 Transformer ranker 的训练循环。我们称这个train environment 为一个world,它包含两个agents——Transformer model和 dataset。model 和dataset agents 以这种方式相互交互: dataset首先行动并输出一批具有正确标签的训练示例。model 观察此行为以获取训练示例,然后通过对该批次执行单个训练步骤(预测label 并根据loss 更新其参数)来进行操作。dataset 观察这一行为并输出下一批,依此类推。

这只是一个简单概述。下面让我们更详细地了解这些概念以及如何使用它们。

Agents

ParlAI 中最基本的概念是agent。agents可以是人类,可以是一个简单的机器人,它会重复它所听到的任何内容,比如你完美调整的神经网络,正在读取的数据集,或者任何其他可能发送消息或与其环境交互的东西。

agent有两个需要定义的主要方法:

def observe(self, observation): # update internal state with observation
def act(self): # produce action based on internal state

observe() 将观察字典作为输入,该字典通常是另一个代理采取的行动的结果,并相应地更新该代理的内部状态。

act() 从agent产生一个动作。对于dataset agent,这可能会增加所见example的计数器并返回下一批示例。对于neural net agent,这可能是训练步骤或评估步骤。

Messages

消息是我们所说的对象,既由agent 观察(observations),又由agent 的act 函数(actions)返回。这些observations 和actions 是 ParlAI 中的agents在其环境中相互通信的主要方式。 Message 对象是 python dict 的子类,其关键功能是防止用户无意中编辑 action or observation 中的字段。

messages 文档更详细地介绍了每个字段,但下表显示了基础知识。

image-20220801150019723

所有这些字段在技术上都是可选的(optional),每个任务都应该根据该任务中可用的信息类型来使用它们(例如,并非所有task 都包含明确的奖励,或者一组可供选择的候选标签)。

在某些情况下可以使用特定于数据集的字段(Dataset-specific fields),以支持复制论文结果。例如,SQuAD 有一个 answer_starts 字段,在“squad:index”任务中可用。要显示消息的所有字段,只需将 --verbose True 添加到您的命令中。

在验证和测试期间,label字段被重命名为 eval_labels——这样,模型不会意外地在标签上进行训练,但它们仍然可用于计算模型端损失。

模型可以通过以下方式检查他们是否正在对监督任务进行训练:

is_training = 'labels' in observation
Teachers

Teachers 是特殊类型的agent 。他们像所有agents一样执行 actobserve功能,但他们还跟踪通过report功能返回的 metrics ,例如他们提出的问题数量或这些问题被正确回答的次数。

Datasets 和tasks 通常实现Teacher 的一个子类,提供函数,如果需要,从其源下载数据集,将文件读取为正确的格式,并在每次调用教师的act函数时返回一个示例。

student(model)agent 和 bAbI task teacher之间交换的观察结果可能如下所示:

Teacher: {
   
    'text': 'Sam went to the kitchen\nPat gave Sam the milk\nWhere is the milk?',
    'labels': ['kitchen'],
    'label_candidates': ['hallway', 'kitchen', 'bathroom'],
    'episode_done': False  # indicates next example will be related to this one
}
Student: {
   
    'text': 'hallway'
}
Teacher: {
   
    'text': 'Sam went to the hallway\nPat went to the bathroom\nWhere is the milk?',
    'labels': ['hallway'],
    'label_candidates': ['hallway', 'kitchen', 'bathroom'],
    'episode_done': True
}
Student: {
   
    'text': 'hallway'
}
Teacher: {
   
    ... # starts next episode
}
...
Worlds

Worlds定义了agent 相互交互的环境。Worlds 必须实现一个parley (谈判)方法。每次对 parley 的调用都会进行一轮交互,通常每个代理包含一个action。

ParlAI 中包含的一个简单world ,我们当前包含的所有任务都使用它,是 DialogPartnerWorld。 DialogPartnerWorld 由one task teacher agent 和one student agent 初始化。每次调用 parley 时,代理之间都会进行一次交换,方式如下:

query = teacher.act()
student.observe(query)
reply = student.act()
teacher.observe(reply)

我们包含的另一个简单世界是 MultiAgentDialogWorld,它与此类似,但将其概括为以循环方式在任意数量的代理之间循环。

Using ParlAI

**Concepts in Action: Simple Display Data Script: **

现在我们了解了基础知识,让我们设置一个简单的脚本来显示任何指定的任务。此实用程序的完整版本包含在 parlai/scripts/display_data.py 中,但我们将从头开始演示我们刚刚介绍的概念。

我们将创建一个新的agent类并实现observe()act() 函数,以便在有task teacher 的世界中,它会观察task teacher 输出的数据,将数据保存为最后一次observation ,然后通过在observation 中打印label 来进行act 。

首先,进行一些引入包:

from parlai.core.agents import Agent
from parlai.core.params import ParlaiParser
from parlai.core.worlds import create_task

Agent 类将是我们自己的agent 的父类。 ParlaiParser 提供了一组默认的命令行参数和解析,create_task 将为我们选择的 ParlAI 中的 任何可行的任务, 自动设置适当的word 和teacher 。

我们定义我们的Agent (我们将其命名为 RepeatLabelAgent):

class RepeatLabelAgent(Agent):
    # initialize by setting id
    def __init__(self, opt):
        self.id = 'RepeatLabel'
    # store observation for later, return it unmodified
    def observe(self, observation):
        self.observation = observation
        return observation
    # return label from before if available
    def act(self):
        reply = {
   'id': self.id}
        if 'labels' in self.observation:
            reply['text'] = ', '.join(self.observation['labels'])
        else:
            reply['text'] = "I don't know."
        return reply

现在我们有了我们的agent,我们将设置显示循环( display loop )。

parser = ParlaiParser()
opt = parser.parse_args()

agent = RepeatLabelAgent(opt)
world = create_task(opt, agent)

for _ in range(10):
    world.parley()
    print(world.display())
    if world.epoch_done():
        print('EPOCH DONE')
        break

就是这样! world.display() 循环遍历world 的每个agent 并显示它们的最后一个action 。但是,如果你想直接访问数据而不调用 world.display(),你可以直接访问 world.acts:

parser = ParlaiParser()
opt = parser.parse_args()

agent = RepeatLabelAgent(opt)
world = create_task(opt, agent)

for _ in range(10):
    world.parley()
    for a in world.acts:
        # print the actions from each agent
        print(a)
          if world.epoch_done():
              print('EPOCH DONE')
              break
Validation and Testing

在验证和测试期间,“label” 字段从observation 字典中删除。这告诉agent 不要使用这些标签进行训练——但是,label 仍然可以通过“eval_labels”字段获得,以防您需要model-side metrics ,例如perplexity (困惑度)。

在这些情况下,我们的 RepeatLabel agent不再有什么可说的。对于提供一组可供选择的候选者的数据集(观察字典中的“label_candidates”),我们可以通过回复其中一个来让我们的agent 有机会获得正确的答案。

让我们修改agent 的 act 函数以在label 不可用时选择随机 label candidate :

import random

def act(self):
    reply = {
   'id': self.id}
    if 'labels' in self.observation:
        reply['text'] = ', '.join(self.observation['labels'])
    elif 'label_candidates' in self.observation:
        cands = self.observation['label_candidates']
        reply['text'] = random.choice(list(cands))
    else:
        reply['text'] = "I don't know."
    return reply
Tasks

如果您在命令行上运行它,您可以通过以下格式设置“-t {task}”来指定要显示的任务:

  • ‘-t babi’ 在 ‘parlai/core/tasks/babi/agents.py’ 中设置 DefaultTeacher

  • ‘-t babi:task1k’ 在 babi/agents.py 文件中设置 Task1kTeacher,它允许您为某些任务指定特定设置。对于 bAbI,这是指每个任务只有 1000 个唯一训练示例的设置。

  • ‘-t babi:task1k:1’ 将 1 作为参数提供给 Task1kTeacher,Task1kTeacher 将其解释为“我想要任务 1”(与其他 19 个 bAbI 任务相反)。

  • ‘-t babi,squad’ 为 babi 和squad 设置 DefaultTeacher。任何数量的任务都可以用逗号链接在一起以加载每个任务。

  • “-t #qa”指定“qa”类别,在“parlai/core/task_list.py”文件中加载该类别的所有任务

这些flags 在 ParlAI 中使用。以下是使用它们通过现有脚本 display_data 显示数据的一些示例

#Display 10 random examples from task 1 of the "1k training examples" bAbI task:
$ parlai display_data --task babi:task1k:1

#Displays 100 random examples from multi-tasking on the bAbI task and the SQuAD dataset at the same time:
$ parlai display_data --task babi:task1k:1,squad -n 100

在上一节中,我们提到label 在验证和测试时是隐藏的。 –datatype (-dt) 标志指定train、valid 或test 。这些模式可以从命令行使用“-dt valid”/“-dt test”进行设置。如果您想以与测试数据相同的方式查看训练数据(隐藏标签),您还可以设置“-dt train:evalmode”。

ParlAI 会自动下载请求任务所需的数据(使用任务中的 build.py 代码)并将其放入您的 –datapath。默认情况下这是 ParlAI/data,但您可以将其配置为指向其他地方,例如到另一个具有更多内存的磁盘。仅下载您请求的任务。此外,您可以指定 -dt train:stream 或 –datatype valid:stream 来表示您希望数据尽可能在线流式传输,而不是加载到内存中。

您还可以指定 –datatype train:ordered 覆盖训练集中的数据以随机顺序出现的默认行为(而有效和测试数据是默认排序的)。

我们在此处的代码code here或此处的文档documentation here中维护了完整的任务列表。 ParlAI 中的任务集从贡献者那里不断增长。请参阅本教程 this tutorial以制作您自己的任务。

Training and Evaluating Existing Agents

现在,我们将看看我们为训练和评估提供的脚本: train_model and eval_model。这里有些例子:

# Train a seq2seq model on the "10k training examples" bAbI task 1 with batch size of 32 examples until accuracy reaches 95% on validation (requires pytorch):
$ parlai train_model --task babi:task10k:1 --model seq2seq --model-file /tmp/model_s2s --batchsize 32 --validation-every-n-secs 30

# Trains an attentive LSTM model on the SQuAD dataset with a batch size of 32 examples (pytorch and regex):
$ parlai train_model --model drqa --task squad --batchsize 32 --model-file /tmp/model_drqa

# Tests an existing generative transformer from our model zoo
$ parlai eval_model --task convai2 --model-file "zoo:tutorial_transformer_generator/model"

# Evaluate on the bAbI test set with a human agent (using the local keyboard as input):
$ parlai eval_model --model local_human --task babi:Task1k:1 --datatype valid

# Evaluate an IR baseline model on the validation set of ConvAI2:
$ parlai eval_model --model ir_baseline --task convai" --datatype valid

# Display the predictions of that same IR baseline model:
$ parlai display_model --model ir_baseline --task convai2 --datatype valid

主要flags是:

  1. –model (-model) 设置将被训练的agent 类型。 parlAI 中可用的agents在这里here。请参阅本教程this tutorial 以制作您自己的代理。
  • –model-file (-mf) 指向保存模型的文件名。

  • –task (-t) 如前所述。

Interacting with Models

也可以与您的模型交谈!以下是与model zoo中已有model 交谈的示例:

Model Zoo

ParlAI 现在维护了一个模型库,其中包含已接受过任务训练的代理的现有模型文件。有关详细信息,请参阅专用文档部分或此处here for details

ParlAI 模型Zoo 中的agents 和model 伴随贡献者不断增长。

Task and Datasets in ParlAI

ParlAI 可以支持用于监督学习的固定对话数据(我们称为dataset ),甚至可以支持涉及环境、agent和可能的award的动态任务(我们将一般情况称为task)。

在本教程中,我们将介绍创建新task(或dataset)的不同方式。

所有设置都以几乎相同的方式处理,使用相同的 API,制作基本数据集的步骤当然更少。

要快速添加new dataset,请转到下面的快速

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值