您的位置:首页 > 其它

使用Spark MLlib来训练并服务于自然语言处理模型

2016-03-31 18:45 447 查看

使用Spark
MLlib来训练并服务于自然语言处理模型

229 次阅读 - 文章,编程语言

本文为数盟原创译文,转载时请务必注明出处为“数盟社区”,并将原文链接置于文首。

作者:Michelle Casbon  原文链接

在非结构化数据的海洋中识别出关键信息,或实时人机交互的自定义,是客户如何利用我们的技术的一组例子,我们的公司Idibon——一个专注于自然语言处理(NLP)的旧金山创业公司。在Spark ML和MLlib中的机器学习库使得我们能够创建一个分析任何语言中的文字的机器智能环境,其规模远远超过了Twitter firehose中每秒的字数。

我们的工程师团队已经建立了一个平台,能够培训和提供数千款NLP模型,在分布式环境中发挥着重要作用。这使我们能够快速扩展并为许多客户提供同时每秒数千次的预测。在这篇文章中,我们将探讨的的我们正在努力解决的问题类型、我们遵循的程序以及我们使用的技术堆栈。这应该对任何希望打造出或改善自己的NLP流水线的人很有帮助。

用Spark构造预测模型

我们的客户是需要自动分类文件或从文件中提取信息的公司。这可以通过多种多样的形式来实现,包括社交媒体分析,信息分类和客户通讯、新闻监测、风险评估和数据录入过程自动化,效率低下。所有这些任务都有一个共同点:预测模型的构建,训练从原始文本中提取的特征。创造NLP模型的这个过程是一个使用Spark提供的工具的独特的、富有挑战性的案例。



机器学习产品的构建过程

一种机器学习产品可以被分解成三个概念部分:预测本身,提供预测的模型,以及用于训练模型的数据集



预测

在我们的经验中,预测最好是从商业问题开始,并用它们来驱动数据集的选择,而不是用数据集本身驱动项目目标。如果你开始使用一个数据集,重要的是要尽快将数据与关键业务需求进行连接。有了正确的问题,它就会更易于选择有用的分类,这关联到最终提供的预测。

数据集

一旦被定义,最有用的数据集会变得相当明晰。重要的是要验证您所访问的数据可以支持您试图回答的问题。

模型训练

当任务已经建立、数据已被使用,我们现在来考虑模型的问题。为了产生精确的模型,我们需要训练数据,这些数据通常是由人产生的。这些人可能是一个公司或咨询公司的专家,或在许多情况下,他们可能是网络分析师。

此外,许多任务可以做到高效率和低成本利用众包平台CrowdFlower。我们喜欢他们的平台,因为它将基于特定专业领域的工作者,这对英语以外的其他语言的工作特别有用。

所有这些类型的工作者提交的数据集的特定部分的注释,以产生训练数据。训练数据是对数据集的新的或其余部分的预测使用的。基于这些预测,你可以对一组数据发送到代码作出决定。这里的关键是要用最少的人的判断做出最好的模型。你持续进行迭代模型训练、评价和诠释之间,在每一次迭代中得到较高的精度。我们把这个过程称为适应学习,这是一个能够产生高度准确预测的快速、具有成本效益的方法。

操作化

支持自适应学习的过程中,我们建立了一个平台,使其尽可能的自动化。没有我们的干预的组件,自动规模是关键,以支持实时的接口与波动的客户端请求。我们已经解决了一些更严格的可扩展性的挑战,包括:

文件存储

每秒钟为上千人提供预测

支持持续的培训,这涉及到当训练数据集或模型参数发生变化时自动生成更新的模型

超参数优化产生最高效的模型

我们通过在AWS堆栈使用部件的组合,如 Elastic Load Balancing, Autoscaling Groups, RDS, 和 ElastiCache。也有一些指标,我们通过New Relic 和Datadog来监测,以防止我们发生可怕的错误。

下面是我们的基础设施的主要工具的高级图表。



Spark扮演的角色

我们的机器学习能力的核心是使用Spark ML和MLlib优化功能。充分使用这些是为了NLP,包括我们称之为IdiML的持久层的加入。这使我们能够利用Spark进行个体预测,而不是其最常见的用于一次性处理大量数据的平台用法。

我们使用Spark是为了什么?

在更详细的层面上,NLP流水线有三个主要组成部分:

特征提取,文本被转换成一种数字格式,以适用于统计模型。

培训,用于为每个特征向量的分类的基础上产生模型。

预测,用于训练的模型被用来产生一个新的、不可见的文本分类。

每个组件的一个简单的例子如下所述:



特征提取

在特征提取阶段,基于文本的数据转化为一个特征向量的数值数据。此向量表示的文本的独特的特性,可以生成任何序列的数学变换。我们的系统是建立在容易适应其他功能类型,如来自深度学习的功能,但为了简单起见,我们会考虑一个基本的特征流水线实例:

输入:一个单一的文档,包括内容和元数据。

内容提取:将我们感兴趣的输入部分分离,这通常是内容本身。

标记:将文本转换为单个的词。在英语中,符号是单词以及周围空格或标点的字符串,但在其他语言如中文或日语中,你可能需要确定如何识别一个“词”。

Ngrams:产生组长度为n的字序列。双字母组和三元模型经常使用。

特征查找:将一个任意的数值索引值分配给每个唯一的特征,从而生成一个整数向量。此特征索引是在预测中使用的。

输出:Spark MLlib的Vector数据类型形式的数值特征向量(
org.apache.spark.mllib.linalg.Vector
).



训练

在训练阶段,一个分类被附加到特征向量。在Spark里用
LabeledPoint
数据类型表示。二元分类中,分类是真或假(1或0)。

输入:数字特征
Vectors


一个LabeledPoint创建,组成特征向量及其分类。这种分类是由项目生命周期中所产生的。

代表培训全套资料LabeledPoint集送到MLlib的
LogisticRegressionWithLBFGS
功能,在适合模型的基础上给出了特征向量及相关分类。

输出:一个 LogisticRegressionModel 。



预测

在预测时,在训练过程中所产生的模型被用来提供一个新的文本分类。一个0-1的置信区间表示预测模型的可信度。可信度越高,模型越确定。以下内容包含了预测过程:

输入:在同一领域看不见的文件,用于训练的数据。相同的特征流水线应用于看不见的文本。在训练过程中所产生的特征指数作为一项查询。这将使特征向量的相同的特征空间中的数据用于训练。

检索到的模型。

特征
Vector
被发送到该模型,并返回一个分类预测。

使用特定的模型情境解释分类,然后返回给用户。

输出:看不见的数据的预测分类和对应的置信区间。





将其融入我们现有的平台,IdiML

为了提供最准确的模型,我们希望能够支持不同类型的机器学习库。Spark有一个独特的处理方式,因此我们希望我们主要的代码库能与任何特质隔绝。这被称为持久层(IdiML),它允许我们把Spark的功能与我们自己写的NLP特定代码结合起来。例如,在超参数调整过程中,我们可以使用结合Spark和我们自己的库组件的培养模式。这使我们能够自动选择执行最佳的模型,而不是只用一个模型来决定的所有模型。



为什么使用持久层?

使用持久层允许我们以实施培训和服务成千上万的机型。以下是IdiML为我们提供的:

存储训练过程中使用的参数的方法。这是必要的,以便返回相应的预测。

版本控制流水线的每一个部分的能力。这使我们能够支持进行更新的代码库后的向后兼容性。版本也指召回和项目的生命周期中支持的模型以前的迭代的能力。

能够自动选择对每个模型的最佳算法。期间超参数调谐,从不同的机器学习库实现以各种组合使用和结果进行评价。

通过规范面向开发者组件快速整合新功能NLP的能力。这提供了一个绝缘层,使得它不需要我们的功能工程师和数据科学家学习如何使用新的工具进行交互。

在任何环境中部署的能力。目前,我们正在EC2实践上使用Docker容器,但我们的架构意味着我们也可以采取burst capabilities,如亚马逊的lambda服务提供的优势。

一个单一的存储和基于通用InputStreams和OutputStreams,从而使我们的阅读的要求,写入和磁盘负载框架。

一个抽象的“slf4j”的形式的日志,使我们不依赖于任何特定的框架。

速度快且灵活的高性能系统

NLP与其他形式的机器学习不同,因为它可以直接对人类产生的数据进行操作。这往往比机器生成的数据更混乱,因为语言是模棱两可的,因此会导致高度可变性——即使在人类之间也是如此。我们的目标是使尽可能多的NLP流水线使资源得到更有效的利用:机器帮助人类-帮助机器-帮助人类。为了克服这一跨越语言的障碍,我们使用工具,如Spark,建立高性能的系统,比以往任何时候都更快、更灵活。

注:转载文章均来自于公开网络,仅供学习使用,不会用于任何商业用途,如果侵犯到原作者的权益,请您与我们联系删除或者授权事宜,联系邮箱:contact@dataunion.org。转载数盟网站文章请注明原文章作者,否则产生的任何版权纠纷与数盟无关。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: