Transformers 自然语言处理(三)(3)

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
简介: Transformers 自然语言处理(三)

Transformers 自然语言处理(三)(2)https://developer.aliyun.com/article/1514214

用 T5-large 来总结文件

本节将创建一个总结函数,您可以用任何您希望总结的文本来调用。我们将总结法律和金融示例。最后,我们将定义方法的限制。

首先,我们将创建一个总结函数。

创建一个总结函数

首先,让我们创建一个名为summarize的摘要函数。这样,我们只需将要总结的文本发送到我们的函数即可。该函数接受两个参数。第一个参数是preprocess_text,即要总结的文本。第二个参数是ml,即摘要的最大长度。这两个参数是您每次调用函数时发送到函数的变量:

def summarize(text,ml): 

Hugging Face 等提供了现成的摘要函数。但是,我建议在有必要的时候学习如何构建自己的函数来定制这一关键任务。

根据上下文文本或真实内容,去掉了\n字符:

preprocess_text = text.strip().replace("\n","") 

然后我们将创新的T5任务前缀summarize应用于输入文本:

t5_prepared_Text = "summarize: "+preprocess_text 

T5 模型采用统一的结构,通过前缀 + 输入序列的方式来处理任务。这看起来可能很简单,但它将自然语言处理变换模型更接近通用训练和零-shot 下游任务。

我们可以展示处理(去掉)和准备好的文本(任务前缀):

print ("Preprocessed and prepared text: \n", t5_prepared_Text) 

简单吧?嗯,需要 35 年以上的时间才能从循环神经网络 (RNNs) 和卷积神经网络 (CNNs) 转向变换模型。然后需要世界上一些最优秀的研究团队才能从为特定任务设计的变换模型转向几乎不需要微调的多任务模型。最后,谷歌研究团队创建了一个标准格式,以包含指示需解决的自然语言处理问题的前缀的输入文本。这真是了不起的成就!

显示的输出包含预处理并准备好的文本:

Preprocessed and prepared text: 
summarize: The United States Declaration of Independence 

我们可以看到summarize前缀,表示需要解决的任务。

文本现在已经编码为令牌 ID,并将它们作为 torch 张量返回:

tokenized_text = tokenizer.encode(t5_prepared_Text, return_tensors="pt").to(device) 

编码文本已经准备好发送到模型中,以使用我们在开始使用 T5部分描述的参数生成摘要:

# Summarize
  summary_ids = model.generate(tokenized_text,
                                      num_beams=4,
                                      no_repeat_ngram_size=2,
                                      min_length=30,
                                      max_length=ml,
                                      early_stopping=True) 

这里的横梁数量与我们导入的模型相同。但是no_repeat_ngram_size已经从3降到了2

生成的输出现在使用tokenizer进行解码:

output = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
return output 

我们导入,初始化并定义了摘要化功能。现在让我们用一个一般性主题来试验 T5 模型。

一个一般性主题样本

在这一小节中,我们将通过 T5 模型运行由Project Gutenberg撰写的文本。我们将使用样本来测试我们的总结功能。您可以复制并粘贴任何其他您希望的文本,也可以通过添加代码加载文本。您还可以加载自己选择的数据集,并在循环中调用摘要。

本章节的程序目标是运行一些样本来看看 T5 是如何工作的。输入文本是Project Gutenberg电子书中包含美利坚合众国独立宣言开头的部分内容:

text ="""
The United States Declaration of Independence was the first Etext
released by Project Gutenberg, early in 1971\.  The title was stored
in an emailed instruction set which required a tape or diskpack be
hand mounted for retrieval.  The diskpack was the size of a large
cake in a cake carrier, cost $1500, and contained 5 megabytes, of
which this file took 1-2%.  Two tape backups were kept plus one on
paper tape.  The 10,000 files we hope to have online by the end of
2001 should take about 1-2% of a comparably priced drive in 2001.
""" 

然后我们调用我们的summarize函数,并发送我们想要总结的文本以及摘要的最大长度:

print("Number of characters:",len(text))
summary=summarize(text,50)
print ("\n\nSummarized text: \n",summary) 

输出显示我们发送了534个字符,原始文本(真实内容)经过预处理,还有摘要(预测):

Number of characters: 534
Preprocessed and prepared text: 
 summarize: The United States Declaration of Independence...
Summarized text: 
 the united states declaration of independence was the first etext published by project gutenberg, early in 1971\. the 10,000 files we hope to have online by the end of2001 should take about 1-2% of a comparably priced drive in 2001\. the united states declaration of independence was the first Etext released by project gutenberg, early in 1971 

现在让我们使用 T5 来进行更困难的摘要。

《权利法案》样本

下一个样本取自权利法案,更困难,因为它表达的是一个人的特权:

#Bill of Rights,V
text ="""
No person shall be held to answer for a capital, or otherwise infamous crime,
unless on a presentment or indictment of a Grand Jury, except in cases arising
 in the land or naval forces, or in the Militia, when in actual service
in time of War or public danger; nor shall any person be subject for
the same offense to be twice put in jeopardy of life or limb;
nor shall be compelled in any criminal case to be a witness against himself,
nor be deprived of life, liberty, or property, without due process of law;
nor shall private property be taken for public use without just compensation.
"""
print("Number of characters:",len(text))
summary=summarize(text,50)
print ("\n\nSummarized text: \n",summary) 

记住,Transformers是随机算法,因此每次运行时输出可能会有所不同。 话虽如此,我们可以看到 T5 并没有真正对输入文本进行总结,而只是简单地缩短了它:

Number of characters: 591
Preprocessed and prepared text: 
 summarize: No person shall be held to answer..
Summarized text: 
 no person shall be held to answer for a capital, or otherwise infamous crime. except in cases arisingin the land or naval forces or in the militia, when in actual service in time of war or public danger 

这份样本意义重大,因为它展示了任何Transformers模型或其他 NLP 模型面对这样的文本时所面临的限制。我们不能只展示总是有效的样本,并让用户相信Transformers已经解决了我们所面临的所有 NLP 挑战,无论它们有多么创新。

也许我们应该提供更长的文本来总结,使用其他参数,使用更大的模型,或者改变 T5 模型的结构。然而,无论你如何努力用 NLP 模型总结复杂的文本,你总会发现模型总结失败的文档。

当模型在一个任务上失败时,我们必须谦卑地承认。超级粘性人类基线是一个难以超越的基线。我们需要耐心、更加努力,改进Transformers模型,直到它们能比今天表现得更好。还有很多进步空间。

Raffel等人(2018)选择了一个适合描述 T5 方法的标题:探索统一文本到文本Transformers的迁移学习极限

花时间来尝试你在法律文件中发现的自己的示例。将迁移学习的极限作为现代 NLP 先驱的领域来探索!有时你会发现令人兴奋的结果,有时你会发现需要改进的地方。

现在,让我们尝试一份公司法样本。

一份公司法样本

公司法包含许多法律细微之处,使得总结任务非常棘手。

此样本的输入是美国蒙大纳州的公司法节选:

#Montana Corporate Law
#https://corporations.uslegal.com/state-corporation-law/montana-corporation-law/#:~:text=Montana%20Corporation%20Law,carrying%20out%20its%20business%20activities.
text ="""The law regarding corporations prescribes that a corporation can be incorporated in the state of Montana to serve any lawful purpose.  In the state of Montana, a corporation has all the powers of a natural person for carrying out its business activities.  The corporation can sue and be sued in its corporate name.  It has perpetual succession.  The corporation can buy, sell or otherwise acquire an interest in a real or personal property.  It can conduct business, carry on operations, and have offices and exercise the powers in a state, territory or district in possession of the U.S., or in a foreign country.  It can appoint officers and agents of the corporation for various duties and fix their compensation.
The name of a corporation must contain the word "corporation" or its abbreviation "corp."  The name of a corporation should not be deceptively similar to the name of another corporation incorporated in the same state.  It should not be deceptively identical to the fictitious name adopted by a foreign corporation having business transactions in the state.
The corporation is formed by one or more natural persons by executing and filing articles of incorporation to the secretary of state of filing.  The qualifications for directors are fixed either by articles of incorporation or bylaws.  The names and addresses of the initial directors and purpose of incorporation should be set forth in the articles of incorporation.  The articles of incorporation should contain the corporate name, the number of shares authorized to issue, a brief statement of the character of business carried out by the corporation, the names and addresses of the directors until successors are elected, and name and addresses of incorporators.  The shareholders have the power to change the size of board of directors.
"""
print("Number of characters:",len(text))
summary=summarize(text,50)
print ("\n\nSummarized text: \n",summary) 

结果令人满意:

Number of characters: 1816
Preprocessed and prepared text: 
 summarize: The law regarding the corporation prescribes that a corporation...
Summarized text: 
 a corporations can be incorporated in the state of Montana to serve any lawful purpose. a corporation can sue and be sued in its corporate name, and it has perpetual succession. it can conduct business, carry on operations and have offices 

这一次,T5 找到了文本摘要的一些关键方面。花一些时间加入自己的样本来看看会发生什么。用参数玩耍,看看它是否会影响结果。

我们已经实施了 T5 来进行文本总结。现在是时候通过 OpenAI GPT-3 引擎进行总结实验了。

使用 GPT-3 进行摘要

了解 T5 Transformers的体系结构非常重要。我们还将看到 GPT-3 引擎在其中一篇文章上的表现。目标不是对公司和模型进行基准测试。目标是让工业 4.0 人工智能领域的研究专家了解 NLP 的广泛知识。

首先,转到openai.com/并注册登录。

然后转到示例页面并选择为二年级学生总结


图 8.8:GPT-3 示例页面

一个窗口会弹出,我们可以输入我们的提示。

我们将前一节公司样本的文本T提交给 GPT-3 模型。

提示为P = E + T + S

  • E告诉模型要简化解释:
    我的二年级学生问我这段话是什么意思:
  • 文本T与前一节相同,用引号括起来:
    """关于公司的法律规定,公司可以在蒙大拿州成立以服务于任何合法目的。在蒙大拿州,公司具有进行业务活动的自然人的所有权利。
    .../...
    股东有权改变董事会的规模。"""
  • S显示了预期的任务类型:
    我用一个二年级学生可以理解的简单语言为他重新表述了:"""
    GPT-3 DaVinci 引擎生成的响应相当令人信服:

公司就是一个企业。

公司就是一个人。

公司可以做人能做的一切。

公司可以被起诉。

公司可以购买、出售或交易物品。

公司有自己的名称,与拥有它的人的名称不同。

公司是由想要创业的人成立的,并向政府提交文件以使其正式化。

我们可以保留T并修改ES

  • E可以改为:
    我的工商管理硕士学生问我这段话是什么意思:
  • S可以改为:
    我用工商管理硕士学院的语言重新表述了这段话:

GPT-3 引擎生成了上一个请求的响应,但为大学生添加了有用的信息:

公司可以有负责业务决策的董事会。董事会由股东选举产生。股东可以改变董事会的规模。

GPT-3 模型相当令人信服,并代表了云人工智能的崛起力量。在第十六章《Transformers驱动的合作伙伴的出现》中,我们将更深入地总结提示。然而,在我们这样做之前,还有更多,更多的探索。

摘要

在本章中,我们看到了 T5 Transformers模型如何标准化原始Transformers的编码器和解码器堆栈的输入。原始Transformers架构对于编码器和解码器堆栈的每个块(或层)具有相同的结构。然而,原始Transformers没有为自然语言处理任务制定标准化的输入格式。

Raffel 等人(2018)通过定义一个文本到文本模型,为广泛的自然语言处理任务设计了一个标准输入。他们为输入序列添加了一个前缀,指示要解决的自然语言处理问题类型。这导致了一个标准的文本到文本格式。文本到文本传输TransformersT5)应运而生。我们看到这个看似简单的演变使得可以对广泛的自然语言处理任务使用相同的模型和超参数成为可能。T5 的发明将Transformers模型的标准化过程推进了一步。

然后,我们实现了一个可以总结任何文本的 T5 模型。我们测试了该模型在未准备好的训练数据集中不属于的文本上的表现。我们测试了该模型在宪法和公司样本上的表现。结果很有趣,但我们也发现了一些Transformers模型的限制,正如 Raffel 等人(2018)预测的那样。

最后,我们探讨了 GPT-3 引擎方法论和计算效率的巨大力量。展示一个Transformers是一个出色的方法。拥有世界上最强大的Transformers引擎之一有助于获得有效的结果,尽管不总是完美的。

目标不是对公司和模型进行基准测试,而是让工业 4.0 AI 专家对Transformers有深入理解。

在下一章,第九章匹配标记化器和数据集 中,我们将探讨标记化器的限制,并定义可能改进自然语言处理任务的方法。

问题

  1. T5 模型只有像 BERT 模型那样的编码器堆栈。(是/否)
  2. T5 模型具有编码器和解码器堆栈。(是/否)
  3. T5 模型使用相对位置编码,而不是绝对位置编码。(是/否)
  4. 文本到文本模型仅设计用于摘要。(是/否)
  5. 文本到文本模型将一个前缀应用到输入序列中,确定自然语言处理任务。(是/否)
  6. T5 模型需要针对每个任务具体的超参数。(是/否)
  7. 文本到文本模型的一个优点是,它们对所有自然语言处理任务使用相同的超参数。(是/否)
  8. T5 Transformers不包含前馈网络。(是/否)
  9. Hugging Face 是一个使Transformers更易于实现的框架。(是/否)
  10. OpenAI 的Transformers引擎改变了游戏规则。(是/否)

参考文献

加入我们书籍的 Discord 空间

加入书籍的 Discord 工作区,与作者进行每月的 问我任何事 交流会:

www.packt.link/Transformers


第九章:匹配标记器和数据集

在研究变换器模型时,我们往往会关注模型的架构和提供给它们进行训练的数据集。我们已经探索了原始变换器,微调了一个类似 BERT 的模型,训练了一个 RoBERTa 模型,探索了一个 GPT-3 模型,训练了一个 GPT-2 模型,实现了一个 T5 模型等等。我们还研究了主要的基准任务和数据集。

我们训练了一个 RoBERTa 标记器并使用标记器对数据进行编码。然而,我们没有探索标记器的极限,以评估它们如何适应我们构建的模型。AI 是数据驱动的。Raffel 等人(2019),就像本书中引用的所有作者一样,花时间为变换器模型准备数据集。

在本章中,我们将介绍一些限制标记器的问题,这些问题妨碍了下游变换器任务的质量。不要轻易相信预训练的标记器。您可能有一个特定的词汇表(例如,高级医学术语),其中包含预训练标记器未处理的单词。

我们将从介绍一些与标记器无关的最佳实践开始,以衡量标记器的质量。我们将从标记化的角度描述数据集和标记器的基本准则。

然后,我们将使用 Word2Vec 标记器来查看标记器的限制,以描述我们在任何标记方法中面临的问题。这些限制将通过一个 Python 程序加以说明。

我们将继续通过在包含特定词汇的数据集上运行 GPT-2 模型来进行调查,包括无条件和有条件样本。

我们将进一步了解字节级 BPE 方法的限制。我们将构建一个显示由 GPT-2 标记器产生的结果的 Python 程序,并讨论在数据编码过程中出现的问题。这将表明,对于常见的 NLP 分析,并不总是需要 GPT-3 的优势。

然而,在本章末尾,我们将通过一个 词性 (POS) 任务来测试一个 GPT-3 引擎,以查看模型理解的程度以及一个准备就绪的标记化字典是否符合我们的需求。

本章涵盖以下主题:

  • 控制标记器输出的基本准则
  • 原始数据策略和预处理数据策略
  • Word2Vec 标记化问题和限制
  • 创建一个用于评估 Word2Vec 标记器的 Python 程序
  • 构建一个用于评估字节级 BPE 算法输出的 Python 程序
  • 使用特定词汇定制 NLP 任务
  • 运行 GPT-2 的无条件和有条件样本
  • 评估 GPT-2 标记器

我们的第一步将是探索 Raffel 等人(2019)定义的文本到文本方法论。

匹配数据集和标记器

下载基准数据集以训练变换器具有许多优点。数据已经准备好,并且每个研究实验室都使用相同的参考文献。此外,变换器模型的性能可以与具有相同数据的另一个模型进行比较。

然而,还需要做更多工作来改进 transformers 的性能。此外,在生产中实施 transformer 模型需要仔细规划和定义最佳实践。

在本节中,我们将定义一些最佳实践,以避免关键的障碍。

然后我们将通过在 Python 中使用余弦相似度来衡量分词和编码数据集的限制的几个示例。

让我们从最佳实践开始。

最佳实践

Raffel等人(2019)定义了一个标准的文本-文本 T5 transformer 模型。他们还走得更远。他们开始打破使用原始数据而不先进行预处理的神话。

预处理数据可以减少训练时间。例如,Common Crawl 包含通过网页提取获得的未标记文本。数据集中的非文本和标记已被删除。

然而,Google T5 团队发现,大部分通过 Common Crawl 获得的文本并不达到自然语言或英语的水平。因此他们决定在使用数据集之前需要对其进行清理。

我们将采纳Raffel等人(2019)提出的建议,并将企业质量控制最佳实践应用于预处理和质量控制阶段。在许多其他要应用的规则中,所描述的示例展示了为获得可接受的真实项目数据集所需的巨大工作。

图 9.1列出了应用于数据集的一些关键质量控制流程:


图 9.1:transformer 数据集的最佳实践

图 9.1所示,在训练 transformer 时,质量控制分为预处理阶段(步骤 1)和 transformer 投入生产后的质量控制(步骤 2)。

让我们浏览一下预处理阶段的主要方面。

步骤 1:预处理

Raffel等人(2019)建议在训练模型之前对数据集进行预处理,我加入了一些额外的想法。

Transformers 已经成为语言学习者,而我们已成为他们的老师。但是要教会一台机器学生一种语言,我们必须解释什么是正确的英语,例如。

在使用数据集之前,我们需要对其应用一些标准的启发式算法:

  • 句子令牌
    建议选择以句号或问号结尾的句子。
  • 删除不良词汇
    应该删除不良词汇。例如,可以在以下网站找到词汇列表:github.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words
  • 删除代码
    这有点棘手,因为有时代码就是我们正在寻找的内容。但是,通常最好从 NLP 任务的内容中删除代码。
  • 语言检测
    有时,网站包含带有默认“lorem ipsum”文本的页面。有必要确保数据集的所有内容都是我们所希望的语言。一个很好的开始方法是使用 langdetect,它可以检测 50 多种语言: pypi.org/project/langdetect/
  • 消除歧视引用
    这是必须的。我的建议是建立一个知识库,其中包括您可以从网络上获取的所有内容或特定数据集。压制任何形式的歧视。您肯定希望您的机器是道德的!
  • 逻辑检查
    将训练过的转换器模型应用于执行 自然语言推理 (NLI) 的数据集可能是个好主意,以过滤掉毫无意义的句子。
  • 错误信息引用
    消除指向无效链接、不道德网站或个人的文本。这是一项艰巨的工作,但肯定是值得的。

这个列表包含了一些主要的最佳实践。然而,还需要更多,比如过滤隐私法违规行为以及其他针对特定项目的行动。

一旦一个转换器被训练成学习正确的英语,我们需要帮助它在生产阶段检测输入文本中的问题。

步骤 2: 质量控制

一个训练过的模型将表现得像一个学习了语言的人一样。它将理解它可以理解的内容并从输入数据中学习。输入数据应该经过与 Step 1: Preprocessing 相同的过程,并将新信息添加到训练数据集中。反过来,训练数据集可以成为公司项目中的知识库。用户将能够在数据集上运行 NLP 任务并获得可靠的答案、特定文档的有用摘要等。

我们应该将 Step 1: Preprocessing 中描述的最佳实践应用到实时输入数据中。例如,一个转换器可以在来自用户或 NLP 任务的输入上运行,比如总结一系列文件。

转换器是有史以来最强大的 NLP 模型。这意味着我们的道德责任也增加了。

让我们来看一些最佳实践:

  • 实时检查输入文本
    不要接受错误信息。而是实时解析输入并过滤不可接受的数据 (参见 Step 1)。
  • 实时消息
    将被过滤的数据与被过滤原因一起存储,以便用户可以查阅日志。如果要求转换器回答不合适的问题,则显示实时消息。
  • 语言转换
    当可能时,您可以将罕见的词汇转换为标准词汇。请参阅本章的 Word2Vec 分词 部分的 Case 4。这并不总是可能的。当可能时,它可能代表了一大步。
  • 隐私检查
    无论您是将数据流入Transformers模型还是分析用户输入,私人数据必须从数据集和任务中排除,除非经用户或所在国家授权。这是一个棘手的问题。必要时请咨询法律顾问。

我们刚刚浏览了一些最佳实践。现在让我们看看为什么人类质量控制是必要的。

连续的人类质量控制

Transformers将逐渐接管大多数复杂的自然语言处理任务。然而,人类干预仍然是必需的。我们以为社交媒体巨头已经自动化了一切。然后我们发现有内容管理者决定了对他们平台上的内容的好坏。

正确的方法是训练一个Transformers,实现它,控制输出,并将重要结果反馈到训练集中。因此,训练集将不断改进,Transformers将继续学习。

图 9.2 显示了连续的质量控制如何帮助Transformers的训练数据集增长并提高其在生产中的性能:


图 9.2:连续的人类质量控制

我们已经浏览了 Raffel 等人(2019)描述的几种最佳实践,并根据我在企业人工智能项目管理方面的经验添加了一些指导。

让我们通过一个 Python 程序,举例说明一些分词器遇到的限制。

Word2Vec 分词

只要一切顺利,没人会想到预训练分词器。就像在现实生活中一样。我们可以开车多年而不考虑引擎的问题。然后,有一天,我们的车抛锚了,我们试图找出原因来解释这种情况。

预训练分词器也是如此。有时结果并不如我们所期望的那样。例如,一些词对就是不匹配,正如我们在 图 9.3 中看到的:


图 9.3:分词器计算错误的单词对

图 9.3 中显示的例子来自 美国独立宣言权利法案英国大宪章

  • cakechapters 不匹配,尽管分词器将它们计算为具有较高余弦相似度值。
  • freedom 指的是言论自由,例如。 copyright 指的是免费电子书编辑的注释。
  • paybill 在日常英语中是匹配的。 polysemy 是指一个词可以有多个含义。例如,Bill 意味着要支付的金额,但也指的是 权利法案。结果是可以接受的,但这可能纯属运气。

在继续之前,让我们花点时间澄清一些问题。QC是指质量控制。在任何战略性企业项目中,质量控制都是强制性的。输出的质量将决定关键项目的生存。如果项目不是战略性的,错误有时是可以接受的。但在战略项目中,即使是少量的错误都意味着风险管理审计的介入,以确定项目是否应该继续还是放弃。

从质量控制和风险管理的角度来看,标记化不相关的数据集(太多无用词或缺少关键词)将混淆嵌入算法并产生“糟糕的结果”。这就是为什么在本章中,我将“标记化”一词使用宽泛,包括一些嵌入,因为前者对后者的影响。

在战略性的 AI 项目中,“糟糕的结果”可能是一个单一错误,但后果严重(特别是在医疗领域、飞机或火箭装配以及其他关键领域)。

打开Tokenizer.ipynb,基于我们在第二章开始使用 Transformer 模型架构中创建的positional_encoding.ipynb

由于 Word2Vec 算法的随机性质,结果可能因一次运行而异。

首先安装和导入了先决条件:

#@title Pre-Requisistes
!pip install gensim==3.8.3
import nltk
nltk.download('punkt')
import math
import numpy as np
from nltk.tokenize import sent_tokenize, word_tokenize 
import gensim 
from gensim.models import Word2Vec 
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
import matplotlib.pyplot as plt
import warnings 
warnings.filterwarnings(action = 'ignore') 

我们的数据集text.txt包含美国独立宣言权利法案大宪章、以及伊曼纽尔·康德的作品等其他文本。

现在将对text.txt进行标记化并训练一个 word2vec 模型:

#@title Word2Vec Tokenization
#'text.txt' file
sample = open("text.txt", "r")
s = sample.read()
# processing escape characters
f = s.replace("\n", " ")
data = []
# sentence parsing
for i in sent_tokenize(f):
  temp = [] 
  # tokenize the sentence into words
  for j in word_tokenize(i):
    temp.append(j.lower())
  data.append(temp)
# Creating Skip Gram model
model2 = gensim.models.Word2Vec(data, min_count = 1, size = 512,window = 5, sg = 1)
print(model2) 

window = 5是一个有趣的参数。它限制了输入句子中当前单词和预测单词之间的距离sg = 1表示使用了 skip-gram 训练算法。

输出显示词汇量的大小为10816,嵌入维度为512,学习速率设置为alpha=0.025

Word2Vec(vocab=10816, size=512, alpha=0.025) 

我们拥有一个带嵌入式的词汇表示模型,并且可以创建一个名为similarity(word1,word2)的余弦相似度函数。我们将word1word2发送到该函数中,它会返回它们之间的余弦相似度值。值越高,相似度越高。

该函数首先会检测未知单词[unk],并显示一条消息:

#@title Cosine Similarity
def similarity(word1,word2):
        cosine=False #default value
        try:
                a=model2[word1]
                cosine=True
        except KeyError:     #The KeyError exception is raised
                print(word1, ":[unk] key not found in dictionary")#False implied
        try:
                b=model2[word2]#a=True implied
        except KeyError:       #The KeyError exception is raised
                cosine=False   #both a and b must be true
                print(word2, ":[unk] key not found in dictionary") 

只有在cosine==True时,才会计算余弦相似度,这意味着word1word2都是已知的。

if(cosine==True):
                b=model2[word2]
                # compute cosine similarity
                dot = np.dot(a, b)
                norma = np.linalg.norm(a)
                normb = np.linalg.norm(b)
                cos = dot / (norma * normb)
                aa = a.reshape(1,512)
                ba = b.reshape(1,512)
                #print("Word1",aa)
                #print("Word2",ba)
                cos_lib = cosine_similarity(aa, ba)
                #print(cos_lib,"word similarity")
        if(cosine==False):cos_lib=0;
        return cos_lib 

该函数将返回cos_lib,余弦相似度的计算值。

我们现在将讨论六种情况。我们将把“数据集”命名为text.txt

让我们从案例 0开始。

情况 0:数据集和词典中的单词

数据集中有freedomliberty两个词,并可以计算它们的余弦相似度:

#@title Case 0: Words in text and dictionary
word1="freedom";word2="liberty"
print("Similarity",similarity(word1,word2),word1,word2) 

相似性被限制为0.79,因为大量内容是从各种文本中插入的,以探索功能的限制:

Similarity [[0.79085565]] freedom liberty 

相似度算法不是迭代确定性计算。这一部分的结果可能会因数据集内容、另一次运行后数据集大小或模块版本的变化而改变。如果你运行这个单元格 10 次,你可能会得到不同的值,就像以下的 10 次运行中一样。

在以下情况下,我使用 Google Colab VM 和 CPU 进行了 10 次实验,结果完全相同:

Run 1: Similarity [[0.62018466]] freedom liberty
Run 2: Similarity [[0.62018466]] freedom liberty
...
Run 10: Similarity [[0.62018466]] freedom liberty 

然而,我在 Google Colab 的运行时菜单中做了一次“恢复出厂设置”。使用新的 VM 和 CPU,我得到了:

Run 1: Similarity [[0.51549244]] freedom liberty
Run 2: Similarity [[0.51549244]] freedom liberty
...
Run 10: Similarity [[0.51549244]] freedom liberty 

我在 Google Colab 的运行时菜单中进行了另一次“恢复出厂设置”。我还激活了 GPU。使用新的 VM 和 GPU,我得到了:

Run 1: Similarity [[0.58365834]] freedom liberty
Run 2: Similarity [[0.58365834]] freedom liberty
...
Run 10: Similarity [[0.58365834]] freedom liberty 

这里的结论是,随机算法基于概率。如果需要,运行预测n次是个好做法。

现在让我们看看当一个单词缺失时会发生什么。

情况 1:数据集或字典中没有的单词

缺少单词在许多方面都会带来麻烦。在这种情况下,我们将corporationsrights发送到相似度函数中:

#@title Word(s) Case 1: Word not in text or dictionary
word1="corporations";word2="rights"
print("Similarity",similarity(word1,word2),word1,word2) 

字典中不包含单词corporations

corporations :[unk] key not found in dictionary
Similarity 0 corporations rights 

迷途!这个单词是一个未知的[unk]标记。

如果缺失的单词是重要的话,它将引发一系列事件和问题,扭曲Transformers模型的输出。我们将这个缺失的单词称为unk

需要检查几种可能性,并回答问题:

  • unk在数据集中,但没有被选中放入标记化字典中。
  • 数据集中没有unk,这也适用于单词corporations。这解释了为什么在这种情况下它不在字典中。
  • 如果用户发送一个包含该标记且未被标记化的输入给Transformers,unk将会出现在生产中。
  • unk对于数据集来说不是一个重要的单词,但对Transformers的使用是重要的。

如果Transformers在某些情况下产生糟糕的结果,问题清单将继续增长。我们可以把0.8视为特定下游任务训练阶段Transformers模型的出色性能。但在现实生活中,谁希望与一个错误率达到 20%的系统一起工作呢:

  • 一个医生?
  • 一个律师?
  • 一个核电站维护团队?

0.8 在社交媒体等模糊环境中是令人满意的,因为很多消息本来就缺乏适当的语言结构。

现在是最糟糕的部分了。假设一个 NLP 团队发现了这个问题,并试图通过字节级 BPE 解决它,就像我们贯穿这本书所做的那样。如有必要,花几分钟回到第四章从头开始预训练 RoBERTa 模型第三步:训练一个标记器

如果一个团队只使用字节级 BPE 来解决问题,噩梦就开始出现:

  • unk 将会被分解成单词片段。例如,我们可能得到corporations变成corp + o + ra + tion + s。其中一个或几个这样的单词片段在数据集中有很高的概率被发现。
  • unk 将变成一组由数据集中存在但不传达原始标记意义的标记表示的子词。
  • 转换器将训练良好,没有人会注意到 unk 被分成片段并无意义地训练了。
  • 转换器甚至可能会产生出色的结果,并将其性能从 0.8 提高到 0.9
  • 每个人都会鼓掌,直到专业用户在关键情况下应用了错误的结果。例如,在英语中,corp 可能是 corporationcorporal。这可能会导致 corp 与其他单词之间的混淆和不良关联。

我们可以看到,社交媒体的标准可能足以用于处理微不足道的主题的转换器。但是在现实生活中的企业项目中,将需要辛勤工作才能生成与数据集匹配的预训练标记器。在现实生活中,数据集每天都在随着用户输入而增长。用户输入成为应定期训练和更新的模型数据集的一部分。

例如,确保质量控制的一种方法可以通过以下步骤实现:

  • 使用字节级 BPE 算法训练一个标记器。
  • 使用类似于本章的“控制标记化数据”部分中将创建的程序来控制结果。
  • 同样,训练一个使用于质量控制的 Word2Vec 算法的标记器,然后解析数据集,找到 unk 标记,并将其存储在数据库中。运行查询以检查是否缺少关键单词。

在如此详细地检查过程可能看起来是不必要的,并且你可能会倾向于依赖转换器对未见过的单词进行推理的能力。

然而,我建议在战略性项目中运行几种不同的质量控制方法,其中包括关键决策。例如,在法律摘要中,一个词可能是在法庭上赢得或输掉案件的区别。在航空航天项目(飞机,火箭)中,有一个 0 误差容忍标准。

运行越多的质量控制流程,你的转换器解决方案就会越可靠。

我们可以看到,获得可靠的数据集需要大量的工作!每一篇关于转换器的论文都以某种方式提到了制作可接受数据集所需的工作。

嘈杂的关系也会引起问题。

情况 2:嘈杂的关系

在这种情况下,数据集包含了单词 etextdeclaration

#@title Case 2: Noisy Relationship
word1="etext";word2="declaration"
print("Similarity",similarity(word1,word2),word1,word2) 

此外,它们都出现在了标记化字典中:

Similarity [[0.880751]] etext declaration 

更好的是,它们的余弦相似度似乎对其预测确信无疑,超过了 0.5。算法的随机性可能会导致在不同运行中产生不同的结果。

在微不足道的或社交媒体级别,一切看起来都很好。

然而,在专业水平上,结果是灾难性的!

etext 指的是 古腾堡计划 网站上每本电子书的前言,如本章的“匹配数据集和标记器”部分所解释的。特定任务的转换器目标是什么:

  • 了解编辑的序言吗?
  • 或者理解书的内容呢?

这取决于Transformers的使用情况,可能需要几天的时间来解决。例如,假设编辑想要自动理解序言并使用Transformers生成序言文本。我们应该将内容取出吗?

declaration是与独立宣言实际内容相关的有意义的词汇。

etextProject Gutenberg添加到其所有电子书中的序言的一部分。

这可能会导致错误的自然语言推理,例如Transformers被要求生成文本时产生etext 是声明

让我们来看一个缺失单词的问题。

情况 3:文本中但不在字典中的词汇

在某些情况下,一个词可能在文本中但不在字典中。这将扭曲结果。

让我们来看看单词pielogic

#@title Case 3: word in text, not in dictionary
word1="pie";word2="logic"
print("Similarity",similarity(word1,word2),word1,word2) 

单词pie不在字典中:

pie :[unk] key not found in dictionary
Similarity 0 pie logic 

我们可以假设单词pie会在一个分词的字典中。但是如果没有或者另一个词没有呢?单词pie不在文本文件中。

因此,我们应该在流程中有函数来检测不在字典中的词汇,以实现更正或替代。此外,我们应该在流程中有函数来检测可能重要的数据集中的词汇。

让我们看看罕见词汇带来的问题。

情况 4:罕见词汇

罕见的词汇对超出简单应用范围的特定任务的Transformers输出产生毁灭性影响。

管理罕见词汇延伸到许多自然语言的领域。例如:

  • 罕见词汇可能出现在数据集中但被忽视,或者模型训练不足以处理它们。
  • 罕见词汇可能是医学、法律、工程术语或任何其他专业行话。
  • 罕见的词汇可能是俚语。
  • 英语语言有数百种变体。例如,不同的英语词汇在美国、英国、新加坡、印度、澳大利亚和许多其他国家的某些地区使用。
  • 罕见的词汇可能来自几个世纪前的文本,被遗忘或只有专家使用。

例如,在这种情况下,我们使用了单词justiciar

#@title Case 4: Rare words
word1="justiciar";word2="judgement"
print("Similarity",similarity(word1,word2),word1,word2) 

judgement的相似性是合理的,但应该更高:

Similarity [[0.6606605]] justiciar judgement 

你可能会认为单词justiciar有些牵强。分词器将其从大宪章中提取出来,可以追溯到 13 世纪初。不幸的是,程序会感到困惑,我们在每次运行后都会得到意外的结果。

注:预测可能会因为每次运行而有所不同。然而,它们显示了我们在Transformers模型项目的分词和嵌入阶段中需要多么谨慎。

然而,大宪章的几条款在 21 世纪的英格兰仍然有效!例如,第 1、13、39 和 40 条仍然有效!

大宪章最著名的部分是以下摘录,它包含在数据集中:

(39) No free man shall be seized or imprisoned, or stripped of his
rights or possessions, or outlawed or exiled, or deprived of his
standing in any other way, nor will we proceed with force against him,
or send others to do so, except by the lawful judgement of his equals
or by the law of the land.
(40) To no one will we sell, to no one deny or delay right or justice. 

如果我们在律师事务所中实施一个Transformers模型来总结文件或其他任务,我们必须小心!

现在让我们看看解决稀有词问题的一些方法。

Case 5: 替换稀有词

替换稀有词本身就是一个项目。这项工作保留给特定的任务和项目。假设企业预算可以支付航空领域的知识库成本,例如。在这种情况下,值得花费必要的时间来查询分词目录,以找到它错过的单词。

问题可以按主题分组解决,并且知识库将定期更新。

Case 4中,我们遇到了单词justiciar。如果我们回到它的起源,我们可以看到它来自法国诺曼德语,并且是法国类拉丁语单词judicaire的根源。

我们可以用judge替换justiciar,这传达了相同的元概念:

#@title Case 5: Replacing rare words
word1="judge";word2="judgement"
print("Similarity",similarity(word1,word2),word1,word2) 

它产生了一个有趣的结果,但由于算法的非确定性方面,我们仍然需要小心:

Similarity [[0.7962761]] judge judgement 

我们也可以保留单词justiciar,但尝试单词的现代含义并将其与judge进行比较。您可以尝试实现Case 5: Replacing rare words

word1="justiciar";word2="judge"
print("Similarity",similarity(word1,word2),word1,word2) 

无论如何,一些稀有词都需要被更常见的词替换。

结果将是令人满意的:

Similarity [[0.9659128]] justiciar judge 

我们可以创建使用替换单词的查询,直到我们找到相关性超过0.9的情况。此外,如果我们正在管理一个关键的法律项目,我们可以将包含任何类型稀有词的重要文档翻译成标准英语。因此,变换器在自然语言处理任务中的性能将提高,并且公司的知识库将逐渐增加。

现在让我们看看如何使用余弦相似度进行蕴含验证。


Transformers 自然语言处理(三)(4)

相关文章
|
2月前
|
存储 人工智能 自然语言处理
Transformers 自然语言处理(五)(2)
Transformers 自然语言处理(五)
47 0
|
2月前
|
存储 自然语言处理 算法
Transformers 自然语言处理(四)(3)
Transformers 自然语言处理(四)
47 0
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
Transformers 自然语言处理(一)(2)
Transformers 自然语言处理(一)
40 3
|
2月前
|
存储 机器学习/深度学习 自然语言处理
Transformers 自然语言处理(一)(3)
Transformers 自然语言处理(一)
42 2
|
2月前
|
机器学习/深度学习 存储 自然语言处理
Transformers 自然语言处理(一)(1)
Transformers 自然语言处理(一)
39 2
|
2月前
|
人工智能 自然语言处理 数据可视化
Transformers 自然语言处理(四)(1)
Transformers 自然语言处理(四)
13 1
|
2月前
|
人工智能 自然语言处理 数据可视化
Transformers 自然语言处理(五)(1)
Transformers 自然语言处理(五)
18 0
|
2月前
|
人工智能 自然语言处理 算法
Transformers 自然语言处理(四)(4)
Transformers 自然语言处理(四)
27 0
|
2月前
|
人工智能 自然语言处理 数据可视化
Transformers 自然语言处理(四)(2)
Transformers 自然语言处理(四)
13 0
|
2月前
|
人工智能 自然语言处理 安全
Transformers 自然语言处理(三)(4)
Transformers 自然语言处理(三)
25 0