作者: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 ML和MLlib优化功能。充分使用这些是为了NLP,包括我们称之为IdiML的持久层的加入。这使我们能够利用Spark进行个体预测,而不是其最常见的用于一次性处理大量数据的平台用法。
在更详细的层面上,NLP流水线有三个主要组成部分:
每个组件的一个简单的例子如下所述:
在特征提取阶段,基于文本的数据转化为一个特征向量的数值数据。此向量表示的文本的独特的特性,可以生成任何序列的数学变换。我们的系统是建立在容易适应其他功能类型,如来自深度学习的功能,但为了简单起见,我们会考虑一个基本的特征流水线实例:
org.apache.spark.mllib.linalg.Vector
).
在训练阶段,一个分类被附加到特征向量。在Spark里用 LabeledPoint
数据类型表示。二元分类中,分类是真或假(1或0)。
Vectors
。 LogisticRegressionWithLBFGS
功能,在适合模型的基础上给出了特征向量及相关分类。
Vector
被发送到该模型,并返回一个分类预测。
为了提供最准确的模型,我们希望能够支持不同类型的机器学习库。Spark有一个独特的处理方式,因此我们希望我们主要的代码库能与任何特质隔绝。这被称为持久层(IdiML),它允许我们把Spark的功能与我们自己写的NLP特定代码结合起来。例如,在超参数调整过程中,我们可以使用结合Spark和我们自己的库组件的培养模式。这使我们能够自动选择执行最佳的模型,而不是只用一个模型来决定的所有模型。
使用持久层允许我们以实施培训和服务成千上万的机型。以下是IdiML为我们提供的:
NLP与其他形式的机器学习不同,因为它可以直接对人类产生的数据进行操作。这往往比机器生成的数据更混乱,因为语言是模棱两可的,因此会导致高度可变性——即使在人类之间也是如此。我们的目标是使尽可能多的NLP流水线使资源得到更有效的利用:机器帮助人类-帮助机器-帮助人类。为了克服这一跨越语言的障碍,我们使用工具,如Spark,建立高性能的系统,比以往任何时候都更快、更灵活。