应用型NLP思维:如何将业务问题转化为技术方案

4 阅读19分钟

应用型NLP思维:如何将业务问题转化为技术方案

评估、NLP 策略、伊内斯·蒙塔尼

某机构运营了大约五年,这让我们对自然语言处理在行业环境中的应用有了很多见解。在这篇博客文章中,我将讨论应用型NLP面临的一些最大挑战,以及如何将业务问题转化为机器学习解决方案。

关于本文

这篇博文基于我在NAACL 2021“教学NLP”研讨会和L3-AI在线会议上的演讲。你也可以在此观看视频或查看幻灯片。

当你刚进入这个领域并面对需要解决的实际问题时,很容易感到有些迷茫。即使你了解机器学习的基础知识,熟悉行业标准库,并且拥有编程和训练自己模型的经验,你可能仍然觉得缺少点什么。缺少正确的直觉、正确的心态,以及一种关于“该做什么”的不同推理方式。我称之为“应用型NLP思维”。

应用型NLP思维:一个类比

这是一个相当抽象的概念,但在我撰写本文时,我想出了一个非常贴切的类比。像世界上大多数人一样,我在2020年待在室内的时间比平时更多。也许我只是想念餐馆,但有一段时间,我真的很喜欢看烹饪节目。我尤其对经营餐厅的商业层面,以及它如何与实际烹饪技艺本身相结合感兴趣。

烹饪涉及很多学习内容:你需要掌握许多技能和技巧,能够复现食谱并使用各种不同的设备。你需要了解食材以及如何呈现你的菜品,除此之外,还有营养学、化学和食品科学的基础知识。你不需要成为食品科学家才能成为一名好厨师,但了解鸡蛋、芥末和油如何变成蛋黄酱肯定有帮助。

但是,餐厅不仅仅关乎烹饪。餐厅厨房基本上是一个小工厂。为了让你的工厂有任何成功的机会,菜单需要精心设计。菜品和风味需要协调一致,你需要能够可靠地采购食材。每一道菜都需要每次都能稳定地准备出来,不能出错。菜单还需要很好地服务于市场,并留有足够的利润空间,餐厅才能成功。

烹饪 | 菜单设计

技能和技巧 | 选择风味和菜品的组合 复现食谱 | 采购食材 使用设备 | 确保可靠性 处理食材 | 了解市场和菜系类型 食物摆盘 | 优化利润 营养、化学和食品科学 |

现在,我不是厨师,但如果有人不懂烹饪却能设计出好的餐厅菜单,我会感到惊讶。你无法抽象掉所有操作的细节以及你可以做哪些调整。所有这些细节都很重要。但设计菜单的活动与执行它也有很大不同。决定做什么的活动与仅仅执行计划是不同的。

做什么 vs. 如何做

应用型NLP更多关乎决定“做什么菜”,而不是“如何做菜”。实际上,很大一部分甚至是决定“是否要做菜”——找到NLP可能可行且富有成效的正确项目。理解项目需求并将其转化为系统设计的过程更难学习,因为在没有很好地掌握“如何做”之前,你无法真正触及“做什么”。

如何做 | 做什么

实现模型 | 何时使用机器学习 机器学习基础 | 决定训练哪些模型和组件 训练和评估 | 理解应用程序将如何使用输出 提高准确率 | 找到最佳权衡 使用库的API | 选择资源和库 Python和DevOps |

“如何做”是帮助你执行计划的一切。这包括知道如何实现模型、它们如何工作,以及帮助你理解底层原理的各种机器学习基础知识。还包括知道如何训练和评估你的模型,以及如何改进结果。当然,你还应该熟悉标准库,并且更普遍地精通编程和软件工程。

所有这些都是“如何做”,是你可以从书籍和课程中学到的东西。

“做什么”是将应用程序目标转化为你的机器学习需求,设计系统应该做什么以及你将如何评估它。它包括首先决定何时使用机器学习,以及是否使用基于规则的系统等其他方法。还包括选择最有可能完成任务的那种类型的组件和模型进行训练。这需要深刻理解输出在更广泛的应用程序上下文中将被如何使用。你还需要能够找到正确的权衡,例如在速度和准确率之间,或者在便利性和灵活性之间。这包括知道有哪些资源和库可用,以及在何时使用什么。“做什么”对应用型NLP至关重要——没有“如何做”,你无法解决它。但仅仅“如何做”本身是不够的。

给你举个例子,这是一个你可能遇到的应用场景。想象一下,你在一家大公司工作,IT服务台收到了大量的支持工单。你的组织希望更快、更高效地回答这些工单,并且他们希望了解最常见的问题是什么,以便将来更好地预防。你可以用NLP来解决这些需求,有很多不同的方法。那么,你从哪里开始?

电脑无法开机。

在启动过程中,它遇到错误并进入调试控制台。

我不断尝试开机,但它黑屏并重启。

也许你可以将支持工单按问题类型分类,并尝试预测?或者先对它们进行聚类,看看聚类结果是否有助于确定将工单分配给谁?如果你有关于解决工单所需时间的数据,也许你可以对其进行回归分析——对工单进行成本估算,在平衡工作队列、人员配置,或者仅仅是设定预期方面可能非常有帮助。你也可以尝试提取可能指示问题的关键短语。如果你能预测这些,可能有助于预分类工单,并且你能够指出具体的引用内容。然而,界限非常模糊,关键短语可能是离散的。你的数据一致性越差,训练模型就越困难。因此,你可能需要一种不同的方法。

也许有一种方法,可以用更针对特定领域和术语的自定义嵌入来启动这个过程,以榨取更高的准确率。但系统也需要有用,那么你将如何衡量这一点?你的组织是否在跟踪响应时间,以便你可以根据此来测试你的NLP系统?在头脑风暴结束时,你可能会得到一个初步的待办事项列表:从标签方案开始,让IT支持团队参与进来,这样你就可以解释什么可以自动化,什么不可以。也许可以训练一个文本分类基线,用一些关键词进行引导。

真正决定项目成败的,正是对“做什么”这个问题的回答。如果你以一种不能真正解决应用程序相关问题的方式来构建问题,那么即使你建立的模型在测试数据上取得了很高的准确率,也无关紧要。那么,如何提高回答“做什么”的能力呢?

首先,不考虑应用,你就无法做应用型NLP。你需要真正投入到你试图构建的系统目标中去。你不能只是说,“产品决策是产品人员的工作”——除非“产品人员”比你更懂NLP。

你也不应该认为“做什么”是微不足道的。我们有时看到的一个问题是,人们认为“做什么”是微不足道的,仅仅是因为关于它的讨论不多,而你听到的都是“如何做”。如果你认为将应用需求转化为机器学习设计真的很容易,问题真的很容易,你可能也会认为脑海中出现的第一个想法可能就是正确的。这可能导致一些代价高昂的错误。相反,最好假设你的第一个想法可能并不理想,或者可能根本行不通。构思出一个成功的设计可能需要一些迭代。

效用 vs. 准确率

那么,如何知道你的设计是成功的呢?在应用型NLP中,注意效用和准确率之间的区别很重要。这里的“准确率”代表你可以在测试集上计算的任何客观分数——即使计算涉及一些人工努力,比如人工质量评估。这是一个你可以跟踪的数字,如果一切顺利,这个数字应该会上升。相比之下,模型的“效用”是它在应用程序或项目中的影响。这要难测量得多,并且总是取决于应用程序的上下文。

希望你的评估指标至少应该与效用相关——如果不是,那你就真的有麻烦了。但这种相关性不必完美,关系也不必是线性的。我在这里使用的“效用”与经济学或伦理学中使用的含义相同。在经济学中,引入“效用”这个概念很重要,是为了提醒人们金钱不是一切。在应用型NLP,或者更广义的应用型机器学习中,我们需要指出评估指标并不是一切。

评估指标对研究和应用都很重要,但它们的作用并不完全相同。这又回到了你拥有的不同目的上。研究基本上是关于构建知识的公共资源,其理念是,这个公共资源总体上应该是有用的。为了实现这一点,研究至少需要有一定的泛化能力。它不能只针对一种情况。应用则正好相反:你取通用的东西,并将其适应到你的特定上下文。

研究 | 应用

构建知识公共资源 | 从知识公共资源中学习 寻找具有泛化能力的、独立于上下文的解决方案 | 将通用解决方案适应到特定上下文 使用标准评估进行直接比较 | 将评估与项目目标对齐 对所有非新颖的内容进行标准化 | 做任何有效的事情

另一个区别是,在研究中,你主要关心的是弄清楚你的结论是否正确,也许还要量化其不确定性。在应用中,底线是项目是否有用。因此,当你在研究中进行评估时,你试图隔离你的新想法,并且你通常希望以与先前工作完全相同的方式进行评估。这样你就可以测试你的改变是否达到了你希望的效果。在应用中,你主要使用评估来选择在生产中尝试哪个系统。你希望一个在你的评估中得分更高的系统在你的应用中应该更好。换句话说,你使用评估作为效用的代理——你希望两者有很好的相关性。通常它们确实是相关的!但你也可以选择评估方式——这是一件完全合法且有用的事情。在研究中,改变评估方式是非常痛苦的,因为这使得与先前工作的比较变得更加困难。

“效用”的含义因每个应用而异。在我们处理IT支持工单系统的例子中,一个成功的应用将带来更快的流程,因为它允许更快地分配给正确的人。反过来,这可以带来更高的满意度:遇到问题的用户能更快得到帮助,IT支持人员花在等待或处理其核心专业知识之外的工单上的时间更少。自动分类工单也有助于发现常见问题并知道要修复什么。所有这些都可以带来更高的收入,或者为公司节省一大笔钱。

人们经常讨论机器学习作为一种降低成本的手段——它可以“取代人力”。但实际上要让这一工作良好运行相当困难,因为可靠性通常比价格重要得多。如果你的计划由许多独立的步骤组成,总成本将是累加的,而风险是倍增的。任何步骤出了问题都会影响整个计划。因此,对于业务流程中的应用型NLP,效用主要是关于减少方差。人类和模型都会犯错,但它们是不同类型的错误。人类可以轻易发现模型犯的错误,而模型可以很好地纠正人类因疏忽造成的错误。

没有“效用”的概念,就很难讨论为什么你会更喜欢一种评估而不是另一种。假设你有两个评估指标,它们对你训练的系统产生不同的排序。你应该更喜欢哪个评估指标?答案是,“哪个与效用相关性更好,就选哪个”。

语言学可以提供帮助

我们已经看到,对于应用型NLP,思考“做什么”而不仅仅是“如何做”非常重要。我们也看到,我们不能只专注于优化一个评估数字——我们需要思考效用。那么,我们如何为人们提供一个更好的工具包来做到这一点呢?我们应该教人们什么,才能使他们的NLP应用更有可能成功?我认为语言学是这里答案的一个重要部分,但经常被忽视。

从事NLP的人可以专注于许多不同的领域,无论是进行研究还是应用。如果你玩过角色扮演游戏,你可以把它想象成将点数投入到不同的技能树中。假设你想为“应用型NLP”培养你的角色,并且你知道你不想做研究。你应该如何分配你的点数?

一个常见的建议是将语言学的优先级排到最低。如果你是分配初始点数,了解一点编程和机器学习肯定更重要。至于库和API,这个有点特殊:结果证明,游戏会在你进行过程中就给你这方面的点数。你会发现自己在工作中不知不觉就熟练掌握了所需的任何工具,所以不需要明确地将任何点数花在这方面。

提示:开始学习语言学 如果你是一名NLP或机器学习从业者,希望了解更多语言学知识,我们推荐艾米丽·M·本德所著的《自然语言处理的语言学基础》一书。

对于应用型NLP,一点语言学知识可以大有裨益,并能防止一些代价高昂的错误。我并不是说你应该把所有点数都投入到语言学上,使其达到极致——这会带来收益递减。但对语言学一无所知确实会阻碍人们前进。以下是一些我认为任何从事应用型NLP工作的人都应该了解的语言学概念示例。

词项、词元与形态学

让我们回到IT支持工单的例子。你正在处理这个任务,有人建议从工单中提取关键词,这些关键词可以像主题标签一样。支持团队将能够点击该主题,并看到其他带有该标签的工单。你对LDA和主题建模了如指掌,所以你可以轻松地创建聚类。然而,一元(unigram)主题并不令人满意,所以你包含了二元组和三元组。现在你有了像“n‘t turn”这样的主题,这在数据中非常常见,但没什么用。如何得到像“turn on”和“resets”这样的主题,而不是“, but it”?

如果你以前从未过多思考过语言,期望“一个词”是一个简单易定义、易处理的东西是正常的。如果你的母语是像英语这样的语言,这一点尤其明显,因为大多数词汇项是由空格分隔的,并且形态相对简单。

然而,即使在英语中,也有很多多词表达:词项内部包含空格,甚至可能不连续,例如短语动词。形态学也常常很重要。不需要很多学习就能理解词项和词元之间的区别,并思考你的应用程序应该处理哪一个。理解齐普夫定律尤其重要,因为文本样本中词项数量和词元数量之间的数值关系通常非常相关。因此,了解语言学可以帮助你约束系统的输出,使你的应用程序更有用。

组合句法与语义学

另一个值得更多关注的话题是组合句法与语义学。当你设计标注方案并想弄清楚如何构建你的任务时,这一点尤其相关。

例如,让我们再看一下IT支持工单。我们看到人们有一种非常普遍的直觉,就是希望他们的模型识别文本的子序列。例如,有人可能会建议:让我们标注出表明问题的短语,并在此基础上训练一个实体识别器!这里的问题是,“问题”并不一定能可靠地表达为任何特定的句法成分。它甚至可能不在一个单一的谓词-论元结构之内。这意味着你将要标注的文本跨度是非常任意的。你的标注者永远无法就标注什么达成一致,而且在最后,你甚至打算用输出做什么?如果你返回的不是特定类型的短语,那么最终提取出来的跨度将很难进行任何处理。

在这个例子中,一个解决方案是将问题建模为文本分类任务。这将使一致地标注变得更加直观,并且你只需要为每个文本的每个标签收集一个决策。这也使得让主题专家(如你的IT支持团队)参与进来更容易。你训练的模型将只需预测整个文本的标签,并且它产生的输出对下游应用程序更有用。

然而,有时,一个扁平的标签确实不够。例如,在大多数聊天机器人上下文中,你希望获取文本并将其解析为函数调用,包括参数。如果你在做这件事,对句法和语义有一些理解真的很重要。句法将帮助你正确定义参数边界,因为你确实希望你的参数是句法成分——这是使它们保持一致的唯一方法。而语义学将帮助你理解为什么实际文本将比你团队可能想到的主-谓-宾示例复杂得多。

结论

关于应用型NLP的著述远少于关于NLP研究的著述,这可能使人们难以猜测应用型NLP会是什么样子。在许多研究背景下,你会实现一个基线,然后实现一个超越它的新模型。因此,很自然地会猜测应用型NLP也会是这样,只是没有“新模型”部分。这并非完全错误,但它遗漏了一些非常重要的东西。研究有非常不同的目标,这需要不同的思维方式。如果你想象在不改变这种思维方式的情况下做应用型NLP,你会得出一个相当不正确的印象。

对于应用型NLP,最重要的事情是带着对产品或应用目标的思考进入。你不能抽象掉这些目标,只是埋头苦干一个优化问题。那样你永远无法交付任何有价值的东西,甚至可能交付有害的东西。相反,你需要在数据、模型实现甚至评估方面尝试不同的想法。你不应该认为决定“做什么”是微不足道或显而易见的,尤其不应该假设你的第一个想法就是最好的。

你还应该记住,评估在你的项目中会有不同的作用。无论你如何评估你的模型,留出集的分数只是模型优于另一个的证据。你需要去验证这一点。准确率不等同于效用。你应该期望检查多个模型的效用,这意味着你需要有一条从原型到生产的顺畅路径。你不应该期望只在你本地机器的Jupyter笔记本上工作。

应用型NLP给你很多决策要做,这些决策往往很困难。迭代很重要,但建立关于什么可能有效、什么可能无效的更好直觉也很重要。语言学中的一些主题在这里可以真正提供帮助。显然,还有很多其他东西要学,但一旦你掌握了扎实的编程技能和对机器学习的良好概念性概述,就值得在语言学技能树上投入一些点数。

应用型NLP不仅仅是像研究型NLP那样,只是新颖性少一点,思考少一点。它需要不同的思考:应用型NLP思维。

关于作者

伊内斯·蒙塔尼 CEO, 创始人 伊内斯是某机构的联合创始人,spaCy NLP库和Prodigy标注工具的核心开发者。她帮助为AI工程师和研究人员的开发工具设定了用户体验的新标准。