使用 Hugging Face Transformers 设置文本摘要项目:第 1 部分

源节点: 1236281

什么时候 OpenAI 2020 年 XNUMX 月发布了他们的第三代机器学习 (ML) 模型,专门用于文本生成,我知道有些不同。 这个模型触动了前所未有的神经。 突然间,我听到可能对技术感兴趣但通常不太关心 AI/ML 领域的最新进展的朋友和同事谈论它。 就连《卫报》也写道 一篇文章 关于它。 或者,准确地说, 模型 撰写了这篇文章,《卫报》编辑并发表了这篇文章。 不可否认—— GPT-3 改变了游戏规则。

模型发布后,人们立即开始为它提出潜在的应用。 几周之内,创建了许多令人印象深刻的演示,可以在 GPT-3 网站. 引起我注意的一个特殊应用是 文字总结—— 计算机阅读给定文本并总结其内容的能力。 它是计算机最困难的任务之一,因为它结合了自然语言处理 (NLP) 领域内的两个领域:阅读理解和文本生成。 这就是为什么我对用于文本摘要的 GPT-3 演示印象深刻的原因。

你可以试一试 Hugging Face Spaces 网站. 目前我最喜欢的是一个 应用的区域 仅以文章的 URL 作为输入生成新闻文章的摘要。

在这个由两部分组成的系列中,我为组织提出了一个实用指南,以便您可以评估您所在领域的文本摘要模型的质量。

教程概述

与我合作的许多组织(慈善机构、公司、非政府组织)都有大量需要阅读和总结的文本——财务报告或新闻文章、科学研究论文、专利申请、法律合同等等。 自然,这些组织对使用 NLP 技术自动化这些任务感兴趣。 为了展示可能的艺术,我经常使用文本摘要演示,几乎总是给人留下深刻印象。

但是现在呢?

这些组织面临的挑战是,他们希望基于许多文档的摘要来评估文本摘要模型——而不是一次一个。 他们不想雇佣一个实习生,他的唯一工作就是打开应用程序,粘贴文件,点击 总结 按钮,等待输出,评估摘要是否良好,然后对数千个文档重新执行此操作。

我写这个教程时考虑到了四个星期前的自己——这是我希望在我开始这段旅程时拥有的教程。 从这个意义上说,本教程的目标受众是熟悉 AI/ML 并且以前使用过 Transformer 模型的人,但他们正处于文本摘要之旅的开始阶段,并且想要更深入地研究它。 因为它是由“初学者”写的,对于初学者来说,我想强调一个事实,本教程是 a 实用指南——不是 实用指南。 请把它当作 乔治 EP 盒 曾经说过:

关于本教程需要多少技术知识:它确实涉及到一些Python编码,但大多数时候我们只是使用代码调用API,因此也不需要深入的编码知识。 熟悉 ML 的某些概念会很有帮助,例如 培养 部署 模型,概念 训练, 验证 测试数据集, 等等。 还涉足 变形金刚库 before 可能很有用,因为我们在本教程中广泛使用了这个库。 我还包括有用的链接,以供进一步阅读这些概念。

因为本教程是由初学者编写的,所以我不希望 NLP 专家和高级深度学习从业者能够获得本教程的大部分内容。 至少不是从技术角度来看——不过,你可能仍然喜欢阅读,所以请暂时不要离开! 但是您必须对我的简化保持耐心——我试图按照让本教程中的所有内容尽可能简单但不简单的概念来生活。

本教程的结构

本系列分为四个部分,分为两篇文章,其中我们经历了文本摘要项目的不同阶段。 在第一篇文章(第 1 节)中,我们首先介绍了文本摘要任务的指标——一种性能指标,使我们能够评估摘要是好还是坏。 我们还介绍了我们想要总结的数据集,并使用非 ML 模型创建基线——我们使用简单的启发式方法从给定文本生成摘要。 创建此基线是任何 ML 项目中至关重要的一步,因为它使我们能够量化我们通过使用 AI 取得的进步。 它让我们能够回答“投资人工智能技术真的值得吗?”这个问题。

在第二篇文章中,我们使用已经预训练的模型来生成摘要(第 2 节)。 这可以通过称为 ML 的现代方法实现 转移学习. 这是另一个有用的步骤,因为我们基本上采用现成的模型并在我们的数据集上对其进行测试。 这使我们能够创建另一个基线,这有助于我们了解当我们在数据集上实际训练模型时会发生什么。 该方法称为 零样本总结,因为该模型对我们的数据集的曝光率为零。

之后,是时候使用预训练模型并在我们自己的数据集上对其进行训练(第 3 节)。 这也被称为 微调. 它使模型能够从我们数据的模式和特质中学习并慢慢适应它。 在我们训练模型之后,我们使用它来创建摘要(第 4 节)。

总结如下:

  • 部分1:
    • 第 1 部分:使用非 ML 模型建立基线
  • 部分2:
    • 第 2 部分:使用零样本模型生成摘要
    • 第 3 部分:训练摘要模型
    • 第 4 部分:评估训练好的模型

本教程的完整代码可在以下内容中找到 GitHub回购.

在本教程结束时我们将取得什么成就?

在本教程结束时,我们 不会 有一个可以在生产中使用的文本摘要模型。 我们甚至不会有 非常好 总结模型(在此处插入尖叫表情符号)!

相反,我们将拥有的是项目下一阶段的起点,即实验阶段。 这就是数据科学中的“科学”的用武之地,因为现在一切都是关于尝试不同的模型和不同的设置,以了解是否可以使用可用的训练数据训练出足够好的摘要模型。

而且,为了完全透明,很有可能得出的结论是技术还不成熟,项目不会实施。 你必须让你的业务利益相关者为这种可能性做好准备。 但这是另一篇文章的主题。

第 1 部分:使用非 ML 模型建立基线

这是我们关于设置文本摘要项目的教程的第一部分。 在本节中,我们使用一个非常简单的模型来建立基线,而不是实际使用 ML。 这是任何 ML 项目中非常重要的一步,因为它使我们能够了解 ML 在项目期间增加了多少价值,以及是否值得投资。

教程的代码可以在下面找到 GitHub回购.

数据,数据,数据

每个 ML 项目都从数据开始! 如果可能的话,我们总是应该使用与我们想要通过文本摘要项目实现的目标相关的数据。 例如,如果我们的目标是总结专利申请,我们也应该使用专利申请来训练模型。 ML 项目的一个重要警告是训练数据通常需要标记。 在文本摘要的上下文中,这意味着我们需要提供要摘要的文本以及摘要(标签)。 只有同时提供两者,模型才能了解好的摘要是什么样的。

在本教程中,我们使用公开可用的数据集,但如果我们使用自定义或私有数据集,步骤和代码保持完全相同。 同样,如果您对文本摘要模型有一个目标并拥有相应的数据,请使用您的数据来充分利用这一点。

我们使用的数据是 arXiv 数据集,其中包含 arXiv 论文的摘要及其标题。 出于我们的目的,我们将摘要用作我们要总结的文本,将标题用作参考摘要。 以下是下载和预处理数据的所有步骤 笔记本. 我们需要一个 AWS身份和访问管理 (IAM) 角色,允许将数据加载到和加载 亚马逊简单存储服务 (Amazon S3) 才能成功运行此笔记本。 该数据集是作为论文的一部分开发的 关于 ArXiv 作为数据集的使用 并根据 知识共享 CC0 1.0 通用公共领域奉献.

数据分为三个数据集:训练数据、验证数据和测试数据。 如果您想使用自己的数据,请确保也是如此。 下图说明了我们如何使用不同的数据集。

自然,此时的一个常见问题是:我们需要多少数据? 您可能已经猜到了,答案是:视情况而定。 这取决于领域的专业化程度(总结专利申请与总结新闻文章有很大不同),模型需要多准确才能有用,模型的训练应该花费多少,等等。 当我们实际训练模型时,我们稍后会回到这个问题,但缺点是当我们处于项目的实验阶段时,我们必须尝试不同的数据集大小。

什么是好的模型?

在许多 ML 项目中,衡量模型的性能相当简单。 这是因为模型的结果是否正确通常几乎没有歧义。 数据集中的标签通常是二元的(真/假、是/否)或分类的。 无论如何,在这种情况下,很容易将模型的输出与标签进行比较,并将其标记为正确或不正确。

生成文本时,这变得更具挑战性。 我们在数据集中提供的摘要(标签)只是总结文本的一种方式。 但是有很多可能性可以总结给定的文本。 因此,即使模型与我们的标签 1:1 不匹配,输出可能仍然是有效且有用的摘要。 那么我们如何将模型的摘要与我们提供的摘要进行比较呢? 在文本摘要中最常用于衡量模型质量的指标是 ROUGE得分. 要了解此指标的机制,请参阅 NLP 中的终极性能指标. 总之,ROUGE 分数衡量的是 n-gram (的连续序列 n 模型摘要(候选摘要)和参考摘要(我们在数据集中提供的标签)之间的项目)。 但是,当然,这不是一个完美的衡量标准。 要了解其局限性,请查看 胭脂还是不胭脂?

那么,我们如何计算ROUGE分数呢? 有很多 Python 包可以计算这个指标。 为了确保一致性,我们应该在整个项目中使用相同的方法。 因为我们将在本教程的后面部分使用 Transformers 库中的训练脚本而不是自己编写,所以我们可以窥视一下 源代码 脚本并复制计算 ROUGE 分数的代码:

from datasets import load_metric
metric = load_metric("rouge") def calc_rouge_scores(candidates, references): result = metric.compute(predictions=candidates, references=references, use_stemmer=True) result = {key: round(value.mid.fmeasure * 100, 1) for key, value in result.items()} return result

通过使用这种方法来计算分数,我们确保在整个项目中始终将苹果与苹果进行比较。

此函数计算几个 ROUGE 分数: rouge1, rouge2, rougeLrougeLsum. “总和”在 rougeLsum 指的是该度量是在整个摘要上计算的事实,而 rougeL 计算为单个句子的平均值。 那么,我们应该为我们的项目使用哪个 ROUGE 分数? 同样,我们必须在实验阶段尝试不同的方法。 对于它的价值, 原来的胭脂纸 指出“ROUGE-2 和 ROUGE-L 在单个文档摘要任务中表现良好”,而“ROUGE-1 和 ROUGE-L 在评估简短摘要方面表现出色”。

创建基线

接下来,我们要使用简单的非 ML 模型来创建基线。 那是什么意思? 在文本摘要领域,许多研究使用了一个非常简单的方法:他们首先取 n 文本的句子并将其声明为候选摘要。 然后,他们将候选摘要与参考摘要进行比较,并计算 ROUGE 分数。 这是一个简单而强大的方法,我们可以用几行代码来实现(这部分的整个代码在下面 笔记本):

import re ref_summaries = list(df_test['summary']) for i in range (3): candidate_summaries = list(df_test['text'].apply(lambda x: ' '.join(re.split(r'(?<=[.:;])s', x)[:i+1]))) print(f"First {i+1} senctences: Scores {calc_rouge_scores(candidate_summaries, ref_summaries)}")

我们使用测试数据集进行此评估。 这是有道理的,因为在我们训练模型之后,我们还使用相同的测试数据集进行最终评估。 我们也尝试不同的数字 n:我们只从第一句作为候选摘要开始,然后是前两句,最后是前三句。

以下屏幕截图显示了我们第一个模型的结果。

ROUGE 分数最高,只有第一句话作为候选摘要。 这意味着使用多个句子会使摘要过于冗长并导致得分较低。 这意味着我们将使用单句摘要的分数作为我们的基线。

需要注意的是,对于这种简单的方法,这些数字实际上是相当不错的,尤其是对于 rouge1 分数。 为了将这些数字放在上下文中,我们可以参考 飞马模型,它显示了不同数据集的最新模型的分数。

结论和下一步

在我们系列的第 1 部分中,我们介绍了我们在整个摘要项目中使用的数据集以及评估摘要的指标。 然后,我们使用简单的非 ML 模型创建了以下基线。

下一篇文章,我们使用零样本模型——具体来说,是一个经过专门训练用于公共新闻文章文本摘要的模型。 然而,这个模型根本不会在我们的数据集上进行训练(因此得名“零样本”)。

我把它留给你作为家庭作业来猜测这个零样本模型与我们非常简单的基线相比将如何表现。 一方面,它将是一个更复杂的模型(它实际上是一个神经网络)。 另一方面,它仅用于总结新闻文章,因此它可能会与 arXiv 数据集固有的模式有冲突。


关于作者

海科霍茨 是 AI 和机器学习的高级解决方案架构师,并领导 AWS 内的自然语言处理 (NLP) 社区。 在担任此职务之前,他是亚马逊欧盟客户服务的数据科学主管。 Heiko 帮助我们的客户在 AWS 上的 AI/ML 之旅中取得成功,并与许多行业的组织合作,包括保险、金融服务、媒体和娱乐、医疗保健、公用事业和制造业。 在业余时间,Heiko 尽可能多地旅行。

时间戳记:

更多来自 AWS机器学习