【NLP】第9章 匹配分词器和数据集

在研究 Transformer 模型时,我们倾向于关注模型的架构以及为训练它们而提供的数据集。我们探索了原始的 Transformer,微调了类似 BERT 的模型,训练了 RoBERTa 模型,探索了 GPT-3 模型,训练了 GPT-2 模型,实现了 T5 模型等等。我们还完成了主要的基准测试任务和数据集。

我们训练了一个 RoBERTa 分词器并使用分词器对数据进行编码。但是,我们没有探索标记器的局限性来评估它们如何适合我们构建的模型。人工智能是数据驱动的。拉菲尔等人。(2019 年)与本书中引用的所有作者一样,花时间为 Transformer 模型准备数据集。

在本章中,我们将讨论标记器的一些限制,这些限制会阻碍下游转换器任务的质量。不要从表面上接受预训练的分词器。您可能有一个特定的词典,其中包含您使用的单词(例如高级医学语言)以及未由通用预训练标记器处理的单词。

我们将首先介绍一些与分词器无关的最佳实践来衡量分词器的质量。我们将从标记化的角度描述数据集和标记器的基本指南。

然后,我们将看到带有 Word2Vec 分词器的分词器的限制,以描述我们使用任何分词方法面临的问题。这些限制将通过 Python 程序进行说明。

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

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

但是,在本章的最后,我们将使用词性POS ) 任务来探索 GPT-3 引擎,以了解模型的理解程度以及现成的标记化字典是否符合我们的需求。

本章涵盖以下主题:

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

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

匹配数据集和分词器

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

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

在本节中,我们将定义一些最佳实践来避免关键的绊脚石。

然后我们将通过 Python 中的一些示例使用余弦相似度来衡量标记化和编码数据集的限制。

让我们从最佳实践开始。

最佳实践

拉斐尔等人。(2019) 定义了一个标准文本到文本 T5 转换器模型。他们也走得更远。他们开始打破使用原始数据的神话无需先对其进行预处理。

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

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

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

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

 

【NLP】第9章 匹配分词器和数据集_第1张图片图 9.1:transformer 数据集的最佳实践

如图 9.1所示,质量控制分为训练时的预处理阶段(步骤 1 )变压器和变压器生产时的质量控制(步骤2)。

让我们来看看预处理阶段的一些主要方面。

第 1 步:预处理

拉斐尔等人。(2019) 推荐在训练模型之前预处理数据集,我添加了一些额外的想法。

变形金刚成了语言学习者,我们成了他们的老师。但是要教机器学生一门语言,例如,我们必须解释什么是正确的英语。

我们需要在使用数据集之前将一些标准启发式方法应用于数据集:

  • 带有标点符号的句子

    建议选择以句号或问号等标点符号结尾的句子。

  • 删除坏话

    坏话应该去掉。可以在以下站点找到列表,例如:https ://github.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words 。

  • 删除代码

    这很棘手,因为有时代码就是我们要寻找的内容。但是,通常最好从 NLP 任务的内容中删除代码。

  • 语言检测

    有时,网站包含带有默认“lorem ipsum”文本的页面。有必要确保所有数据集的内容都使用我们希望的语言。一个很好的开始方法是使用langdetect,它可以检测 50 多种语言:https ://pypi.org/project/langdetect/ 。

  • 删除对歧视的提及

    这是必须的。我的建议是建立一个知识库,其中包含您可以在网络上抓取的所有内容或您可以掌握的特定数据集。禁止任何形式的歧视。您当然希望您的机器符合道德标准!

  • 逻辑检查

    它可能在执行自然语言推理NLI ) 以过滤没有意义的句子的数据集上运行经过训练的转换器模型是一个好主意。

  • 不良信息参考

    删除涉及无效链接、不道德网站或人员的文本。这是一项艰巨的工作,但肯定是值得的。

此列表包含一些主要的最佳实践。但是,还需要更多,例如过滤违反隐私法和针对特定项目的其他行为。

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

第 2 步:质量控制

一个训练有素的模型会表现得像一个学习语言的人。它会明白它能做什么并从输入数据中学习。输入数据应经历与步骤 1 相同的过程:预处理并将新信息添加到训练数据集中。反过来,训练数据集可以成为企业项目中的知识库。用户将能够在数据集上运行 NLP 任务并获得问题的可靠答案、特定文档的有用摘要等。

我们应该将步骤 1:预处理中描述的最佳实践应用于实时输入数据。例如,转换器可以根据用户的输入或 NLP 任务运行,例如汇总文档列表。

Transformer 是有史以来最强大的 NLP 模型。这意味着我们的道德责任也得到了加强。

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

  • 实时检查输入文本

    不接受不良信息。相反,实时解析输入并过滤不可接受的数据(参见步骤 1)。

  • 实时消息

    存储被拒绝的数据及其被过滤的原因,以便用户可以查阅日志。如果要求变压器回答不合适的问题,则显示实时消息。

  • 语言转换

    如果可能,您可以将稀有词汇转换为标准词汇。请参阅本章中 Word2Vec 标记化部分的案例这并不总是可能的。如果是这样,它可能代表向前迈进了一步。

  • 隐私检查

    无论您是将数据流式传输到转换器模型还是分析用户输入,必须从数据集和任务中排除私有数据,除非得到转换器运行所在的用户或国家/地区的授权。这是一个棘手的话题。必要时咨询法律顾问。

我们刚刚经历了一些最佳实践。现在让我们看看为什么人工质量控制是强制性的。

持续的人工质量控制

Transformers 将逐步接管大部分复杂的 NLP 任务。然而,人类干预仍然是强制性的。我们认为社交媒体巨头已经实现了一切自动化。然后我们发现有内容管理者决定什么对他们的平台有利或不利。

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

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

【NLP】第9章 匹配分词器和数据集_第2张图片

图 9.2:持续的人工质量控制

我们有经历了Raffel等人描述的几个最佳实践。(2019),我根据自己在企业 AI 项目管理方面的经验添加了一些指导。

让我们来看一个 Python 程序,其中包含一些使用标记器遇到的一些限制的示例。

Word2Vec 标记化

只要事情进展顺利,没有人会考虑预训练的分词器。就像在现实生活中一样。我们可以多年驾驶汽车而不考虑发动机。然后,有一天,我们的车抛锚了,我们试图找出原因来解释这种情况。

预训练的标记器也是如此。有时结果不是我们所期望的。例如,一些单词对不适合在一起,如图 9.3 所示

【NLP】第9章 匹配分词器和数据集_第3张图片图 9.3:分词器计算错误的词对

 

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

  • cake并且chapters不适合在一起,尽管分词器将它们计算为具有高余弦相似度值。
  • freedom例如,指言论自由。copyright指的是免费电子书的编辑写的注释。
  • paybill配合日常英语。polysemy是一个词可以有多种含义的时候。例如,Bill表示要支付的金额,但也指Bill of Rights. 结果是可以接受的,但这可能是纯粹的运气。

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

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

在一个战略性人工智能项目中,“糟糕的结果”可能是一个具有严重后果的错误(尤其是在医疗领域、飞机或火箭组装或其他关键领域)。

Open Tokenizer.ipynb,基于positional_encoding.ipynb我们在第 2 章“ Transformer 模型架构入门”中创建的。

由于 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:不在数据集或字典中的单词

一个缺少单词意味着麻烦很多方面。在这种情况下,我们将corporations和发送rights到相似度函数:

#@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]标记。

如果这个词很重要,那么缺失的词会引发一系列事件和问题,从而扭曲变压器模型的输出。我们将缺少的单词称为unk

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

  • unk在数据集中,但未选择在标记化字典中。
  • unk不在数据集中,单词corporations. 这解释了为什么在这种情况下它不在字典中。
  • unk如果用户向包含令牌的转换器发送输入并且它没有被令牌化,那么现在将出现在生产中。
  • unk不是数据集的重要词,而是变压器的使用。

如果变压器在某些情况下产生可怕的结果,问题列表将继续增长。我们可以认为0.8变压器模型在训练阶段针对特定下游任务的出色性能。但在现实生活中,谁愿意使用 20% 的时间出错的系统:

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

0.8在像社交媒体这样的模糊环境中是令人满意的,其中许多消息无论如何都缺乏适当的语言结构。

现在是最糟糕的部分。假设一个 NLP 团队发现了这个问题并尝试使用字节级 BPE 来解决它,就像我们在本书中一直在做的那样。如有必要,请花几分钟时间返回第 4 章从头开始预训练 RoBERTa 模型第 3 步:训练分词器。

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

  • unk将被分解成单词片段。例如,我们最终可能会corporations变成corporations。这些令牌中的一个或几个很有可能在数据集中找到。
  • unk将成为由存在于数据集中但不传达原始标记含义的标记表示的一组子词。
  • 变压器会很好地训练,没有人会注意到它unk被打成碎片并毫无意义地训练。
  • 变压器甚至可能产生出色的结果并将其性能0.80.9.
  • 在专业用户在危急情况下应用错误结果之前,每个人都会鼓掌。例如,在英语中,corp可以表示corporationcorporalcorp这可能会在和 其他词之间造成混淆和不良关联。

我们可以看到,社交媒体的标准可能足以将变压器用于琐碎的话题。但在现实生活中的企业项目中,要产生一个经过预训练的标记器,匹配数据集。在现实生活中,数据集每天都会随着用户输入而增长。用户输入成为应定期训练和更新的模型数据集的一部分。

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

  • 使用字节级 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指的是Project Gutenberg对其网站上每本电子书的前言,如本章的匹配数据集和标记器部分所述。变压器针对特定任务的目标是什么:

  • 了解编者的序言?
  • 还是要了解书的内容?

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

declaration是一个与《独立宣言》的实际内容相关的有意义的词。

etext古腾堡计划添加到其所有电子书中的序言的一部分。

这有可能当要求转换器生成文本时,会产生错误的自然语言推断,例如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不在文本文件中。

因此,我们应该在管道中有功能来检测字典中没有的单词以实现更正或替代。此外,我们应该在管道中有功能来检测数据集中可能很重要的单词。

让我们看看我们面临的生僻字问题。

案例四:生僻字

生僻字对超出简单应用程序的特定任务的变压器输出产生破坏性影响。

管理稀有词扩展到自然语言的许多领域。例如:

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

例如,在这种情况下,我们使用这个词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世纪初的《大宪章》中提取了它。不幸的是,程序会变得混乱,每次运行后我们都会得到意想不到的结果。

注意:预测可能因一次运行而异。但是,它们表明我们在转换器模型项目的标记化和嵌入阶段必须非常小心。

然而,《大宪章》中的一些条款在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.

要是我们在律师事务所实施变压器模型总结文件或其他任务,我们必须小心!

现在让我们看看我们可以用来解决罕见单词问题的一些方法。

案例5:替换生僻词

替换生僻词本身就代表了一个项目。这项工作是为特定的任务和项目保留的。假设公司预算可以支付拥有知识库的成本例如,在航空领域。在这种情况下,值得花必要的时间查询标记化目录以查找它遗漏的单词。

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

案例 4中,我们偶然发现了这个词justiciar。如果我们回到它的起源,我们可以看到它来自法语诺曼语,是法语拉丁词的词根judicaire

我们可以用 替换这个词justiciarjudge它传达了相同的元概念:

#@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。此外,如果我们正在管理一个重要的法律项目,我们可以将包含任何稀有词的基本文件翻译成标准英语。因此,Transformer 在 NLP 任务中的表现会提高,公司的知识库也会逐渐增加。

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

案例 6:权利要求

在这个情况下,我们对字典中的单词感兴趣,并以固定的顺序对其进行测试。

例如,让我们看看“ pay”+“ debt”在我们的相似度函数中是否有意义:

#@title Case 6: Entailment
word1="pay";word2="debt"
print("Similarity",similarity(word1,word2),word1,word2)

结果令人满意:

Similarity [[0.89891946]] pay debt

我们可以用几个词对检查数据集,并检查它们是否意味着什么。例如,这些词对可以从法律部门的电子邮件中提取。如果余弦相似度高于0.9,则电子邮件可能会被删除无用信息,并将内容添加到公司的知识库数据集中。

现在让我们看看经过良好预训练的标记器如何与 NLP 任务匹配。

具有特定词汇的标准 NLP 任务

本节重点介绍案例 4:稀有词案例 5:替换本章Word2Vec 标记化部分的稀有词。

我们将使用,这是我们在第 7 章使用 GPT-3 引擎Training_OpenAI_GPT_2_CH09.ipynb训练数据集的笔记本的重命名版本。

对笔记本进行了两项更改:

  • dset,数据集已重命名mdset并包含医疗内容
  • 添加了一个 Python 函数来控制使用字节级 BPE 标记的文本

我们不会描述Training_OpenAI_GPT_2_CH09.ipynb,我们在第 7 章使用 GPT-3 引擎的超人变形金刚的崛起,以及附录 III 和 IV中介绍过。确保在开始之前上传必要的文件,如第 7 章所述。

您希望训练模型的时间没有限制。中断它以保存模型。

这些文件位于 GitHubgpt-2-train_files目录中的Chapter09尽管我们使用与第 7 章相同的笔记本,但请注意,数据集 ,dset现在mdset在目录和代码中命名。

首先,让我们使用经过训练以理解医学内容的 GPT-2 模型生成一个无条件样本。

使用 GPT-2 生成无条件样本

我们将在本节中深入了解变压器的内部工作原理。当然,我们可以跳过整章,直接使用 OpenAI API。然而,一个 4.0 的 AI 专家必须成为 AI 大师,才能展示,而不是模糊地告诉 Transformer 通过预处理管道建模做什么。为了向变压器模型展示要做什么,有必要了解变压器模型的工作原理。

案例 4:稀有词案例 5:替换稀有词中,我们看到稀有词可能是特定领域中使用的词、古英语、世界各地英语的变体、俚语等。

2020 年,新闻充斥着与 COVID-19 爆发有关的医学术语。在本节中,我们将看到 GPT-2 转换器如何处理医学文本。

用于编码和训练的数据集包含Martina ConteNadia Loy (2020) 的论文,名为Multi-cue kinetic model with non-local sensing for cell migration on a fiber network with趋化性

标题本身并不容易理解,并且包含生词。

加载位于gpt-2-train_files目录中的文件,包括mdset.txt. 然后运行代码,如第 7 章使用 GPT-3 引擎的超人变形金刚崛起中所述您可以使用第 7 章指导您逐个单元格地运行此代码。请特别注意遵循说明以确保tf 1.x已激活。确保运行Step 4,然后重新启动运行时,然后再次运行Step 4 tf 1.x单元格,然后再继续。否则,您将在笔记本中收到错误消息。我们正在着手使用本节中的低级原始 GPT-2 代码,而不是 API。

后在医学数据集上训练模型,您将到达无条件样本单元,步骤 11:生成无条件样本

#@title Step 11: Generating Unconditional Samples
import os # import after runtime is restarted
os.chdir("/content/gpt-2/src")
!python generate_unconditional_samples.py --model_name '117M'

运行此命令和此笔记本中的其他代码所需的时间取决于您机器的功率。此笔记本和所有其他 GPT-2 代码在本书中仅用于教育目的。建议在生产中使用 OpenAI 的 API for GPT-3。变压器项目的响应时间更快。

运行单元格并在需要时停止它。它将产生一个随机输出:

community-based machinery facilitates biofilm growth. Community members place biochemistry as the main discovery tool to how the cell interacts with the environment and thus with themselves, while identifying and understanding all components for effective Mimicry.
2. Ol Perception
Cytic double-truncation in phase changing (IP) polymerases (sometimes called "tcrecs") represents a characteristic pattern of double-crossing enzymes that alter the fundamental configuration that allows initiation and maintenance of process while chopping the plainNA with vibrational operator. Soon after radical modification that occurred during translational parasubstitution (TMT) achieved a more or less uncontrolled activation of SYX. TRSI mutations introduced autophosphorylation of TCMase sps being the most important one that was incorporated into cellular double-triad (DTT) signaling across all
cells, by which we allow R h and ofcourse an IC 2A- >
.../...

如果我们仔细查看输出,我们会注意到以下几点:

  • 生成的句子结构相对可以接受
  • 输出的语法还不错
  • 对于非专业人士来说,输出可能看起来像人类

但是,内容毫无意义。转换器无法产生真实的内容与我们训练的医学论文有关。获得更好的结果需要努力。当然,我们总是可以增加数据集的大小。但它会包含我们正在寻找的东西吗?我们能找到更多数据的错误相关性吗?例如,想象一个涉及 COVID-19 的医疗项目,其数据集包含以下句子:

  • COVID-19 is not a dangerous virus, but it is like ordinary flu.
  • COVID-19 is a very dangerous virus.
  • COVID-19 is not a virus but something created by a lab.
  • COVID-19 was certainly not created by a lab!
  • Vaccines are dangerous!
  • Vaccines are lifesavers!
  • Governments did not manage the pandemic correctly.
  • Governments did what was necessary.

还有诸如此类的更矛盾的句子。这些差异证实,数据集和标记器都必须针对专业的医疗保健项目、航空、交通和其他关键领域进行定制。

想象一下,您有一个包含数十亿字的数据集,但内容如此冲突和嘈杂,以至于无论您尝试什么都无法获得可靠的结果!

这可能意味着数据集必须更小,并且仅限于科学论文的内容。但即便如此,科学家们也常常意见不一。

结论是,要产生可靠的结果,需要大量的努力和坚实的团队。

现在让我们尝试调节 GPT-2 模型。

生成经过训练的条件样本

在这个部分,我们移动到笔记本的第 12 步:交互式上下文和完成示例单元格并运行它:

#@title Step 12: Interactive Context and Completion Examples
import os # import after runtime is restarted
os.chdir("/content/gpt-2/src")
!python interactive_conditional_samples.py --temperature 0.8 --top_k 40 --model_name '117M' --length 50

工业 4.0 人工智能专家将较少关注代码,而更多地关注如何向变压器模型展示该做什么。每个模型都需要一定程度的显示要做什么,而不仅仅是使用无条件的数据来告诉它模糊地做某事。

我们通过输入医学论文的一部分来调节 GPT-2 模型:

During such processes, cells sense the environment and respond to external factors that induce a certain direction of motion towards specific targets (taxis): this results in a persistent migration in a certain preferential direction. The guidance cues leading to directed migration may be biochemical or biophysical. Biochemical cues can be, for example, soluble factors or growth factors that give rise to chemotaxis, which involves a mono-directional stimulus. Other cues generating mono-directional stimuli include, for instance, bound ligands to the substratum that induce haptotaxis, durotaxis, that involves migration towards regions with an increasing stiffness of the ECM, electrotaxis, also known as galvanotaxis, that prescribes a directed motion guided by an electric field or current, or phototaxis, referring to the movement oriented by a stimulus of light [34]. Important biophysical cues are some of the properties of the extracellular matrix (ECM), first among all the alignment of collagen fibers and its stiffness. In particular, the fiber alignment is shown to stimulate contact guidance [22, 21]. TL;DR:

我们TL;DR在输入文本的末尾添加了 : 来告诉 GPT-2 模型总结我们所使用的文本。输出在语法和语义上都有意义:

the ECM of a single tissue is the ECM that is the most effective.
To address this concern, we developed a novel imaging and immunostaining scheme that, when activated, induces the conversion of a protein to its exogenous target

由于输出是不确定的,我们也可以得到这个响应:

Do not allow the movement to be directed by a laser (i.e. a laser that only takes one pulse at a time), but rather a laser that is directed at a target and directed at a given direction. In a nutshell, be mindful.

结果更好,但需要更多的研究。

这我们可以从这个例子和章节中得出的结论是,例如,在大量随机网络爬取数据上预训练 Transformer 模型将教 Transformer 英语。但是,和我们一样,Transformer 也需要在特定领域接受培训,才能成为该领域的专家。

让我们进一步调查并控制标记化数据。

控制标记化数据

本节将读取使用其预训练标记器编码的 GPT-2 模型的第一个单词。

运行单元时,请先停止一个单元,然后再运行下一个单元。

我们将转到本章中使用Additional Tools: Controlling Tokenized Data的笔记本的单元格。Training_OpenAI_GPT_2_CH09.ipynb此单元格已添加到本章的笔记本中。

单元格首先解压缩out.npz,其中包含数据集中的编码医学论文mdset

#@title Additional Tools : Controlling Tokenized Data
#Unzip out.npz
import zipfile
with zipfile.ZipFile('/content/gpt-2/src/out.npz', 'r') as zip_ref:
    zip_ref.extractall('/content/gpt-2/src/')

out.npz解压后,我们可以读取包含我们正在寻找的编码数据集arr_0.npy的数组:NumPy

#Load arr_0.npy which contains encoded dset
import numpy as np
f=np.load('/content/gpt-2/src/arr_0.npy')
print(f)
print(f.shape)
for i in range(0,10):
    print(f[i])

输出是数组的前几个元素:

[1212 5644  326 ...   13  198 2682]

我们现在将打开encoder.json并将其转换为 Python 字典:

#We first import encoder.json
import json
i=0
with open("/content/gpt-2/models/117M/encoder.json", "r") as read_file:
    print("Converting the JSON encoded data into a Python dictionary")
    developer = json.load(read_file) #converts the encoded data into a Python dictionary
    for key, value in developer.items(): #we parse the decoded json data
        i+=1
        if(i>10):
            break;
        print(key, ":", value)

最后,我们500显示我们编码数据集的第一个标记的键和值:

#We will now search for the key and value for each encoded token
    for i in range(0,500):
        for key, value in developer.items():
            if f[i]==value:
                print(key, ":", value)

的第一句话mdset.txt如下:

This suggests that

我添加了这些词以确保 GPT-2 预训练的标记器能够轻松识别它们,情况就是这样:

This : 1212
Ġsuggests : 5644
Ġthat : 326

我们可以很容易地识别出以初始空白字符 ( ) 开头的初始标记Ġ。但是,让我们在医学论文中使用以下单词:

amoeboid

amoeboid是一个罕见的词。我们可以看到 GPT-2 分词器将其分解为子词:

Ġam : 716
o : 78
eb : 1765
oid : 1868

让我们跳过空白处,看看发生了什么。amoeboid已经变成了am++++我们必须同意没有未知的token o:。这是由于使用了字节级 BPE 策略。eboid.[unk]

然而,transformer 的注意力层可能会关联:

  • am与其他序列,如I am
  • o任何被拆开并包含的o序列
  • oid另一个包含 的序列oid,可能tabloid有一些算法

这根本不是好消息。让我们用以下的话进一步说明这一点:

amoeboid and mesenchymal

输出清楚地显示and。至于其余的,令牌令人困惑:

Ġam : 716
o : 78
eb : 1765
oid : 1868
Ġand : 290
Ġmes : 18842
ench : 24421
ym : 4948
al : 282

您可能想知道为什么这是一个问题。原因可以用一个词来概括:多义。如果我们使用 word2vec 分词器,字典可能不包含诸如 的稀有词amoeboid,我们会想出一个未知的词。

如果我们使用字节级 BPE,我们会获得整体更好的结果,因为我们排除了相同单词的更少变体,例如goand going

然而,amtoken inamoeboid将多义性带入了低层次的问题。am可以是一种前缀,可以是 + 中的单词,也可以是+amIam子词。注意力层可以将一个令牌与另一个令牌相关联,从而创建不存在的关系。这定义了 NLU 中多义的核心问题。ambushamam

我们可以说正在取得进展,但我们需要更加努力地改进 NLP。

我们已经通过一些例子解决了我们在现实项目中面临的许多日常问题。花点时间尝试一些你认为有用的例子。

在我们离开之前,我们将使用一个探测任务来验证 Transformer 模型提供的 NLU 级别。

探索 GPT-3 的范围

即使是最强大的变压器,如 OpenAI GPT-3,也有其局限性。让我们看看 GPT-3 是如何反应的to the word amoeboid,这个词比主流词更接近医学术语。我们在许多项目中都需要技术术语。匹配数据集需要对转换器如何组织其字典和嵌入进行质量控制。

我们人类可以发现错误并纠正某人。例如,在本章中,我们探讨了本章控制标记化数据部分中amoeboid的词。

我们先问GPT-3是什么amoeboid意思:

【NLP】第9章 匹配分词器和数据集_第4张图片

图 9.4:询问 GPT-3 “变形虫”是什么意思

amoeboid(类似于变形虫)是一个形容词,但 GPT-3 在输出中声明它是一个名词:

A: Amoeboid is a noun which means "resembling an amoeba"

然后我们问 GPT-3 一个更精确的问题,但仍然得到一个不正确的答案:

Q: Is amoeboid a noun or an adjective?
A: Amoeboid is a noun.

最后,我们坚持要求明确定义,得到正确答案:

Q: What does amoeboid mean in medical terms? 
A: Amoeboid means "resembling an amoeba".

定义是准确的,尽管语法分析不准确。

更重要的是在现实生活中的项目中重要吗?理解一个词的定义或将其在句子中的作用确定为形容词或名词?

一个词的定义对于一个医疗项目来说就足够了。在这种情况下,GPT-3 可能就足够了。如果定义足够,SRL 就不是理解句子的先决条件。

也许语法方面对于教育文法学校项目很重要,但对于企业供应链、金融和电子商务应用程序则不重要。

OpenAI GPT-3 在这两种情况下都可以进行微调,正如我们在第 7 章使用 GPT-3 引擎的超人变形金刚的崛起”中看到的那样。

本节的结论是,我们必须确保在经过训练的变压器模型中拥有我们需要的所有数据。否则,标记化过程将不完整。也许我们应该拿一本医学词典,并创建一个包含该特定词汇的大型医学文章语料库。然后,如果模型仍然不够准确,我们可能需要对数据集进行标记并从头开始训练模型。

2022 年的开发人员将有更少的开发工作,但仍然需要进行大量的思考和设计!

现在让我们结束本章并继续执行另一个 NLU 任务。

概括

在本章中,我们测量了标记化和后续数据编码过程对 Transformer 模型的影响。Transformer 模型只能处理来自堆栈的嵌入和位置编码子层的令牌。模型是编码器-解码器、仅编码器还是仅解码器模型都没有关系。数据集是否足以训练并不重要。

如果标记化过程失败,即使是部分失败,我们正在运行的转换器模型将丢失关键标记。

我们首先看到,对于标准语言任务,原始数据集可能足以训练一个转换器。

然而,我们发现,即使预训练的分词器已经处理了十亿个单词,它也只能创建一个字典,其中包含它遇到的一小部分词汇。像我们一样,分词器捕捉它正在学习的语言的本质,并且只记住最重要的词,如果这些词也经常使用。这种方法适用于标准任务,但会产生特定任务和词汇的问题。

然后,我们在许多想法中寻找一些想法来解决标准标记器的限制。我们应用了一种语言检查方法来调整我们希望处理的文本,例如分词器如何思考和编码数据。

我们使用 GPT-2 将该方法应用于无条件和有条件的任务。

最后,我们分析了使用 GPT-3 进行数据标记和匹配数据集的局限性。您可以从本章中学到的教训是,人工智能专家会在这里待上相当长的一段时间!

在下一章,基于 BERT 的 Transformers 的语义角色标签中,我们将深入研究 NLU,并使用 BERT 模型让 Transformer 解释句子的含义。

你可能感兴趣的:(深度学习(DL),自然语言处理(NLP))