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

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

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

Case 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,则可以剥离邮件中的无用信息,并将内容添加到公司的知识库数据集中。

现在让我们看看预训练的分词器与自然语言处理任务的匹配情况。

具有特定词汇的标准自然语言处理任务

本节重点介绍了本章节中Word2Vec tokenization部分的Case 4: Rare wordsCase 5: Replacing rare words

我们将使用Training_OpenAI_GPT_2_CH09.ipynb,这是我们在Chapter 7中使用的笔记本的重命名版本,The Rise of Suprahuman Transformers with GPT-3 Engines

笔记本有两处更改:

  • dset,数据集,被重命名为mdset,并包含医学内容
  • 添加了一个 Python 函数来控制使用字节级 BPE 分词的文本

我们不会描述第七章中所涵盖的Training_OpenAI_GPT_2_CH09.ipynb,以及附录 III 和 IV。确保在开始之前上传所需的文件,就像第七章中所解释的那样。

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

文件位于Chapter09gpt-2-train_files目录中的 GitHub 上。尽管我们使用的是第七章中相同的笔记本,但要注意数据集dset在目录和代码中现在被命名为mdset

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

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

在这一节中,我们将亲自动手来理解变换器的内部工作原理。当然,我们可以跳过整个章节,简单地使用 OpenAI API。然而,一个 4.0 的 AI 专家必须成为 AI 大师,通过预处理管道展示,而不是模糊地告诉变换器模型要做什么。为了展示一个变换器模型要做什么,必须了解变换器模型的工作原理。

案例 4:罕见词语案例 5:替换罕见词语中,我们看到罕见词语可以是在特定领域中使用的词语,古老的英语,世界各地英语的变体,俚语等。

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

要编码和训练的数据集包含了Martina ConteNadia Loy(2020 年)撰写的一篇论文,名称为具有非局部感知的多线索动力学模型用于细胞在具有趋化作用的纤维网络上的迁移

标题本身并不容易理解,包含了一些罕见的词语。

加载位于gpt-2-train_files目录中的文件,包括mdset.txt。然后按照第七章中所述运行代码。您可以逐个单元格地运行此代码,第七章会给出指导。务必按照说明确保激活tf 1.x。在运行第 4 步之后,务必重新启动运行时,然后再次运行第 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 的 GPT-3 API。对于变换器项目,响应时间更快。

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

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- >
.../... 

仔细观察输出,我们注意到以下几点:

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

但是内容毫无意义。Transformers无法产生与我们训练的医学论文相关的真实内容。要获得更好的结果需要艰苦的工作。当然,我们总是可以增加数据集的规模。但它是否包含我们正在寻找的内容呢?我们是否会找到更多数据中的错误相关性呢?例如,想象一下一个涉及 COVID-19 的医疗项目,数据集包含以下句子:

  • COVID-19 不是危险的病毒,而只是像普通流感一样
  • COVID-19 是一种非常危险的病毒
  • COVID-19 不是一种病毒,而是实验室创造出的东西
  • COVID-19 肯定不是由实验室创造的!
  • 疫苗是危险的!
  • 疫苗是救命稻草!
  • 政府没有正确管理疫情
  • 政府采取了必要的措施

以及更多类似这样矛盾的句子。这些不一致性证实了数据集和分词器都必须为专业的医疗保健项目、航空航天、交通运输和其他关键领域进行定制。

想象一下,你有数十亿字的数据集,但内容如此矛盾和嘈杂,无论你如何尝试,都无法得到可靠的结果!

这可能意味着数据集必须更小,限制在科学论文的内容上。但即便如此,科学家们对彼此之间也常常意见不一。

结论是,要产生可靠的结果需要大量的辛勤工作和一支牢固的团队。

现在让我们尝试对 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 人工智能专家将更少地关注代码,更多地关注如何展示Transformers模型做什么。每个模型都需要一定程度的指导,而不仅仅是使用无条件的数据来模糊地告诉它做某事。

我们通过输入医学论文的一部分来对 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. 

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

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

让我们进一步调查并控制分词化的数据。

控制分词化的数据

本节将读取 GPT-2 模型使用其预训练分词器编码的前面词语。

运行单元格时,在运行后续单元格之前停止一个单元格。

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

该单元首先解压 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 + o+ eb + oid。我们必须同意,没有未知的标记:[unk]。这是由于使用了字节级 BPE 策略。

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

  • 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,我们会得到更好的结果,因为我们排除了更少的同一单词的变体,比如 gogo + ing

然而,amoeboid 中的 am 标记在低级别带来了多义性的问题。am 可以是一种前缀,像 I + am 中的 am,或者像 am + bush 中的子词。注意层可能会将一个标记的 am 关联到另一个 am,从而创建不存在的关系。这定义了自然语言理解中多义性的核心问题。

我们可以说进展正在取得,但我们需要更努力地改进自然语言处理。

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

在我们离开之前,我们将使用一个探测任务来验证Transformers模型提供的自然语言理解水平。

探索 GPT-3 的范围

即使是像 OpenAI GPT-3 这样最强大的转换器也有它们的局限性。让我们看看 GPT-3 如何对待 amoeboid 这个词,它更接近于医学术语而不是主流词汇。在许多项目中,我们需要技术术语。匹配数据集需要质量控制来确保转换器如何组织其字典和嵌入。

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

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


图 9.4:询问 GPT-3 “amoeboid” 的含义

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 可能已经足够了。如果定义已经足够,那么语义角色标注不是理解句子的先决条件。

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

OpenAI GPT-3 在两种情况下都可以进行微调,正如我们在 第七章GPT-3 引擎的超人类转变 中所看到的那样。

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

一个 2022 年的开发者将会有较少的开发工作,但仍然需要大量思考和设计!

现在让我们结束本章,转向另一个 NLU 任务。

总结

在本章中,我们衡量了标记化和后续数据编码过程对转换器模型的影响。一个转换器模型只能关注堆栈中的嵌入和位置编码子层中的标记。这个模型是编码器-解码器、仅编码器还是仅解码器模型并不重要。数据集看起来足够好训练也不重要。

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

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

但是,我们发现,即使预训练的标记化器经过了十亿字的训练,它只会创建一个很小的词汇表,其中包含了它遇到的词汇的一小部分。像我们一样,标记化器捕捉到了它正在学习的语言的本质,只有这些词汇也经常被使用,它才会记住最重要的词汇。这种方法对于标准任务效果很好,但在特定任务和词汇方面会出现问题。

然后,我们寻找了一些想法,其中之一是解决标准标记化器的限制。我们应用了一种语言检查方法,以适应我们希望处理的文本,比如一个标记化器思考和编码数据的方式。

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

最后,我们分析了数据标记化和匹配数据集与 GPT-3 的限制。从这一章可以得到的教训是,AI 专家将在相当长的一段时间内存在!

在下一章中,基于 BERT 的Transformers的语义角色标注,我们将深入探讨 NLU,并使用 BERT 模型要求Transformers解释句子的含义。

问题

  1. 一个标记化的字典包含了语言中存在的每一个单词。(真/假)
  2. 预训练的标记化器可以对任何数据集进行编码。(真/假)
  3. 在使用数据库之前检查数据库是一个好的做法。(真/假)
  4. 从数据集中清除淫秽数据是一个好的做法。(真/假)
  5. 删除包含歧视性言论的数据是一个好的做法。(真/假)
  6. 原始数据集有时可能产生嘈杂内容和有用内容之间的关系。(真/假)
  7. 一个标准的预训练标记化器包含了过去 700 年的英语词汇。(真/假)
  8. 老式英语可能在用现代英语训练的标记化器对数据进行编码时产生问题。(真/假)
  9. 医学和其他类型的行话可能在用现代英语训练的标记化器对数据进行编码时产生问题。(真/假)
  10. 控制预训练标记化器产生的编码数据的输出是一个好的做法。(真/假)

参考资料

加入我们书籍的 Discord 空间。

加入该书的 Discord 工作区,与作者进行每月的问我任何活动。

www.packt.link/Transformers

相关文章
|
2月前
|
存储 人工智能 自然语言处理
Transformers 自然语言处理(五)(2)
Transformers 自然语言处理(五)
49 0
|
2月前
|
存储 自然语言处理 算法
Transformers 自然语言处理(四)(3)
Transformers 自然语言处理(四)
52 0
|
2天前
|
自然语言处理 PyTorch API
`transformers`库是Hugging Face提供的一个开源库,它包含了大量的预训练模型和方便的API,用于自然语言处理(NLP)任务。在文本生成任务中,`transformers`库提供了许多预训练的生成模型,如GPT系列、T5、BART等。这些模型可以通过`pipeline()`函数方便地加载和使用,而`generate()`函数则是用于生成文本的核心函数。
`transformers`库是Hugging Face提供的一个开源库,它包含了大量的预训练模型和方便的API,用于自然语言处理(NLP)任务。在文本生成任务中,`transformers`库提供了许多预训练的生成模型,如GPT系列、T5、BART等。这些模型可以通过`pipeline()`函数方便地加载和使用,而`generate()`函数则是用于生成文本的核心函数。
7 0
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
Transformers 自然语言处理(一)(2)
Transformers 自然语言处理(一)
45 3
|
2月前
|
存储 机器学习/深度学习 自然语言处理
Transformers 自然语言处理(一)(3)
Transformers 自然语言处理(一)
44 2
|
2月前
|
机器学习/深度学习 存储 自然语言处理
Transformers 自然语言处理(一)(1)
Transformers 自然语言处理(一)
42 2
|
2月前
|
人工智能 自然语言处理 数据可视化
Transformers 自然语言处理(四)(1)
Transformers 自然语言处理(四)
15 1
|
2月前
|
人工智能 自然语言处理 数据可视化
Transformers 自然语言处理(五)(1)
Transformers 自然语言处理(五)
27 0
|
2月前
|
人工智能 自然语言处理 算法
Transformers 自然语言处理(四)(4)
Transformers 自然语言处理(四)
30 0
|
2月前
|
人工智能 自然语言处理 数据可视化
Transformers 自然语言处理(四)(2)
Transformers 自然语言处理(四)
15 0