推动更好的NLP发展的新框架

推动更好的NLP发展的新框架

自然语言处理(NLP)正在成为现代深度学习生态系统中最普遍的应用。从流行的深度学习框架的支持到云运行时的API,如Google Cloud,Azure,AWS或Bluemix,NLP是深度学习平台的无处不在的组件。尽管取得了令人难以置信的进步,但是大规模构建NLP应用仍然具有难以置信的挑战,经常在研究/实验的可能性与模型服务/部署的现实之间出现强烈的摩擦。作为市场上最大的会话环境之一,Facebook多年来一直面临着大规模构建NLP应用程序的挑战。最近,Facebook工程团队开源了PyText的第一个版本,一个基于PyTorch的框架,用于构建更快,更高效的NLP解决方案。

PyText的最终目标是为NLP工作流的端到端实现提供更简单的体验。为此,PyText需要解决NLP工作流程中的一些现有摩擦点。从这些摩擦点来看,最麻烦的是NLP应用程序生命周期的实验和模型服务阶段之间存在的不匹配。

解决NLP实验与生产之间的权衡问题

现代NLP解决方案的实施通常包括非常繁重的实验阶段,其中数据科学家快速测试新的想法和模型,其中许多是从研究文献中提取的,以达到一定的性能水平。在实验过程中,数据科学家倾向于支持框架,这些框架提供易于使用,热切执行的界面,有助于快速编写高级和动态模型。像PyTorch或TensorFlow Eager这样的框架就是这一类的很好的例子。当部署时间到来时,动态图模型的局限性成为挑战,深度学习技术人员倾向于使用静态计算图的框架,并针对大规模操作进行了优化。TensorFlow,Caffe2或MxNet是这种类型堆栈的众所周知的成员。

推动更好的NLP发展的新框架

PyTorch是最早的深度学习框架之一,它解决了快速实验和大规模服务模型之间经常相互冲突的差距。PyText构建在PyTorch基础之上,以优化NLP空间的一些原则。

理解PyText

从概念的角度来看,PyText旨在实现四个基本目标:

1.尽可能简单快速地尝试新的建模思路。

2.使用最少的额外工作,轻松地在新数据上使用预建模型。

3.为研究人员和工程师定义清晰的工作流程,以最小的代价建立,评估和输出他们的模型到生产。

4.在预测中确保部署模型的高性能(低延迟和高吞吐量)。

PyText在建模框架上的功能可以帮助研究人员和工程师构建用于训练或预测的端到端方案。PyText的实现涵盖了NLP工作流生命周期的基本阶段,为快速实验,原始数据处理,度量报告,训练模型的服务提供接口。PyText体系结构的高级视图清楚地揭示了这些阶段是如何被框架的本机组件明确封装的。

推动更好的NLP发展的新框架

如上图所示,PyText的体系结构包括以下构建块:

· 任务:将训练或预测任务所需的各种组件组合到系统中。

· 数据处理程序:处理原始输入数据并准备批量以提供给模型。

· 模型:定义神经网络架构。

· 优化器:使用模型正向传递的损失封装模型参数优化。

· 规则报告:实现模型的相关度量计算和报告。

· 训练者:使用数据处理程序,模型,损失和优化程序来训练模型并通过针对保持集进行验证来执行模型选择。

· 预测:在给定测试数据集的情况下,使用数据处理程序和模型进行推理。

· 输出:使用ONNX8将训练好的PyTorch模型导出到Caffe2图形。

正如您所看到的,PyText利用开放式神经网络交换格式(ONNX)将模型从实验的PyTorch转换为生产稳健的Caffe2运行时。

PyText包含大量NLP任务,如文本分类,文字标记,语义分析和语言建模,可简化NLP工作流程的实施。类似地,PyText通过使用上下文模型(例如用于意图标记任务的SeqNN模型)和用于多个任务的联合训练的上下文意图接口模型来进行语言理解领域。

从NLP工作流的角度来看,PyText简化了将想法从实验过渡到生产的过程。PyText应用程序的典型工作流程包括以下步骤:

推动更好的NLP发展的新框架

1.在PyText中实现模型,并确保测试集上的离线度量标准看起来很好。

2.将模型发布到捆绑的基于PyTorch的预测服务,并对实时流量样本进行实时小规模评估。

3.将其自动导出到Caffe2网络。在某些情况下,例如在使用复杂的控制流逻辑和自定义数据结构时,PyTorch 1.0可能尚未支持此功能。

4.如果不支持3中的过程,请使用Py-Torch C ++ API9重写模型(仅限torch.nn.Module10子类)并将其包装在Caffe2运算符中。

5.将模型发布到生产级Caffe2预测服务并开始提供实时流量

使用PyText

PyText入门相对简单。该框架可以作为典型的python包安装。

$ pip install pytext-nlp

之后,我们可以使用任务配置训练NLP模型。

(pytext) $ cat demo/configs/docnn.json
{
 "task": {
 "DocClassificationTask": {
 "data_handler": {
 "train_path": "tests/data/train_data_tiny.tsv",
 "eval_path": "tests/data/test_data_tiny.tsv",
 "test_path": "tests/data/test_data_tiny.tsv"
 }
 }
 }
}
$ pytext train < demo/configs/docnn.json

Task是用于在PyText应用程序中定义模型工件的中心工件。每个任务都有一个嵌入式配置,用于定义不同组件之间的关系,如以下代码所示。

from word_tagging import ModelInputConfig, TargetConfig
class WordTaggingTask(Task):
 class Config(Task.Config):
 features: ModelInputConfig = ModelInputConfig()
 targets: TargetConfig = TargetConfig()
 data_handler: WordTaggingDataHandler.Config = WordTaggingDataHandler.Config()
 model: WordTaggingModel.Config = WordTaggingModel.Config()
 trainer: Trainer.Config = Trainer.Config()
 optimizer: OptimizerParams = OptimizerParams()
 scheduler: Optional[SchedulerParams] = SchedulerParams()
 metric_reporter: WordTaggingMetricReporter.Config = WordTaggingMetricReporter.Config()
 exporter: Optional[TextModelExporter.Config] = TextModelExporter.Config()

在训练模型后,我们可以评估模型并导出到Caffe2。

(pytext) $ pytext test < "$CONFIG"
(pytext) $ pytext export --output-path exported_model.c2 < "$CONFIG"

重要的是要注意PyText提供了一个非常可扩展的架构,并且每个关键构建块都可以自定义和扩展。

PyText代表了NLP开发中的一个重要里程碑,它是解决实验和生产之间经常相互冲突的权衡的第一个框架之一。在Facebook和PyTorch社区的支持下,PyText可能有机会成为深度学习生态系统中最重要的NLP堆栈之一。

相关推荐