赞
踩
原文:
zh.annas-archive.org/md5/a1e65552fc41f3b5a667f63d9bed854c
译者:飞龙
在 2020 年,Brown 等人(2020)描述了一个包含 1750 亿个参数的 OpenAI GPT-3 模型的训练,该模型使用了诸如从 Common Crawl 数据中提取的 4000 亿个字节对编码的令牌等庞大的数据集进行了学习。OpenAI 在一个拥有 285,000 个 CPU 和 10,000 个 GPU 的 Microsoft Azure 超级计算机上进行了训练。
OpenAI 的 GPT-3 引擎的机器智能和超级计算机使 Brown 等人(2020)进行了零次实验。这个想法是使用一个训练好的模型进行下游任务,而不需要进一步训练参数。目标是让一个训练好的模型直接进入多任务生产,使用甚至可以执行它没有经过训练的任务的 API。
超人类云 AI 引擎的时代已经到来。OpenAI 的 API 不需要高级软件技能或 AI 知识。你可能想知道为什么我使用了“超人类”这个词。你会发现,在许多情况下,GPT-3 引擎可以执行许多任务,就像人类一样。目前,理解 GPT 模型是如何构建和运行的是至关重要的。
本章将首先研究Transformers模型的架构和规模的演变。我们将探讨使用经过训练的Transformers模型进行零次调优的挑战,对模型的参数进行几乎没有或没有任何调优的下游任务。我们将探讨 GPT Transformers模型的创新架构。OpenAI 提供了他们模型的特别训练版本,称为引擎。
我们将使用 OpenAI 仓库中的 TensorFlow 中的 345M 参数的 GPT-2 Transformers。我们必须亲自动手去理解 GPT 模型。我们将与模型进行交互,以生成通用调节句子的文本补全。
我们将继续使用一个 117M 参数的定制 GPT-2 模型。我们将对我们在第四章,从零开始预训练 RoBERTa 模型中使用的高级概念 Kant
数据集进行标记化。
该章节将探讨使用一个不需要数据科学家、人工专家甚至是经验丰富的开发人员就可以开始使用的 GPT-3 引擎。然而,这并不意味着在今后不会需要数据科学家或人工智能专家。
我们将看到 GPT-3 引擎有时确实需要微调。我们将运行一个 Google Colab 笔记本来微调一个 GPT-3 Ada 引擎。
该章节将以工业 4.0 AI 专家的新思维方式和技能集结束。
在本章结束时,你将了解到一个 GPT 模型是如何构建的,以及如何使用无缝的 GPT-3 API。你将理解到在 2020 年代,一个工业 4.0 的 AI 专家可以完成令人满意的任务!
本章涵盖以下主题:
开始使用 GPT-3 模型
OpenAI GPT 模型的架构
定义零次训练的Transformers模型
从少次到一次的路径
构建一个接近人类的 GPT-2 文本补全模型
实现一个 345M 参数的模型并运行它
与一个标准模型交互使用 GPT-2
训练一个具有 117M 参数模型的语言建模 GPT-2
导入一个定制的特定数据集
对一个定制数据集进行编码
对模型进行条件调节
条件转换一个 GPT-2 模型以执行特定的文本完成任务
对一个 GPT-3 模型进行微调
工业 4.0 人工智能专家的角色
让我们通过探索 GPT-3 转换器模型开始我们的旅程。
GPT-3 建立在 GPT-2 架构之上。然而,一个完全训练的 GPT-3 转换器是一个基础模型。基础模型可以执行许多它没有训练过的任务。GPT-3 完成应用于所有 NLP 任务甚至编程任务。
GPT-3 是少数几个符合基础模型资格的完全训练的转换器模型之一。GPT-3 毫无疑问将产生更强大的 OpenAI 模型。Google 将为其在超级计算机上训练的 Google BERT 版本之外的基础模型提供更多。基础模型代表了对人工智能的一种新思考方式。
公司很快就会意识到,他们不需要数据科学家或人工智能专家才能开始一个具有像 OpenAI 提供的 API 那样的 NLP 项目。
为什么还要麻烦使用任何其他工具?拥有访问世界上最强大的超级计算机之一上训练过的最有效的转换器模型之一的 OpenAI API。
如果存在只有深腰包和世界上最好的研究团队才能设计的 API,比如 Google 或 OpenAI,为什么要开发工具、下载库或使用任何其他工具?
对于这些问题的答案非常简单。启动 GPT-3 引擎就像启动一辆一级方程式赛车或印第 500 赛车一样简单。没问题。但是,要驾驶这样的车几乎是不可能的,如果没有几个月的培训!GPT-3 引擎是强大的人工智能赛车。你可以通过几次点击让它们运行。然而,要掌握它们令人难以置信的动力需要你从本书的开始到现在所学到的知识,以及你将在接下来的章节中发现的东西!
我们首先需要了解 GPT 模型的架构,以了解开发者、人工智能专家和数据科学家在超人类 NLP 模型时代的定位。
在 2017 年底至 2020 年初的不到三年时间里,转换器模型从训练、微调,最终到零冲击模型。零冲击 GPT-3 转换器模型不需要微调。训练的模型参数不会为下游多任务更新,这为 NLP/NLU 任务开启了一个新时代。
在本部分中,我们将首先了解设计 GPT 模型的 OpenAI 团队的动机。我们将从零冲击模型的微调开始。然后我们将看到如何使一个转换器模型调节以生成令人惊叹的文本完成。最后,我们将探索 GPT 模型的架构。
我们首先将了解 OpenAI 团队的创建过程。
Transformers从用于自然语言处理任务的小型模型迅速发展到几乎不需要微调的模型的速度令人震惊。
瓦斯瓦尼等人(2017 年)介绍了Transformers,它在 BLEU 任务中超越了 CNN 和 RNN。 拉德福德等人(2018 年)引入了生成式预训练(GPT)模型,可以通过微调执行下游任务。 德夫林等人(2019 年)通过 BERT 模型完善了微调。 拉德福德等人(2019 年)进一步推出了 GPT-2 模型。
布朗等人(2020 年)定义了一个 GPT-3 零-shot 方法来处理Transformers,不需要微调!
同时,王等人(2019 年)创建了 GLUE 来评估自然语言处理模型。但是Transformers模型发展如此迅速,以至于超过了人类基线!
王等人(2019 年,2020 年)迅速创建了 SuperGLUE,将人类基线设定得更高,并使得 NLU/NLP 任务更具挑战性。Transformers发展迅速,一些模型在写作时已经超越了 SuperGLUE 排行榜上的人类基线。
这是如何如此迅速地发生的?
我们将研究一个方面,即模型的大小,以了解这种演变是如何发生的。
仅在 2017 年至 2020 年,参数数量就从原始Transformers模型的 65M 个增加到了 GPT-3 模型的 175B 个,如表 7.1所示:
Transformers模型 | 论文 | 参数 |
---|---|---|
Transformers基础 | 瓦斯瓦尼等人(2017 年) | 65M |
Transformers大型 | 瓦斯瓦尼等人(2017 年) | 213M |
BERT-Base | 德夫林等人(2019 年) | 110M |
BERT-Large | 德夫林等人(2019 年) | 340M |
GPT-2 | 拉德福德等人(2019 年) | 117M |
GPT-2 | 拉德福德等人(2019 年) | 345M |
GPT-2 | 拉德福德等人(2019 年) | 1.5B |
GPT-3 | 布朗等人(2020 年) | 175B |
表 7.1:Transformers参数数量的演变
表 7.1只包含了那个短时间内设计的主要模型。出版日期在实际设计模型的日期之后。此外,作者还更新了论文。例如,一旦原始Transformers启动了市场,谷歌 Brain、OpenAI 和 Facebook AI 等机构都推出了新模型。
此外,一些 GPT-2 模型比较较小的 GPT-3 模型还要大。例如,GPT-3 Small 模型包含 125M 个参数,比 345M 参数的 GPT-2 模型小。
架构大小同时也在演变:
一个模型的层数从原始Transformers模型的 6 层增加到了 GPT-3 模型的 96 层
一个层的头数从原始Transformers模型的 8 个增加到了 GPT-3 模型的 96 个
原始Transformers模型的上下文大小从 512 个令牌增加到了 GPT-3 模型的 12,288 个令牌
模型架构的规模解释了为什么具有 96 层的 GPT-3 175B 模型比只有 40 层的 GPT-2 1,542M 模型产生了更令人印象深刻的结果。这两种模型的参数可比拟,但层数倍增了。
让我们关注一下上下文大小,以了解 transformer 的快速演变的另一个方面。
transformer 模型的基础在于注意力子层。而注意力子层的关键属性则是处理上下文大小的方法。
上下文大小是人类和机器学习语言的主要方式之一。上下文大小越大,我们就能越好地理解呈现给我们的序列。
然而,上下文大小的缺点是理解一个词所指内容所需的距离。分析长期依赖性所需的路径需要从循环转换为注意力层。
以下句子需要经过很长的路径才能找到“它”所指的内容:
“我们的房子太小了,无法容纳一张大沙发,一张大桌子和我们想在如此小的空间中放置的其他家具。我们考虑过留下一段时间,但最终决定把它卖掉。”
如果要解释“它”的意思,只有在回到句子开头的“房子”一词时才能理解。这对于机器来说是一段相当长的路径!
定义最大路径长度的函数顺序如 Big O 表 7.2 中所示:
层类型 | 最大路径长度 | 上下文大小 |
---|---|---|
自注意力 | 0(1) | 1 |
循环 | 0(n) | 100 |
表 7.2:最大路径长度
Vaswani 等人(2017)对原始 Transformer 模型中的上下文分析设计进行了优化。自注意力将操作缩减为一对一的标记操作。所有层都相同,这使得扩大 transformer 模型的规模变得更加容易。具有 100 个上下文窗口大小的 GPT-3 模型具有与大小为 10 的上下文窗口大小相同的最大长度路径。
例如,RNN 中的一个循环层必须逐步存储整个上下文的长度。最大路径长度就是上下文大小。处理 GPT-3 模型的上下文大小的 RNN 的最大长度大小将是 0(n) 倍长。此外,RNN 无法将上下文分割成 96 个在并行化机器架构上运行的头,例如将操作分布在 96 个 GPU 上。
transformer 的灵活和优化的架构对其他几个因素产生了影响:
Vaswani 等人(2017)训练了一个包含 36M 个句子的最新 transformer 模型。Brown 等人(2020)则从 Common Crawl 数据中提取了 4000 亿字节对编码的标记来训练 GPT-3 模型。
训练大型 transformer 模型需要世界上一小部分团队才拥有的计算机实力。Brown 等人(2020)训练 GPT-3 175B 需要总共 2.14*10²³ FLOPS。
设计转换器的架构需要高素质的团队,这些团队只能由世界上少数机构资助。
大小和架构将继续发展,可能在不久的将来增加到万亿参数模型。超级计算机将继续提供必要的资源来训练转换器。
我们现在将看到零-shot 模型是如何实现的。
从一开始,由Radford等人(2018 年)带领的 OpenAI 研究团队就希望把转换器从经过训练的模型转变为 GPT 模型。其目标是在未标记数据上训练转换器。让注意层从无监督数据中学习语言是一个聪明的举措。OpenAI 决定训练转换器学习语言,而不是教会它们执行特定的 NLP 任务。
OpenAI 希望创建一个任务无关的模型。因此,他们开始对原始数据进行转换器模型的训练,而不是依赖专家标记的数据。标记数据耗时,并且显著减慢了转换器的训练过程。
第一步是从一个转换器模型的无监督训练开始。然后,他们只会对模型进行监督学习的微调。
OpenAI 选择了在“叠加解码层”部分描述的只解码转换器。结果的度量是令人信服的,并很快达到了同行 NLP 研究实验室最佳 NLP 模型水平。
第一个版本的 GPT 转换器模型的有希望的结果很快就促使Radford等人(2019 年)提出了零-shot 转移模型。他们的核心哲学是继续训练 GPT 模型从原始文本中学习。然后,他们进一步深入研究,聚焦于通过无监督分布的语言建模示例:
示例=(x[1], x[2], x[3], ,x[n])
示例由符号序列组成:
序列=(s[1], s[2], s[3], ,s[n])
这导致了一个可以表示为任何类型输入的概率分布的元模型:
p (输出/输入)
目标是一旦训练的 GPT 模型通过深入训练理解了语言,就将这个概念推广到任何类型的下游任务。
GPT 模型从 117M 参数迅速发展到 345M 参数,然后到其他大小,然后到 1,542M 参数。10 亿+参数的转换器诞生了。微调量急剧减少。结果再次达到了最先进的指标。
这鼓励 OpenAI 更进一步,更远。Brown等人(2020 年)假设有条件概率转换器模型可以进行深度训练,并且能够在几乎不进行进一步微调的情况下产生出色的结果:
p (输出/多任务)
OpenAI 正在实现其目标,即训练模型,然后直接运行下游任务,而无需进一步微调。这一巨大的进步可以分为四个阶段:
微调(FT)是指按照我们在之前章节探讨过的方式进行。一个Transformers模型被训练,然后在下游任务上进行微调。Radford等人(2018 年)设计了许多微调任务。然后,OpenAI 团队在接下来的步骤中逐渐将任务数减少到0
。
少样本(FS)代表了一个巨大的进步。GPT 已经训练好了。当模型需要进行推理时,它会以任务的演示为条件。条件替代了权重更新,GPT 团队在过程中排除了这一步骤。我们将通过我们在本章中将要进行的笔记本中提供的上下文来对我们的模型进行条件设定,以获得文本完成。
单样本(1S)将进程推至更远。训练后的 GPT 模型仅需要一个下游任务的演示来表现。同时也不允许进行权重更新。
零样本(ZS)是最终目标。训练后的 GPT 模型在没有演示所需下游任务的情况下进行表现。
这些方法各自具有不同的效率水平。OpenAI GPT 团队已经努力开发出这些最先进的Transformers模型。
现在我们可以解释导致 GPT 模型架构的动机:
教授Transformers模型如何通过广泛的培训学习语言。
通过上下文条件对语言建模进行重点关注。
Transformers以一种新颖的方式接受上下文并生成文本完成。它不会浪费资源学习下游任务,而是致力于理解输入并进行推理,无论任务是什么。
找到训练模型的高效方法,通过掩盖输入序列的部分来迫使Transformers以机器智能的方式进行思考。因此,尽管不是人类,但机器智能是高效的。
我们了解到了导致 GPT 模型架构的动机。现在让我们来看看仅解码器层的 GPT 模型。
现在我们明白了 OpenAI 团队专注于语言建模。因此,保留掩盖注意力子层是有意义的。因此,选择保留解码器堆叠并排除编码器堆叠的选择。Brown等人(2020 年)显著增加了仅解码器Transformers模型的规模,取得了出色的结果。
GPT 模型的结构与Vaswani等人(2017 年)设计的原始Transformers的解码器堆栈相同。我们在第二章中描述了解码器的堆栈,开始使用Transformers模型的架构。如果需要的话,请花几分钟回顾一下原始Transformers的架构。
GPT 模型具有仅解码器的架构,如图 7.1所示:
图 7.1:GPT 仅解码器架构
我们可以识别文本和位置嵌入子层、蒙版多头自注意层、规范化子层、前馈子层和输出。此外,还有一种同时进行文本预测和任务分类的 GPT-2 版本。
OpenAI 团队通过模型定制和调整了解码模型。Radford 等人(2019)给出了至少四种 GPT 模型,Brown 等人(2020)描述了至少八种模型。
GPT-3 175B 模型已经达到了很少团队可以访问的独特规模,需要大量的计算资源:
n[参数] = 175.0B,n[层数] = 96,d[模型] = 12288,n[头] = 96
让我们看看越来越多的 GPT-3 引擎。
GPT-3 模型可以被训练来完成不同规模的特定任务。目前 OpenAI 记录了可用的引擎列表:beta.openai.com/docs/engines
基本系列的引擎具有不同的功能 - 例如:
达芬奇引擎能够分析复杂意图
居里引擎速度快,具有很好的摘要能力
巴比奇引擎擅长语义检索
阿达引擎擅长解析文本
OpenAI 正在生产更多的引擎投放市场:
Instruct 系列根据描述提供指令。此章节的 更多 GPT-3 示例 中有一个例子可供参考。
Codex 系列可以将语言翻译成代码。我们将在 第十六章 Transformer 驱动合作伙伴的出现 中探索这个系列。
内容过滤系列可以过滤不安全或敏感的文本。我们将在 第十六章 Transformer 驱动合作伙伴的出现 中探索这个系列。
我们已经探索了从微调到零样本 GPT-3 模型的过程。我们已经看到 GPT-3 可以生成各种引擎。
现在是时候看看 GPT 模型的源代码是如何构建的。尽管目前 GPT-3 Transformers模型的源代码并不公开,但 GPT-2 模型已经足够强大,可以理解 GPT 模型的内部工作原理。
我们已经准备好与 GPT-2 模型进行交互和训练。
我们首先将使用训练好的 GPT-2 345M 模型进行文本完成,它包括 24 个解码层和 16 个自注意子层的自注意。
然后,我们将对 12 个解码层和 12 个自注意层的 GPT-2 117M 模型进行定制文本完成训练。
让我们首先与一个预训练的 345M 参数 GPT-2 模型进行交互。
我们将从上到下探讨使用 GPT-2 通用模型的例子。我们要运行的例子的目标是确定 GPT 模型能达到的抽象推理水平。
本节描述了与 GPT-2 模型进行文本完成的交互。我们将重点关注 OpenAI_GPT_2.ipynb 中详细描述的 附录 III 中的 使用 GPT-2 进行通用文本完成的第 9 步。
你可以先阅读本节,看看通用预训练的 GPT-2 模型对特定示例的反应如何。然后阅读 附录 III,使用 GPT-2 进行通用文本补全,以深入了解通用 GPT-2 模型如何在 Google Colab 笔记本中实现。
你也可以直接阅读 附录 III,其中包含下面描述的 Step 9 的交互。
首先,让我们了解应用预训练 GPT-2 的具体示例。
在本节中,我们将与 GPT-2 345M 模型进行交互。
要与模型交互,请运行 interact_model
单元格:
#@title Step 9: Interacting with GPT-2
interact_model('345M',None,1,1,300,1,0,'/content/gpt-2/models')
你将被提示输入一些上下文:
图 7.2:文本补全的上下文输入
你可以尝试任何类型的上下文,因为这是一个标准的 GPT-2 模型。
我们可以尝试一句由康德写的句子:
Human reason, in one sphere of its cognition, is called upon to
consider questions, which it cannot decline, as they are presented by
its own nature, but which it cannot answer, as they transcend every
faculty of the mind.
按下 Enter 生成文本。由于 GPT-2 模型未在我们的数据集上进行训练,并且我们无论如何都在运行随机模型,因此输出将相对随机。
让我们看看我运行时 GPT 模型生成的前几行:
"We may grant to this conception the peculiarity that it is the only causal logic.
In the second law of logic as in the third, experience is measured at its end: apprehension is afterwards closed in consciousness.
The solution of scholastic perplexities, whether moral or religious, is not only impossible, but your own existence is blasphemous."
要停止单元格,请双击单元格的运行按钮。
你还可以按下 Ctrl + M 停止生成文本,但这可能会将代码转换为文本,你将不得不将其复制回程序单元格。
输出丰富。我们可以观察到几个事实:
我们输入的上下文 条件了 模型生成的输出。
上下文是模型的演示。它从上下文中学习要说什么,而不修改其参数。
文本补全受上下文条件限制。这为不需要微调的转换器模型打开了大门。
从语义角度来看,输出可能更有趣。
从语法角度来看,输出是令人信服的。
我们能做得更好吗?下一节介绍了自定义文本补全的交互。
在本节中,我们将继续采用自上而下的方法,探讨一个在特定数据集上训练的 GPT-2 自定义模型的示例。目标仍然是确定 GPT 模型可以达到的抽象推理水平。
本节描述了与特定数据集训练的 GPT-2 模型进行文本补全的交互。我们将重点放在详细描述在 附录 IV 中的 Training_OpenAI_GPT_2.ipynb 笔记本中的 Step 12,即 自定义文本补全与 GPT-2。
你可以先阅读本节,看看带有自定义 GPT-2 模型的示例将如何改进响应。然后阅读 附录 IV,自定义文本补全与 GPT-2,以了解如何训练 GPT-2 来获得特定的响应。
你也可以决定直接阅读 附录 IV,其中也包含下面描述的 Step 12 的交互。
首先,让我们了解通过训练 GPT-2 改进的交互方式。
现在我们将运行一个有条件的样本。我们输入的上下文将导致模型按照我们想要的方式思考,通过生成定制的段落来完成文本。
运行单元格并探索魔法:
#@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'
如果需要,可以花几分钟回到附录 III的第 9 步,与 GPT-2 交互,以查看响应的差异。该程序提示我们输入上下文:
图 7.3:文本补全的上下文输入
让我们输入与易卢泊儿·康德所写的相同段落,就像我们在本章的通用 GPT-2 的文本补全部分的第 9 步中所做的那样:
Human reason, in one sphere of its cognition, is called upon to
consider questions, which it cannot decline, as they are presented by
its own nature, but which it cannot answer, as they transcend every
faculty of the mind.
按Enter生成文本,就像我们之前所做的那样。尽管结构化和逻辑,但输出可能会因为每次运行而有所不同,这使得Transformers很有吸引力。这一次,结果并不是随机的,而是令人印象深刻的。
让我们来看看 GPT-2 模型生成的前几行:
"Now, what is the nature of the reason, except that it is of a kind and power of mind that is so called on to think, and to understand?
The reason is the thing which apprehends, and seeks to understand, the objects of its minds, which apprehend and apprehend the things of itself. No one can speak of this reason without the understanding and the understanding of the human reason. But that knowledge and understanding which is the most natural of all the faculties, which, because it is understood by the human reason, is the most natural of all the faculties, is not without reason, but only without understanding. The human reason, who sees and knows the things which the natural sense, which, though in the natural sense, does not understand, is the source of every other knowledge which we understand. The reason is the thing which does not understand, but understands the things which we comprehend, and therefore, is not to be understood. I mean that the reason is the thing which does not understand, but knows only the things which we do understand…."
要停止运行单元格,请双击单元格的运行按钮或按下Ctrl + M。
哇!我怀疑有人能看出我们训练过的 GPT-2 模型生成的文本补全和人类的区别。它也可能在每次运行时生成不同的输出。
实际上,我认为我们的模型在哲学、推理和逻辑的抽象练习中,可能会超越许多人类!
我们可以从我们的实验中得出一些结论:
经过良好训练的Transformers模型能以人类水平产生文本补全
在复杂和抽象推理中,GPT-2 模型几乎可以达到人类水平的文本生成能力
文本背景是通过演示预期结果的一种有效的方式来给模型制定条件
文本补全是基于文本条件的文本生成,如果提供了上下文的句子。
您可以输入条件文本背景示例来尝试文本补全。您还可以使用自己的数据来训练模型。只需用自己的数据替换dset.txt
文件的内容,看看会发生什么!
请记住我们训练过的 GPT-2 模型会像人类一样反应。如果您输入一个简短、不完整、无趣或棘手的上下文,您将得到困惑或糟糕的结果。这是因为 GPT-2 希望我们做到最好,正如现实生活中一样!
让我们去 GPT-3 playground 看看训练过的 GPT-3 对使用 GPT-2 测试的示例做出何种反应。
在本节中,我们将以两种不同的方式运行 GPT-3:
我们将首先在线运行 GPT-3 任务而不需要任何代码
然后我们将在 Google Colab 笔记本中实现 GPT-3
在本书中我们将使用 GPT-3 引擎。当您注册 GPT-3 API 时,OpenAI 会提供您一个免费的预算来开始使用。这个免费预算应该足以覆盖这本书中示例的大部分成本,如果不是全部。
让我们从在线运行 NLP 任务开始。
我们现在将不使用 API 直接向 GPT-3 提出要求,让我们来看看一些工业 4.0 的例子。
让我们定义一种提示和回应的标准结构,如下:
N = NLP 任务的名称(输入)。
E = GPT-3 引擎的解释。E 在 T 之前(输入)。
T = 我们希望 GPT-3 查看的文本或内容(输入)。
S = 显示给 GPT-3 期望的内容。S 在必要时跟随 T 并添加(输入)。
R = GPT-3 的回应(输出)。
上述提示的结构是一个指南。然而,GPT-3 非常灵活,有许多变体可行。
我们现在准备在线运行一些教育示例,无需 API:
现有知识的问题与答案(Q&A):
E = Q
T = 1965 年美国总统是谁?
S = 无
R = A
提示和回答:
Q: 1965 年美国总统是谁?
A: 1965 年林登·约翰逊是美国总统。
Q: 谁是第一个登上月球的人类?
A: 尼尔·阿姆斯特朗是第一个登上月球的人类。
电影到表情符号:
E = 一些电影标题的示例
T = 无
S = 通过例子隐含
R = 一些表情符号的示例
提示和回答:
新的提示和回答:
给二年级学生总结(给二年级学生总结):
E = 我的二年级孩子问我这段话是什么意思:
T = """初始结论……。"""
S = 我用通俗易懂的语言给他解释了一下:"""
R = 摘要
提示和回答:
我的二年级孩子问我这段话是什么意思:
"""初始结论可以分为两类:事实和虚构。事实是 OpenAI 拥有世界上最强大的自然语言处理服务之一。主要事实是:OpenAI 引擎是强大的零-shot,无需寻找各种Transformers模型,无需预训练和微调。用于训练模型的超级计算机是独一无二的。如果提示设计得当,我们会得到令人惊讶的准确响应。在本节中实施 NLP 任务需要执行复制粘贴操作,任何软件初学者都可以执行。虚构从反乌托邦和炒作的断言开始,AI 将取代数据科学家和 AI 专家。这是真的吗?在回答这个问题之前,首先问问自己关于我们刚刚运行的示例的以下问题:我们如何知道句子起初是错误的?如果没有我们人类读取和确认,我们如何知道答案是正确的?引擎是如何知道这是一个语法校正任务的?如果响应不正确,我们如何理解发生了什么以帮助改进提示或在设计良好的人机界面中恢复手动模式?事实是人类将需要手动干预来回答这些问题,使用基于规则的方法、质量控制自动流水线以及许多其他工具。事实是令人信服的。运行 NLP 任务确实需要很少的开发。虚构不令人信服。人类仍然是必需的。OpenAI 引擎并不是为了取代人类,而是为了帮助他们执行更多高水平的令人满足的任务。现在你可以驾驶喷气机而不必自己建造它!"""
我为他重新表述了一下,用小学二年级孩子都能理解的简单语言:"""
OpenAI 的第一个结论是,它拥有世界上最强大的自然语言处理服务之一。最重要的事实是:OpenAI 引擎非常强大,零-shot,无需寻找各种Transformers模型,无需预训练和微调。用于训练模型的超级计算机是独一无二的。如果提示设计得当,我们会得到令人惊讶的准确响应。
结果令人印象深刻,是自然语言处理历史上的一大进步。
我们可以使用由 OpenAI 提供的零-shot GPT-3 引擎实现的 NLP 任务的数量是无穷无尽的,因为我们控制着如何展示我们对Transformers模型的期望。
然而,真正的行业 4.0 人工智能专家必须在使用即用型 API 之前先动手。我们现在将探索 OpenAI GPT 模型的架构,然后构建 GPT-2 模型,看看这些引擎是如何工作的。
我们对 GPT 模型了解得越多,行业 4.0 的自然语言处理专家就越能将它们应用到现实项目中。
让我们继续我们的自上而下的方法,深入研究 OpenAI GPT Transformers模型的架构。
OpenAI 拥有世界上一些最强大的Transformers引擎。一个 GPT-3 模型可以执行数百个任务。GPT-3 可以完成许多它没有接受训练的任务。
本节将在Getting_Started_GPT_3.ipynb
中使用 API。
要使用 GPT-3,您必须首先转到 OpenAI 的网站openai.com/
并注册。
OpenAI 为每个人提供了一个试验场,就像 Google 翻译或任何用户友好型在线服务一样。因此,让我们尝试一些任务。
让我们从几个步骤开始使用 GPT-3。
转到 Google Colab 并打开 GitHub 上书籍的章节目录Getting_Started_GPT_3.ipynb
。
您无需更改笔记本的设置。我们正在使用一个 API,因此在本节中不需要太多的本地计算能力。
本节的步骤与笔记本中的步骤相同。
运行 NLP 分为三个简单的步骤:
使用以下命令安装openai
:
try:
import openai
except:
!pip install openai
import openai
如果未安装openai
,则必须重新启动运行时。当需要这样做时,会显示一条消息,如下所示:
重新启动运行时,然后再次运行此单元格,以确保已导入openai
。
提供了一个可以在 Python、C#、Java 和许多其他选项中使用的 API 密钥。在本节中,我们将使用 Python:
openai.api_key=[YOUR API KEY]
您现在可以使用您的 API 密钥更新下一个单元格:
import os
import openai
os.environ['OPENAI_API_KEY'] ='[YOUR_KEY or KEY variable]'
print(os.getenv('OPENAI_API_KEY'))
openai.api_key = os.getenv("OPENAI_API_KEY")
现在让我们运行一个 NLP 任务。
我们复制并粘贴了一个 OpenAI 的语法校正任务示例:
response = openai.Completion.create(
engine="davinci",
prompt="Original: She no went to the market.\nStandard American English:",
temperature=0,
max_tokens=60,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=["\n"]
)
任务是纠正这个语法错误:She no went to the market
。
我们可以通过解析来按需处理响应。OpenAI 的响应是一个字典对象。OpenAI 对象包含了有关任务的详细信息。我们可以要求该对象显示:
#displaying the response object
print(response)
我们可以探索对象:
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"text": " She didn't go to the market."
}
],
"created": 1639424815,
"id": "cmpl-4ElZfXLl9jGRNQoojWRRGof8AKr4y",
"model": "davinci:2020-05-03",
"object": "text_completion"}
“创建”的编号和“id”,以及“model”名称在每次运行时都可能会有所不同。
然后,我们可以要求对象字典显示“text
”,并打印处理后的输出:
#displaying the response object
r = (response["choices"][0])
print(r["text"])
字典中的“text
”的输出是语法正确的句子:
She didn't go to the market.
现在我们将介绍一种工业化的 GPT-3 引擎使用方法。例如,OpenAI 提供了一个交互式教育界面,不需要 API。因此,一个学校教师、顾问、语言学家、哲学家或任何希望将 GPT-3 引擎用于教育目的的人都可以这样做,而且完全不需要 AI 方面的经验。
我们首先将在笔记本中使用 API。
如果我们回到Getting_Started_GPT_3.ipynb
,我们可以在本章的开始使用 GPT-3 引擎部分开始探索的内容中,用不同的提示语试验语法校正。
打开笔记本,转到步骤 4:示例 1:语法校正:
#Step 6: Running an NLP task with custom parameters
response = openai.Completion.create(
#defult engine: davinci
engine="davinci",
#default prompt for task:"Original"
prompt="Original: She no went to the market.\n Standard American English:",
temperature=0,
max_tokens=60,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=["\n"]
)
请求体不限于提示。请求体包含几个关键参数:
engine="davinci"
。选择要使用的 OpenAI GPT-3 引擎,以及将来可能的其他模型。
temperature=0
。像0.9
这样的较高值会促使模型更冒险。不要同时修改 temperature 和top_p
。
max_tokens=60
。响应的最大 token 数。
top_p=1.0
。另一种控制抽样的方法,类似于temperature
。在这种情况下,top_p
的百分比的 token 概率质量将被考虑。0.2
会使系统仅考虑 20%的最高概率质量。
frequency_penalty=0.0
。值介于0
和1
之间,限制了给定响应中 token 的频率。
presence_penalty=0.0
。值介于0
和1
之间,强制系统使用新 token 并产生新想法。
stop=["\n"]
。向模型发出停止生成新 token 的信号。
这些参数中的一些在附录 III,使用 GPT-2 进行通用文本完成中的步骤 7b-8:导入和定义模型部分以源代码级别进行描述。
如果你获得访问权限,你可以在 GPT-3 模型中或在附录 III,使用 GPT-2 进行通用文本完成中的 GPT-2 模型中玩弄这些参数。在这两种情况下概念是相同的。
本节将专注于提示:
`prompt="Original: She no went to the market.\n Standard American English:"`
提示可以分为三个部分:
原始:
这表明模型接下来将处理的是原始文本,模型将对其进行某种处理
她没去市场。\n
:提示的这部分向模型表明这是原始文本
标准美式英语
:这向模型显示了期望的任务是什么
让我们看看通过改变任务我们能达到什么程度:
标准美式英语产生:
prompt="原始:她没去市场。\n 标准美式英语:"
响应中的文本是:
"text": " 她没去市场。"
那很好,但如果我们不想要句子中的缩写呢?
不带缩写的英语产生:
prompt="原始:她没去市场。\n 不带缩写的英语:"
响应中的文本是:
"text": " 她没有去市场。"
哇!这很令人印象深刻。让我们尝试另一种语言。
没有缩写的法语产生:
"text": " 她没有去市场。"
这很令人印象深刻。\u00e9
只需进行后处理成é
。
还有更多选项可供选择。您的工业 4.0 跨学科想象力是极限!
OpenAI 包含许多示例。OpenAI 提供了一个在线平台来探索任务。OpenAI 还为每个示例提供了源代码:beta.openai.com/examples
点击一个示例,比如我们在语法纠错部分探讨过的语法示例:
图 7.4:OpenAI 的语法纠错部分
OpenAI 将为每个任务描述提示和样本响应。
图 7.5:样本响应纠正了提示
你可以选择去游乐场在线运行,就像我们在本章的 在线运行 NLP 任务 部分中所做的那样。要这样做,请单击 在游乐场中打开 按钮:
图 7.6:游乐场按钮中的 Open
你可以选择复制并粘贴代码来运行 API,就像我们在本章的 Google Colab 笔记本中所做的那样:
图 7.7:使用 Davinci 引擎运行代码
Getting_Started_GPT_3.ipynb
包含了十个示例,你可以运行以练习实现 OpenAI GPT-3。
对于每个示例:
首先,你可以阅读由 OpenAI 提供的解释链接。每个单元格上方都提供了文档链接。
你可以运行单元格以观察 GPT-3 的行为。
在笔记本中运行这十个示例:
示例 1:语法纠正
示例 2:英语到法语的翻译
示例 3:提供说明的系列
示例 4:电影到表情符号
示例 5:将编程语言转换为另一种语言。例如,从 Python 到 JavaScript。警告:你可能需要获得 OpenAI 的特别许可才能运行这个示例,该示例使用了 Davinci Codex 引擎,即代码生成器。如果此示例在你的笔记本中无法运行,请联系 OpenAI 请求 Codex 的访问权限。
示例 6:高级推文分类器
示例 7:问答
示例 8:总结一段文本
示例 9:解析非结构化数据
示例 10:计算时间复杂度
你可以在示例页面上运行许多其他任务:beta.openai.com/examples
现在让我们比较一下 GPT-2 和 GPT-3 的输出。
在我们继续之前,我们的好奇心必须得到满足。强大的 GPT-3 模型可以使用我们提交给预训练 GPT-2 模型的示例,然后使用我们自定义训练的 GPT-2 模型产生什么?
我们用于 GPT-2 模型的示例:
`Human reason, in one sphere of its cognition, is called upon to consider questions, which it cannot decline, as they are presented by its own nature, but which it cannot answer, as they transcend every faculty of the mind.`
`GPT-3's response:`
`What is meant by this is that there are some things in our experience that are beyond reason. It is not that reason is a bad guide or is insufficient, but that there are some things that are beyond its reach. An example of this would be the existence of God.`
结果令人震惊!它解释了文本的含义,包括一些深刻的哲学思考!
我们在本章证明了我们的观点。Transformer 模型可以实现抽象推理,这有助于在我们飞速发展的世界中做出微决策。
OpenAI GPT-3 是一个完全训练好的模型。但是,GPT-3 可以进行微调。我们来看看如何进行微调。
本节展示了如何对 GPT-3 进行微调以学习逻辑。Transformer 需要学习逻辑、推理和蕴含,以便以人类水平理解语言。
微调是使 GPT-3 成为你自己应用的关键,是将其定制为适应项目需求的钥匙。这是一个赋予你的应用 AI 自由的机会,以消除偏见,教它你想让它知道的东西,并在 AI 上留下你的足迹。
在本节中,将使用 kantgpt.csv
对 GPT-3 进行 Immanuel Kant 的作品进行训练。我们使用了类似的文件来训练第四章 从头开始预训练 RoBERTa 模型 中的 BERT 类型模型。
一旦掌握了对 GPT-3 进行微调的技巧,就可以使用其他类型的数据来教授它特定领域、知识图和文本。
OpenAI 提供了一个高效、文档完善的服务,可以对 GPT-3 引擎进行微调。它已经训练了 GPT-3 模型,使其成为不同类型的引擎,正如本章中十亿参数Transformers模型的崛起部分所示。
Davinci 引擎功能强大,但使用起来可能更昂贵。Ada 引擎成本较低,并且产生的结果足以在我们的实验中探索 GPT-3。
GPT-3 的微调涉及两个阶段:
准备数据
对 GPT-3 模型进行微调
在 GitHub 章节目录中在 Google Colab 中打开Fine_Tuning_GPT_3.ipynb
。
OpenAI 详细记录了数据准备过程:
beta.openai.com/docs/guides/fine-tuning/prepare-training-data
第 1 步 是安装和导入openai
:
try:
import openai
except:
!pip install openai
import openai
一旦安装完成,请重新启动运行时,然后再次运行单元格,确保已执行import openai
。
import openai
您也可以安装 wand 来可视化日志:
try:
import wandb
except:
!pip install wandb
import wandb
现在我们将输入 API 密钥
第 2 步 是输入您的密钥:
openai.api_key="[YOUR_KEY]"
首先,加载您的文件。在此部分加载kantgpt.csv
。现在,kantgpt.csv
.是一个原始的非结构化文件。OpenAI 有一个内置数据清理器,会在每个步骤问问题。
OpenAI 检测到文件是 CSV 文件,将其转换为JSONL
文件。JSONL
包含纯结构化文本中的行。
OpenAI 跟踪我们批准的所有更改:
Based on the analysis we will perform the following actions:
- [Necessary] Your format 'CSV' will be converted to 'JSONL'
- [Necessary] Remove 27750 rows with empty completions
- [Recommended] Remove 903 duplicate rows [Y/n]: y
- [Recommended] Add a suffix separator ' ->' to all prompts [Y/n]: y
- [Recommended] Remove prefix 'completion:' from all completions [Y/n]: y
- [Recommended] Add a suffix ending '\n' to all completions [Y/n]: y
- [Recommended] Add a whitespace character to the beginning of the completion [Y/n]: y
OpenAI 将转换文件保存为kantgpt_prepared.jsonl
。
我们已经准备好对 GPT-3 进行微调。
您可以将笔记本分成两个独立的笔记本:一个用于数据准备,另一个用于微调。
微调 过程中的第 4 步 为 API 密钥创建了一个os
环境:
import openai
import os
os.environ['OPENAI_API_KEY'] =[YOUR_KEY]
print(os.getenv('OPENAI_API_KEY'))
第 5 步 触发了使用数���准备后保存的 JSONL 文件来微调 OpenAI Ada 引擎:
!openai api fine_tunes.create -t "kantgpt_prepared.jsonl" -m "ada"
OpenAI 有很多请求。
如果您的流程中断,OpenAI 将指示如何继续微调。执行 fine_tunes.follow 指令:
!openai api fine_tunes.follow -i [YOUR_FINE_TUNE]
第 6 步 是与微调模型互动。提示是接近伊曼纽尔·康德可能会说的内容的序列:
!openai api completions.create -m ada:[YOUR_MODEL INFO] "Several concepts are a priori such as"
在您的微调任务结束时,OpenAI 经常显示运行完成任务与[YOUR_MODEL INFO]
的指令。您可以复制并粘贴到一个单元格中(在命令行前加上"!"
)或将您的[YOUR_MODEL INFO]
插入到下一个单元格。
完成结果相当令人信服:
Several concepts are a priori such as the term freedom and the concept of _free will_.substance
我们已经对 GPT-3 进行了微调,这显示了理解Transformers和设计具有 API 的人工智能流程的重要性。让我们看看这如何改变 AI 专家的角色。
简而言之,工业 4.0 开发人员的角色是成为跨学科 AI 专家。开发人员、数据科学家和 AI 专家将逐步学习有关语言学、业务目标、专业专业知识等更多领域。工业 4.0 AI 专家将引导团队具备实践的跨学科知识和经验。
在实施Transformers时,人类专家在三个领域中是必不可少的:
道德和伦理
一个工业 4.0 的 AI 专家确保在实施类似于人类的Transformers时执行道德和伦理实践。例如,欧洲法规严格要求必要时向用户解释自动决策。美国有反歧视法律保护公民免受自动偏见影响。
提示和响应
用户和 UI 开发人员将需要工业 4.0 AI 专家解释如何为 NLP 任务创建正确的提示,展示Transformers模型如何执行任务,并验证响应。
质量控制和理解模型
当模型即使调整超参数后仍不如预期时会发生什么?我们将在第十四章《解释黑匣子Transformers模型》中更深入地探讨这类问题。
初步结论可分为两类:事实和虚构。
一个事实是,OpenAI 拥有全球最强大的 NLP 服务之一。其他事实包括:
OpenAI 引擎是强大的零样本引擎,不需要寻找各种Transformers模型,也不需要预训练和微调。
用于训练模型的超级计算机是独特的
如果提示设计良好,我们可以获得令人惊讶的准确答案
在本章中实施 NLP 任务只需要拷贝和粘贴操作,任何软件初学者都可以执行
许多人相信 AI 将取代数据科学家和 AI 专家。这是真的吗?在回答这个问题之前,首先问问自己关于本章运行的例子的以下问题:
我们如何知道一个句子是不正确的?
我们如何确定一个答案是正确的,而不需要我们人类阅读和确认?
引擎如何知道这是一个语法校对任务?
如果响应不正确,我们如何理解发生了什么,以帮助改进提示或在设计良好的人机界面中恢复手动模式?
实际情况是人类需要手动干预回答这些问题,通过规则基础、质量受控的自动流水线和许多其他工具。
事实令人信服。在许多情况下,使用Transformers运行 NLP 任务只需要很少的开发。
人类仍然是必需的。OpenAI 引擎不是为了取代人类,而是帮助他们执行更多高水平令人满意的任务。现在你可以驾驶喷气式飞机而不必自己建造!
我们需要回答本节提出的激动人心的问题。所以让我们现在探索你在迈向 AI 未来的精彩工业 4.0 角色中的新奇旅程!
让我们总结本章并继续下一个探索!
在本章中,我们发现了超级计算机上训练数十亿参数的Transformers模型的新时代。OpenAI 的 GPT 模型正在将 NLU 推动到大多数 NLP 开发团队的视野之外。
我们看到了 GPT-3 零-shot 模型如何通过 API 进行许多 NLP 任务,甚至可以直接在线进行而无需 API。Google 翻译的在线版本已经为 AI 的主流在线使用铺平了道路。
我们探索了 GPT 模型的设计,这些模型都是构建在原始Transformers的解码器堆叠上的。掩码式注意力子层延续了从左到右训练的思想。然而,计算的绝对能力和随后的自注意力子层使其非常高效。
然后,我们使用 TensorFlow 实现了一个包含 345M 个参数的 GPT-2 模型。目标是与训练模型互动,看看我们能达到什么程度。我们看到所提供的上下文条件了输出。然而,当输入特定来自Kant
数据集的输入时,结果并没有达到预期的结果。
我们对一个包含 117M 个参数的定制数据集进行了训练的 GPT-2 模型。与这个相对较小的训练模型的交互产生了令人着迷的结果。
我们使用 OpenAI 的 API 在线运行了 NLP 任务,并对 GPT-3 模型进行了微调。本章展示了完全预训练的Transformers及其引擎可以在很少有工程师的帮助下自动完成许多任务。
这是否意味着用户将不再需要 AI NLP 开发人员、数据科学家和 AI 专家?而是用户只需将任务定义和输入文本上传到云Transformers模型中,然后下载结果?
不,一点也不意味着。工业 4.0 数据科学家和 AI 专家将演变为强大 AI 系统的领航员。他们的角色将越来越重要,以确保输入是合乎道德和安全的。这些现代化的 AI 飞行员还将了解Transformers是如何构建的,并调整 AI 生态系统的超参数。
在下一章《将Transformers应用于法律和金融文件进行 AI 文本摘要》中,我们将将Transformers模型推到极限,作为多任务模型并探索新的领域。
一种零-shot 方法只需训练参数一次。(True/False)
运行零-shot 模型时进行梯度更新。(True/False)
GPT 模型只有一个解码器堆叠。(True/False)
在本地机器上训练包含 117M 个参数的 GPT 模型是不可能的。(True/False)
不能使用特定数据集训练 GPT-2 模型。(True/False)
不能将 GPT-2 模型调节为生成文本。(True/False)
一个 GPT-2 模型可以分析输入的上下文并生成完成的内容。(True/False)
我们在少于 8 个 GPU 的机器上不能与包含 345M 个参数的 GPT 模型互动。(True/False)
拥有 285,000 个 CPUs 的超级计算机并不存在。(True/False)
拥有成千上万个 GPU 的超级计算机在 AI 中起着决定性的作用。(True/False)
OpenAI 和 GPT-3 引擎: beta.openai.com/docs/engines/engines
BertViz
由 Jesse Vig 创建的 GitHub 仓库: github.com/jessevig/bertviz
OpenAI 的超级计算机: blogs.microsoft.com/ai/openai-azure-supercomputer/
Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin, 2017, Attention is All You Need: arxiv.org/abs/1706.03762
Alec Radford, Karthik Narasimhan, Tim Salimans, Ilya Sutskever, 2018, Improving Language Understanding by Generative Pre-Training: cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
Jacob Devlin, Ming-Wei Chang, Kenton Lee, 和 Kristina Toutanova, 2019, BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding: arxiv.org/abs/1810.04805
Alec Radford, Jeffrey Wu, Rewon Child, David Luan, Dario Amodei, Ilya Sutskever, 2019, Language Models are Unsupervised Multitask Learners: cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf
Tom B. Brown, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplany, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, Amanda Askell, Sandhini Agarwal, Ariel Herbert-Voss, Gretchen Krueger, Tom Henighan, Rewon Child, Aditya Ramesh, Daniel M. Ziegler, Jeffrey Wu, Clemens Winter, Christopher Hesse, Mark Chen, Eric Sigler, Mateusz Litwin, Scott Gray, Benjamin Chess, Jack Clark, Christopher Berner, Sam McCandlish, Alec Radford, Ilya Sutskever, Dario Amodei, 2020, Language Models are Few-Shot Learners: arxiv.org/abs/2005.14165
Alex Wang, Yada Pruksachatkun, Nikita Nangia, Amanpreet Singh, Julian Michael, Felix Hill, Omer Levy, Samuel R. Bowman, 2019, SuperGLUE: A Stickier Benchmark for General-Purpose Language Understanding Systems: w4ngatang.github.io/static/papers/superglue.pdf
Alex Wang, Yada Pruksachatkun, Nikita Nangia, Amanpreet Singh, Julian Michael, Felix Hill, Omer Levy, Samuel R. Bowman, 2019, GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding: arxiv.org/pdf/1804.07461.pdf
OpenAI GPT-2 GitHub 仓库: github.com/openai/gpt-2
N. Shepperd 的 GitHub 仓库:github.com/nshepperd/gpt-2
Common Crawl 数据:commoncrawl.org/big-picture/
加入书籍的 Discord 工作空间,与作者进行每月的 问答环节:
我们在前七章中探索了几个Transformers生态系统的架构训练、微调和使用。在第七章,超人类Transformers的崛起与 GPT-3 引擎中,我们发现 OpenAI 已经开始尝试零样本模型,它们不需要微调、不需要开发,并且可以用几行代码实现。
这样一种演进的基本概念在于Transformers模型如何努力教会机器如何理解语言,并以类似人类的方式表达自己。因此,我们已经从训练模型转变为教会机器语言。
Raffel等人(2019)设计了一个基于简单断言的Transformers元模型:每个自然语言处理问题都可以表示为文本到文本函数。每种类型的自然语言处理任务都需要一些文本上下文,生成一些形式的文本响应。
任何自然语言处理任务的文本到文本表示都提供了一个独特的框架来分析Transformers的方法和实践。这一思想是,通过文本到文本的方法,在训练和微调阶段,Transformers可以通过迁移学习学习一种语言。
Raffel等人(2019)将这种方法命名为Text-To-Text Transfer Transformer。这 5 个 T 成为了T5,一个新模型诞生了。
我们将从 T5 Transformers模型的概念和架构开始本章。然后我们将运用 T5 来总结使用 Hugging Face 模型的文件。
最后,我们将文本到文本的方法转化为 GPT-3 引擎使用的展示和上下文过程。令人惊叹的,虽然不完美,零样本响应超过了人类所能想象的任何事物。
本章涵盖以下主题:
文本到文本Transformers模型
T5 模型的架构
T5 方法论
从训练到学习的Transformers模型的演进
Hugging Face 的Transformers模型
实现一个 T5 模型
对法律文本进行摘要
对金融文本进行摘要
Transformers模型的限制
GPT-3 的使用
我们的第一步将是探索由Raffel等人(2019)定义的文本到文本的方法论。
谷歌的自然语言处理技术革命始于Vaswani等人(2017)的研究,即 2017 年的原始Transformers。《注意力就是一切》颠覆了 30 多年的人工智能信仰,即循环神经网络和卷积神经网络应用于自然语言处理任务。它将我们从自然语言处理/理解的石器时代带到了 21 世纪,这是一个早就应该发生的演进。
第七章,超人类Transformers的崛起与 GPT-3 引擎,总结了谷歌的Vaswani等人(2017)原始Transformers和 OpenAI 的Brown等人(2020)GPT-3 Transformers之间涌现出的第二次革命。原始Transformers专注于性能,以证明注意力是我们处理自然语言处理/理解任务所需要的唯一因素。
OpenAI 的第二次革命,通过 GPT-3,着重将 transformer 模型从微调的预训练模型提升到无需微调的 few-shot 训练模型。第二次革命是为了证明机器可以学习一种语言,并将其应用于下游任务,就像我们人类一样。
要理解 T5 模型代表什么,理解这两次革命是至关重要的。第一次革命是注意力技术。第二次革命是教会机器理解语言(NLU),然后让它像我们一样解决 NLP 问题。
2019 年,Google 的想法与 OpenAI 的想法一致,即将 transformers 从技术考虑的层面提升到自然语言理解的抽象水平。
这些革命变得颠覆性。是时候平静下来,忘记源代码和机器资源,以更高的层次分析 transformers。
Raffel等人(2019)设计了一个概念上的文本到文本模型,然后加以实施。
让我们来看看第二次转换革命的代表:抽象模型。
Raffel等人(2019)以一种目标为先驱们开始了一段旅程:探索统一文本到文本 transformer 的迁移学习的极限。该团队强调他们使用的这种方法从一开始就不会修改原始 Transformer 的基本架构。
在那时,Raffel等人(2019)想要关注概念,而不是技术。因此,他们对产生最新的 transformer 模型没有兴趣,正如我们经常看到的所谓的具有n参数和层的灵丹妙药 transformer 模型。这一次,T5 团队想要找出 transformers 在理解语言方面有多好。
人类学习一种语言,然后通过迁移学习将这些知识应用于各种 NLP 任务。T5 模型的核心概念是寻找一个可以像我们一样做事情的抽象模型。
当我们交流时,我们总是以一个序列(A)开头,然后是另一个序列(B)。B 又成为另一个序列的开始,如图 8.1所示:
图 8.1:沟通的序列到序列的表示
我们还通过音乐与有组织的声音进行交流。我们通过舞蹈与有组织的身体动作进行交流。我们通过绘画以形状和颜色进行表达。
我们通过称为“文本”的一个词或一组词进行语言交流。 当我们试图理解一段文本时,我们在所有方向上都会注意到句子中的所有词。我们尝试衡量每个术语的重要性。当我们不理解一个句子时,我们会专注于一个词并查询句子中的其余关键词,以确定它们的值和我们必须支付的注意力。这定义了 transformer 的注意力层。
花几秒钟,让这个思想深入。看起来似乎非常简单,对吧?然而,推翻围绕 RNN、CNN 及其相应思维过程的旧信念花了 35+ 年的时间!
观察 T5 学习、进步,甚至有时帮助我们更好地思考,这非常迷人!
同时关注序列中所有标记的注意力层的技术革命导致了 T5 概念的革命。
T5 模型可以概括为一个Text-To-Text Transfer Transformer。因此,每个 NLP 任务都被表达为一个文本到文本的问题来解决。
Raffel 等人(2019)仍然有一个问题需要解决:统一任务特定格式。想法是找到一种方法,使每个提交给 transformer 的任务都有一个输入格式。这样,模型参数将用一个文本到文本格式训练所有类型的任务。
谷歌 T5 团队提出了一个简单的解决方案:在输入序列中添加前缀。如果没有一位早已被遗忘的天才发明了前缀,我们在许多语言中都需要成千上万个额外的词汇。例如,如果我们不使用“pre”作为前缀,我们就需要找到词来描述预付款、史前的、前寒武纪等成千上万的其他词。
Raffel 等人(2019)提议向输入序列添加一个前缀。T5 前缀不仅仅是一些 transformer 模型中用于分类的标记或指示器,比如[CLS]
。相反,T5 前缀包含了一个 transformer 需要解决的任务的本质。前缀传达意义,如下面的例子所示,还有其他例子:
translate English to German: + [sequence]
用于翻译,就像我们在第六章的使用 Transformer 进行机器翻译中所做的那样
cola sentence: + [sequence]
用于语言可接受性语料库(CoLA),就像我们在第三章的微调 BERT 模型时使用 BERT transformer 模型时所做的那样
stsb sentence 1:+[sequence]
用于语义文本相似性基准。自然语言推理和蕴含是相似的问题,如第五章的带 Transformer 的下游 NLP 任务中所述
summarize + [sequence]
用于文本摘要问题,就像我们在本章的使用 T5 进行文本摘要部分中所做的那样
我们现在已经得到了一个统一的格式,用于广泛的 NLP 任务,在图 8.2中表达:
图 8.2:统一 transformer 模型的输入格式
统一的输入格式导致了一个Transformers模型,无论要解决什么问题,在T5中都会产生一个结果序列。许多自然语言处理任务的输入和输出已经被统一,如图 8.3所示:
图 8.3:T5 文本到文本框架
统一的处理流程使得可以在广泛的任务中使用相同的模型、超参数和优化器。
我们已经通过了标准的文本到文本输入输出格式。现在让我们来看看 T5 Transformers模型的架构。
Raffel等人(2019 年)专注于设计一个标准的输入格式以获得文本输出。Google T5 团队不希望尝试从原始 Transformer 派生的新架构,如仅包含编码器层的 BERT 样式或仅包含解码器层的 GPT 样式。相反,团队专注于以标准格式定义自然语言处理任务。
他们选择使用我们在第二章中定义的原始 Transformer 模型,正如我们在图 8.4中所看到的:
图 8.4:T5 使用的原始 Transformer 模型
Raffel等人(2019 年)保留了大部分原始 Transformer 架构和术语。但是,他们强调了一些关键方面。此外,他们进行了一些轻微的词汇和功能性的更改。以下列表包含 T5 模型的一些主要方面:
编码器和解码器保留在模型中。编码器和解码器层变成了“块”,子层变成了包含自注意层和前馈网络的“子组件”。在类似 LEGO^®的语言中使用“块”和“子组件”一词,使您可以组装“块”、“片”和组件来构建您的模型。Transformers组件是您可以以许多方式组装的标准构建块。一旦您理解了我们在第二章中介绍的基本构建块,您就可以理解任何Transformers模型的运作方式。
自注意力是“无序的”,意味着它对集合进行操作,正如我们在第二章中看到的那样。自注意力使用矩阵的点积,而不是递归。它探索序列中每个单词与其他单词之间的关系。在进行点积之前,将位置编码添加到单词的嵌入中。
原始 Transformer 将正弦和余弦信号应用于Transformers。或者它使用了学习到的位置编码。T5 使用相对位置编码,而不是将任意位置添加到输入中。在 T5 中,位置编码依赖于自注意力的扩展,以进行成对关系的比较。更多内容,请参见本章的参考文献中的Shaw等人(2018 年)。
位置编码在模型的所有层中共享并重新评估。
我们通过文本对文本方法定义了 T5 Transformers模型输入的标准化。
现在让我们使用 T5 来总结文档。
NLP 总结任务提取了文本的简洁部分。本节将首先介绍我们在本章中将要使用的 Hugging Face 资源。然后我们将初始化一个 T5-large Transformers模型。最后,我们将看到如何使用 T5 来总结任何文档,包括法律和公司文件。
让我们开始介绍 Hugging Face 的框架。
Hugging Face 设计了一个高级别实现Transformers的框架。我们在第三章中使用 Hugging Face 来微调 BERT 模型,并在第四章中训练了一个 RoBERTa 模型。
为了扩展我们的知识,我们需要探索其他方法,例如第六章中的 Trax 和第七章中的 OpenAI 模型。本章将再次使用 Hugging Face 框架,并更多地解释在线资源。我们以 GPT-3 引擎的独特潜力结束本章。
Hugging Face 在其框架内提供了三个主要资源:模型、数据集和指标。
在本小节中,我们将选择将在本章中实现的 T5 模型。
可以在 Hugging Face 模型页面上找到各种模型,就像我们在图 8.5中看到的那样:
图 8.5:Hugging Face 模型
在这个页面上,huggingface.co/models
,我们可以搜索一个模型。在我们的情况下,我们正在寻找t5-large,一个我们可以在 Google Colaboratory 中顺利运行的模型。
我们首先键入T5
来搜索 T5 模型,并获取我们可以选择的 T5 模型列表:
图 8.6:搜索 T5 模型
我们可以看到原始 T5 Transformers中提供了几种模型,其中包括:
基础,是基线模型。它的设计与 BERT[BASE]类似,有 12 层和大约 2.2 亿个参数
small,一个更小的模型,有 6 层和 6 千万参数
large的设计类似于具有 12 层和 7.7 亿参数的 BERT[LARGE]
3B和11B使用 24 层的编码器和解码器,大约有 28 亿和 110 亿个参数
要了解更多关于 BERT[BASE]和 BERT[LARGE]的描述,您现在或以后可以花几分钟在第三章中查看这些模型。
在我们的情况下,我们选择t5-large:
图 8.7:如何使用 Hugging Face 模型
图 8.7 展示了我们将要编写的代码中如何使用该模型。我们还可以查看模型中的文件列表和基本配置文件。我们在本章的 初始化 T5-large transformer 模型 部分将查看配置文件。
Hugging Face 还提供了数据集和指标:
数据集可用于训练和测试您的模型:huggingface.co/datasets
指标资源可用于测量您的模型的性能:huggingface.co/metrics
数据集和指标是自然语言处理的经典方面。在本章中,我们不会实现这些数据集或指标。相反,我们将专注于如何实现任何文本摘要。
让我们从初始化 T5 transformer 模型开始。
在本小节中,我们将初始化一个 T5-large 模型。打开以下笔记本,在本章的 GitHub 目录中找到 Summarizing_Text_with_T5.ipynb
。
让我们开始使用 T5!
在本小节中,我们将安装 Hugging Face 的框架,然后初始化一个 T5 模型。
我们首先安装 Hugging Face 的 transformers:
!pip install transformers
注意:Hugging Face transformers 不断演进,更新库和模块以适应市场。如果默认版本不起作用,您可能需要使用 !pip install transformers==[与笔记本中其他功能兼容的版本]
固定一个版本。
我们固定了 sentencepiece
的版本为 0.1.94
,以尽可能使使用 Hugging Face 的笔记本保持稳定:
!pip install sentencepiece==0.1.94
Hugging Face 有一个可以克隆的 GitHub 仓库。但是,Hugging Face 的框架提供了一系列我们可以实现的高级 transformer 函数。
我们可以选择在初始化模型时显示模型的架构或不显示:
display_architecture=False
如果将 display_architecture
设置为 True
,则将显示编码器层、解码器层和前向子层的结构。
程序现在导入了 torch
和 json
:
import torch
import json
从事 transformer 工作意味着要对研究实验室与我们分享的许多 transformer 架构和框架持开放态度。我也建议尽可能多地使用 PyTorch 和 TensorFlow 来熟悉两种环境。重要的是 transformer 模型的抽象级别(特定任务模型或零-shot 模型)及其整体性能。
让我们导入 tokenizer、generation 和 configuration 类:
from transformers import T5Tokenizer, T5ForConditionalGeneration, T5Config
我们将在这里使用 T5-large
模型,但您可以在本章的 Hugging Face 部分中选择其他 T5 模型。
现在,我们将导入 T5-large
有条件生成模型以生成文本和 T5-large tokenizer:
model = T5ForConditionalGeneration.from_pretrained('t5-large')
tokenizer = T5Tokenizer.from_pretrained('t5-large')
仅需一行即可初始化一个预训练的分词器。但是,并没有证明标记化的词典包含所有我们需要的词汇。我们将在第九章 匹配分词器和数据集中调查分词器和数据集之间的关系。
程序现在使用'cpu'
初始化了torch.device
。这部分笔记足够用了一个 CPU。torch.device
对象是 torch 张量分配的设备:
device = torch.device('cpu')
我们准备好探索 T5 模型的体系结构了。
在这一小节中,我们将探索 T5-large 模型的架构和配置。
如果display_architecture==true
,我们可以看到模型的配置:
if display_architecture==True:
print(model.config)
例如,我们可以看到模型的基本参数:
.../...
"num_heads": 16,
"num_layers": 24,
.../...
该模型是一个带有 16 个头和 24 层的 T5 Transformers。
我们还可以看到 T5 的文本到文本实现,它将一个输入句子添加一个前缀来触发任务执行。前缀使得能够在不修改模型参数的情况下以文本到文本格式表示各种任务。在我们的情况下,前缀是summarization
:
"task_specific_params": {
"summarization": {
"early_stopping": true,
"length_penalty": 2.0,
"max_length": 200,
"min_length": 30,
"no_repeat_ngram_size": 3,
"num_beams": 4,
"prefix": "summarize: "
},
我们可以看到 T5:
实施波束搜索算法,它将扩展四个最重要的文本完成预测
当每批完成num_beam
句子时,应用早停止
确保不重复出现 n 克,n 的大小等于 no_repeat_ngram_size
使用 min_length
和 max_length
控制样本的长度
应用长度惩罚
另一个有趣的参数是词汇量大小:
"vocab_size": 32128
词汇量本身就是一个话题。太多的词汇将导致表示稀疏。另一方面,词汇量太少会扭曲 NLP 任务。我们将在第九章 匹配分词器和数据集中进一步探讨这一点。
通过简单地打印model
,我们还可以看到Transformers堆栈的细节:
if(display_architecture==True):
print(model)
例如,我们可以通过仅运行您希望运行的单元来查看模型的一个块(层
):
(12): T5Block( (layer): ModuleList( (0): T5LayerSelfAttention( (SelfAttention): T5Attention( (q): Linear(in_features=1024, out_features=1024, bias=False) (k): Linear(in_features=1024, out_features=1024, bias=False) (v): Linear(in_features=1024, out_features=1024, bias=False) (o): Linear(in_features=1024, out_features=1024, bias=False) ) (layer_norm): T5LayerNorm() (dropout): Dropout(p=0.1, inplace=False) ) (1): T5LayerFF( (DenseReluDense): T5DenseReluDense( (wi): Linear(in_features=1024, out_features=4096, bias=False) (wo): Linear(in_features=4096, out_features=1024, bias=False) (dropout): Dropout(p=0.1, inplace=False) ) (layer_norm): T5LayerNorm() (dropout): Dropout(p=0.1, inplace=False) ) ) )
我们可以看到模型在注意子层上运行了1,024
个特征,在前馈网络子层的内部计算中运行了 4,096
个特征,这将产生1,024
个特征的输出。Transformers的对称结构在所有层中都得到了保持。
您可以花几分钟时间浏览编码器堆栈、解码器堆栈、注意子层和前馈子层。
您也可以选择仅运行您希望的单元来选择模型的特定方面:
if display_architecture==True:
print(model.encoder)
if display_architecture==True:
print(model.decoder)
if display_architecture==True:
print(model.forward)
我们已经初始化了 T5 Transformers。现在让我们来总结文件。
本节将创建一个总结函数,您可以用任何您希望总结的文本来调用。我们将总结法律和金融示例。最后,我们将定义方法的限制。
首先,我们将创建一个总结函数。
首先,让我们创建一个名为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 引擎进行总结实验了。
了解 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并修改E和S:
E可以改为:
我的工商管理硕士学生问我这段话是什么意思:
S可以改为:
我用工商管理硕士学院的语言重新表述了这段话:
GPT-3 引擎生成了上一个请求的响应,但为大学生添加了有用的信息:
公司可以有负责业务决策的董事会。董事会由股东选举产生。股东可以改变董事会的规模。
GPT-3 模型相当令人信服,并代表了云人工智能的崛起力量。在第十六章《Transformers驱动的合作伙伴的出现》中,我们将更深入地总结提示。然而,在我们这样做之前,还有更多,更多的探索。
在本章中,我们看到了 T5 Transformers模型如何标准化原始Transformers的编码器和解码器堆栈的输入。原始Transformers架构对于编码器和解码器堆栈的每个块(或层)具有相同的结构。然而,原始Transformers没有为自然语言处理任务制定标准化的输入格式。
Raffel 等人(2018)通过定义一个文本到文本模型,为广泛的自然语言处理任务设计了一个标准输入。他们为输入序列添加了一个前缀,指示要解决的自然语言处理问题类型。这导致了一个标准的文本到文本格式。文本到文本传输Transformers(T5)应运而生。我们看到这个看似简单的演变使得可以对广泛的自然语言处理任务使用相同的模型和超参数成为可能。T5 的发明将Transformers模型的标准化过程推进了一步。
然后,我们实现了一个可以总结任何文本的 T5 模型。我们测试了该模型在未准备好的训练数据集中不属于的文本上的表现。我们测试了该模型在宪法和公司样本上的表现。结果很有趣,但我们也发现了一些Transformers模型的限制,正如 Raffel 等人(2018)预测的那样。
最后,我们探讨了 GPT-3 引擎方法论和计算效率的巨大力量。展示一个Transformers是一个出色的方法。拥有世界上最强大的Transformers引擎之一有助于获得有效的结果,尽管不总是完美的。
目标不是对公司和模型进行基准测试,而是让工业 4.0 AI 专家对Transformers有深入理解。
在下一章,第九章,匹配标记化器和数据集 中,我们将探讨标记化器的限制,并定义可能改进自然语言处理任务的方法。
T5 模型只有像 BERT 模型那样的编码器堆栈。(是/否)
T5 模型具有编码器和解码器堆栈。(是/否)
T5 模型使用相对位置编码,而不是绝对位置编码。(是/否)
文本到文本模型仅设计用于摘要。(是/否)
文本到文本模型将一个前缀应用到输入序列中,确定自然语言处理任务。(是/否)
T5 模型需要针对每个任务具体的超参数。(是/否)
文本到文本模型的一个优点是,它们对所有自然语言处理任务使用相同的超参数。(是/否)
T5 Transformers不包含前馈网络。(是/否)
Hugging Face 是一个使Transformers更易于实现的框架。(是/否)
OpenAI 的Transformers引擎改变了游戏规则。(是/否)
Colin Raffel,Noam Shazeer,Adam Roberts,Katherine Lee,Sharan Narang,Michael Matena,Yanqi Zhou,Wei Li,Peter J. Liu,2019 年,探索与统一文本到文本转换器的转移学习极限:arxiv.org/pdf/1910.10683.pdf
Ashish Vaswani,Noam Shazeer,Niki Parmar,Jakob Uszkoreit,Llion Jones,Aidan N. Gomez,Lukasz Kaiser,Illia Polosukhin,2017 年,注意力就是一切:arxiv.org/abs/1706.03762
Peter Shaw,Jakob Uszkoreit 和 Ashish Vaswani,2018 年,自注意力与相对位置表示:arxiv.org/abs/1803.02155
Hugging Face 框架和资源:huggingface.co/
美利坚合众国独立宣言 由托马斯·杰斐逊:www.gutenberg.org/ebooks/1
美国权利法案 由美国:www.gutenberg.org/ebooks/2
加入书籍的 Discord 工作区,与作者进行每月的 问我任何事 交流会:
在研究变换器模型时,我们往往会关注模型的架构和提供给它们进行训练的数据集。我们已经探索了原始变换器,微调了一个类似 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)。
让我们浏览一下预处理阶段的主要方面。
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) 的数据集可能是个好主意,以过滤掉毫无意义的句子。
错误信息引用
消除指向无效链接、不道德网站或个人的文本。这是一项艰巨的工作,但肯定是值得的。
这个列表包含了一些主要的最佳实践。然而,还需要更多,比如过滤隐私法违规行为以及其他针对特定项目的行动。
一旦一个转换器被训练成学习正确的英语,我们需要帮助它在生产阶段检测输入文本中的问题。
一个训练过的模型将表现得像一个学习了语言的人一样。它将理解它可以理解的内容并从输入数据中学习。输入数据应该经过与 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 程序,举例说明一些分词器遇到的限制。
只要一切顺利,没人会想到预训练分词器。就像在现实生活中一样。我们可以开车多年而不考虑引擎的问题。然后,有一天,我们的车抛锚了,我们试图找出原因来解释这种情况。
预训练分词器也是如此。有时结果并不如我们所期望的那样。例如,一些词对就是不匹配,正如我们在 图 9.3 中看到的:
图 9.3:分词器计算错误的单词对
图 9.3 中显示的例子来自 美国独立宣言、权利法案 和 英国大宪章:
cake
和 chapters
不匹配,尽管分词器将它们计算为具有较高余弦相似度值。
freedom
指的是言论自由,例如。 copyright
指的是免费电子书编辑的注释。
pay
和 bill
在日常英语中是匹配的。 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)
的余弦相似度函数。我们将word1
和word2
发送到该函数中,它会返回它们之间的余弦相似度值。值越高,相似度越高。
该函数首先会检测未知单词[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
时,才会计算余弦相似度,这意味着word1
和word2
都是已知的。
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开始。
数据集中有freedom
和liberty
两个词,并可以计算它们的余弦相似度:
#@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
次是个好做法。
现在让我们看看当一个单词缺失时会发生什么。
缺少单词在许多方面都会带来麻烦。在这种情况下,我们将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]
标记。
如果缺失的单词是重要的话,它将引发一系列事件和问题,扭曲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
可能是 corporation
或 corporal
。这可能会导致 corp
与其他单词之间的混淆和不良关联。
我们可以看到,社交媒体的标准可能足以用于处理微不足道的主题的转换器。但是在现实生活中的企业项目中,将需要辛勤工作才能生成与数据集匹配的预训练标记器。在现实生活中,数据集每天都在随着用户输入而增长。用户输入成为应定期训练和更新的模型数据集的一部分。
例如,确保质量控制的一种方法可以通过以下步骤实现:
使用字节级 BPE 算法训练一个标记器。
使用类似于本章的“控制标记化数据”部分中将创建的程序来控制结果。
同样,训练一个使用于质量控制的 Word2Vec 算法的标记器,然后解析数据集,找到 unk
标记,并将其存储在数据库中。运行查询以检查是否缺少关键单词。
在如此详细地检查过程可能看起来是不必要的,并且你可能会倾向于依赖转换器对未见过的单词进行推理的能力。
然而,我建议在战略性项目中运行几种不同的质量控制方法,其中包括关键决策。例如,在法律摘要中,一个词可能是在法庭上赢得或输掉案件的区别。在航空航天项目(飞机,火箭)中,有一个 0
误差容忍标准。
运行越多的质量控制流程,你的转换器解决方案就会越可靠。
我们可以看到,获得可靠的数据集需要大量的工作!每一篇关于转换器的论文都以某种方式提到了制作可接受数据集所需的工作。
嘈杂的关系也会引起问题。
在这种情况下,数据集包含了单词 etext
和 declaration
:
#@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
是与独立宣言实际内容相关的有意义的词汇。
etext
是Project Gutenberg添加到其所有电子书中的序言的一部分。
这可能会导致错误的自然语言推理,例如Transformers被要求生成文本时产生etext 是声明。
让我们来看一个缺失单词的问题。
在某些情况下,一个词可能在文本中但不在字典中。这将扭曲结果。
让我们来看看单词pie
和logic
:
#@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
不在文本文件中。
因此,我们应该在流程中有函数来检测不在字典中的词汇,以实现更正或替代。此外,我们应该在流程中有函数来检测可能重要的数据集中的词汇。
让我们看看罕见词汇带来的问题。
罕见的词汇对超出简单应用范围的特定任务的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 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
的情况。此外,如果我们正在管理一个关键的法律项目,我们可以将包含任何类型稀有词的重要文档翻译成标准英语。因此,变换器在自然语言处理任务中的性能将提高,并且公司的知识库将逐渐增加。
现在让我们看看如何使用余弦相似度进行蕴含验证。
在这种情况下,我们对字典中的单词感兴趣,并按固定顺序测试它们。
例如,让我们看看“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 words和Case 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。确保在开始之前上传所需的文件,就像第七章中所解释的那样。
您希望训练模型的时间没有限制。中断它以保存模型。
文件位于Chapter09
的gpt-2-train_files
目录中的 GitHub 上。尽管我们使用的是第七章中相同的笔记本,但要注意数据集dset
在目录和代码中现在被命名为mdset
。
首先,让我们使用经过训练以理解医学内容的 GPT-2 模型生成一个无条件样本。
在这一节中,我们将亲自动手来理解变换器的内部工作原理。当然,我们可以跳过整个章节,简单地使用 OpenAI API。然而,一个 4.0 的 AI 专家必须成为 AI 大师,通过预处理管道展示,而不是模糊地告诉变换器模型要做什么。为了展示一个变换器模型要做什么,必须了解变换器模型的工作原理。
在案例 4:罕见词语和案例 5:替换罕见词语中,我们看到罕见词语可以是在特定领域中使用的词语,古老的英语,世界各地英语的变体,俚语等。
在 2020 年,新闻中充斥着与 COVID-19 爆发有关的医学术语。在这一部分中,我们将看到一个 GPT-2 变换器如何处理医学文本。
要编码和训练的数据集包含了Martina Conte和Nadia 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,我们会得到更好的结果,因为我们排除了更少的同一单词的变体,比如 go
和 go
+ ing
。
然而,amoeboid
中的 am
标记在低级别带来了多义性的问题。am
可以是一种前缀,像 I
+ am
中的 am
,或者像 am
+ bush
中的子词。注意层可能会将一个标记的 am
关联到另一个 am
,从而创建不存在的关系。这定义了自然语言理解中多义性的核心问题。
我们可以说进展正在取得,但我们需要更努力地改进自然语言处理。
我们已经通过一些例子了解了我们在实际项目中面临的很多日常问题。花些时间尝试一些你认为有用的例子。
在我们离开之前,我们将使用一个探测任务来验证Transformers模型提供的自然语言理解水平。
即使是像 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解释句子的含义。
一个标记化的字典包含了语言中存在的每一个单词。(真/假)
预训练的标记化器可以对任何数据集进行编码。(真/假)
在使用数据库之前检查数据库是一个好的做法。(真/假)
从数据集中清除淫秽数据是一个好的做法。(真/假)
删除包含歧视性言论的数据是一个好的做法。(真/假)
原始数据集有时可能产生嘈杂内容和有用内容之间的关系。(真/假)
一个标准的预训练标记化器包含了过去 700 年的英语词汇。(真/假)
老式英语可能在用现代英语训练的标记化器对数据进行编码时产生问题。(真/假)
医学和其他类型的行话可能在用现代英语训练的标记化器对数据进行编码时产生问题。(真/假)
控制预训练标记化器产生的编码数据的输出是一个好的做法。(真/假)
Colin Raffel、Noam Shazeer、Adam Roberts、Katherine Lee、Sharan Narang、Michael Matena、Yanqi Zhou、Wei Li 和 Peter J. Liu,2019 年,《探索具有统一文本到文本转换器的迁移学习的极限》:arxiv.org/pdf/1910.10683.pdf
OpenAI GPT-2 GitHub 代码库:github.com/openai/gpt-2
N. Shepperd 的 GitHub 代码库:github.com/nshepperd/gpt-2
Hugging Face 框架和资源:huggingface.co/
玛蒂娜·孔特,娜迪亚·洛伊,2020 年,《具有非局部感知的多线索动力学模型用于化学趋化作用纤维网络上的细胞迁移》:arxiv.org/abs/2006.09707
美利坚合众国独立宣言,由托马斯·杰斐逊:www.gutenberg.org/ebooks/1
美国权利法案,由美国及相关文本:www.gutenberg.org/ebooks/2
《纯粹理性批判》,《实践理性批判》和《道德形而上学基本原理》:www.gutenberg.org
加入该书的 Discord 工作区,与作者进行每月的问我任何活动。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。