精通 Transformers(一)(1)https://developer.aliyun.com/article/1511460
多头注意机制
在深入研究缩放点积注意力机制之前,最好先对自注意力有一个良好的理解。如图 1.15所示,自注意力是一种缩放自注意力机制的基本形式。该机制使用一个显示为X的输入矩阵,并在X中的各个项目之间产生注意力分数。我们将X视为一个 3x4 矩阵,其中 3 代表令牌的数量,4 代表嵌入大小。图 1.15中的Q也称为查询,K称为键,V称为值。在产生Q、K和V之前,三种类型的矩阵被称为theta、phi和g,它们与X相乘。查询(Q)和键(K)之间的乘积结果产生一个注意力分数矩阵。这也可以看作是一个数据库,我们使用查询和键来了解各种项目在数值评估方面的关联程度。注意力分数和V矩阵的乘积产生这种类型的注意力机制的最终结果。其被称为自注意力的主要原因是因为它的统一输入X; Q、K和V是从X计算出来的。你可以在下图中看到所有这些的描述:
图 1.15 – 注意力机制的数学表示(图片来源于 https://blogs.oracle.com/datascience/multi-head-self-attention-in-nlp)
一个缩放点积注意力机制与自注意力(点积)机制非常相似,只是它使用了一个缩放因子。另一方面,多头部分确保模型能够在各个层面上查看输入的各个方面。Transformer 模型关注编码器注释和来自过去层的隐藏值。Transformer 模型的架构没有逐步流程; 相反,它使用位置编码来获取有关输入序列中每个令牌位置的信息。嵌入值(随机初始化)和位置编码的固定值的串联值是输入传递到第一个编码器部分中的层,并通过体系结构传播,如下图所示:
图 1.16 – 一个 Transformer
通过评估不同频率的正弦和余弦波来获取位置信息。位置编码的一个示例在以下截图中可视化:
图 1.17 – 位置编码(图片来源于 http://jalammar.github.io/illustrated-Transformer/)
在下面的流行截图中给出了 Transformer 架构和缩放点积注意力机制的性能的一个很好的例子:
图 1.18 – Transformer 的注意力映射(图片灵感来自 https://ai.googleblog.com/2017/08/Transformer-novel-neural-network.html)
它 这个词在不同的语境中指代不同的实体,正如前面的截图所示。使用 Transformer 架构的另一个改进在于并行性。传统的顺序循环模型如 LSTM 和 GRU 并没有这样的能力,因为它们逐个处理输入标记。另一方面,前馈层的速度会更快一些,因为单个矩阵乘法比循环单元要快得多。多头注意力层的堆叠可以更好地理解复杂的句子。一个很好的多头注意力机制的可视化示例如下截图所示:
图 1.19 – 多头注意力机制(图片灵感来自 https://imgur.com/gallery/FBQqrxw)
在注意力机制的解码器侧,采用了与编码器非常相似的方法,但有一些小的修改。多头注意力机制是相同的,但也使用了编码器堆栈的输出。这个编码被提供给第二个多头注意力层中的每个解码器堆栈。这个小修改在解码时引入了编码器堆栈的输出。这个修改让模型在解码时意识到编码器输出,并同时在训练期间帮助它在各个层之间有更好的梯度流动。解码器层末端的最终 softmax 层用于为各种用例提供输出,例如原始 Transformer 架构引入的 NMT。
这个架构有两个输入,分别标注为输入和输出(向右移动)。一个始终存在(输入),无论是训练还是推断,而另一个只存在于训练和推断中,它由模型产生。我们之所以不在推断中使用模型预测,是为了防止模型自行出错。但这是什么意思呢?想象一个神经机器翻译模型试图将一句英文翻译成法文——在每个步骤中,它都会对一个词进行预测,并使用该预测的词来预测下一个词。但如果在某个步骤出错了,那么后面的所有预测都会错误。为了防止模型像这样出错,我们提供正确的词作为右移版本。
下图显示了一个 Transformer 模型的可视化示例。它展示了一个具有两个编码器和两个解码器层的 Transformer 模型。这张图中的 加法 & 标准化 层从这张图中的 前馈 层接收输入后添加和标准化它:
图 1.20 – Transformer 模型(图片灵感来自 http://jalammar.github.io/illustrated-Transformer/)
另一个由基于 Transformer 架构使用的主要改进是基于一种简单的通用文本压缩方案,以防止输入端出现未见标记。这种方法通过使用不同的方法(如字节对编码和句子片段编码)进行,提高了 Transformer 在处理未见标记时的性能。它还在模型遇到形态接近的标记时指导模型。这样的标记在过去是不可见的,并且在训练中很少使用,然而,在推理中可能会看到。在某些情况下,训练中会看到其部分内容;在形态丰富的语言(如土耳其语、德语、捷克语和拉脱维亚语)的情况下会发生后者。例如,模型可能看到单词 training,但没有看到 trainings。在这种情况下,它可以将 trainings 标记为 training+s。当我们将它们视为两个部分时,这两者是常见的。
基于 Transformer 的模型具有相当普遍的特征——例如,它们都是基于这种原始架构的,不同之处在于它们使用和不使用的步骤。在某些情况下,会做出较小的改进——例如,改进多头注意力机制。
使用 Transformer 进行 TL
TL 是人工智能(AI)和机器学习(ML)的一个领域,旨在使模型可在不同任务中重用,例如,在给定任务(如 A)上训练的模型可在不同任务(如 B)上重用(微调)。在 NLP 领域,通过使用可以捕获语言理解的 Transformer-like 架构来实现这一目标。这种模型称为语言模型——它们为其训练的语言提供了一个模型。TL 不是一种新技术,它已经被用于各种领域,如计算机视觉。ResNet、Inception、VGG 和 EfficientNet 是可以用作预训练模型的示例,可在不同的计算机视觉任务上进行微调。
浅层 TL 使用诸如 Word2vec、GloVe 和 Doc2vec 这样的模型在 NLP 中也是可能的。它被称为 浅层,因为这种 TL 背后没有模型,而是利用了预训练的单词/标记向量。你可以使用这些标记或文档嵌入模型,接着使用分类器,或者将它们与其他模型(如 RNNs)结合使用,而不是使用随机嵌入。
在 NLP 中使用 Transformer 模型进行 TL 也是可能的,因为这些模型可以在没有任何标注数据的情况下学习一门语言本身。语言建模是一种用于为各种问题训练可转移权重的任务。掩码语言建模是用于学习一门语言本身的方法之一。与 Word2vec 的基于窗口的模型预测中心词元相似,掩码语言建模采用类似的方法,但有关键差异。给定一个概率,每个词都被掩码并替换为特殊标记,如 [MASK]。语言模型(在我们的情况下是基于 Transformer 的模型)必须预测被掩码的词。与 Word2vec 不同,不是使用一个窗口,而是给出整个句子,模型的输出必须是相同的带有掩码词的句子。
使用 Transformer 架构进行语言建模的第一个模型之一是BERT,它基于 Transformer 架构的编码器部分。通过在训练语言模型之前和之后使用相同的方法,BERT 完成了掩码语言建模。BERT 是一个可转移的语言模型,适用于不同的 NLP 任务,如标记分类、序列分类,甚至问答任务。
每一个任务都是对 BERT 进行微调的任务,一旦一个语言模型被训练完成。BERT 最为人所知的是其在基础 Transformer 编码器模型上的关键特性,通过改变这些特性,提出了不同版本的它——小型、微型、基础、大型和超大型。上下文嵌入使得模型能够根据所处的上下文正确理解每个单词的含义——例如,单词 冷 在两个不同的句子中可能有不同的含义:冷酷无情的杀手 和 寒冷的天气。编码器部分的层数、输入维度、输出嵌入维度和多头注意机制的数量是这些关键特性,如下面的截图所示:
图 1.21 – BERT 的预训练和微调流程(图片灵感来自 J. Devlin 等人,《Bert: Pre-training of deep bidirectional Transformers for language understanding》,2018 年)
如你所见,在图 1.21中,预训练阶段还包括另一个称为下一句预测的目标。我们知道,每个文档由相互跟随的句子组成,而模型理解语言的另一个重要部分是理解句子之间的关系,换句话说,它们是否相关。为了完成这些任务,BERT 引入了特殊的标记,如*[CLS]和[SEP]。[CLS]标记是一个最初没有意义的标记,用作所有任务的起始标记,并包含关于句子的所有信息。在诸如 NSP 之类的序列分类任务中,会在此标记的输出(0位置的输出)之上使用分类器。它还有助于评估句子的意义或捕获其语义,例如,当使用孪生 BERT 模型时,通过诸如余弦相似度之类的度量来比较不同句子的这两个[CLS]标记非常有帮助。另一方面,[SEP]用于区分两个句子,它仅用于分隔两个句子。在预训练之后,如果有人打算在情感分析等序列分类任务上对 BERT 进行微调,那么他们将在[CLS]*的输出嵌入之上使用一个分类器。值得注意的是,在微调期间,所有 TL 模型都可以被冻结或释放;冻结意味着将模型内的所有权重和偏差视为常量,并停止对它们进行训练。在情感分析的示例中,如果模型被冻结,只有分类器会被训练,而不是模型。
摘要
通过这一章,我们现在来到了结束。你现在应该对 NLP 方法和方法的演变有所了解,从 BoW 到 Transformers。我们看了如何实现基于 BoW、RNN 和 CNN 的方法,并了解了 Word2vec 是什么,以及它如何通过浅层 TL 改进传统的 DL 方法。我们还深入了解了 Transformer 架构的基础,以 BERT 为例。到本章结束时,我们已经了解了 TL 以及 BERT 如何利用它。
到目前为止,我们已经学习了继续阅读下一章所必需的基本信息。我们了解了基于 Transformer 的架构的主要思想以及如何使用此架构应用 TL。
在下一节中,我们将看到如何从头开始运行一个简单的 Transformer 示例。将提供有关安装步骤的相关信息,并且还将详细调查与数据集和基准的工作。
参考文献
- Mikolov, T., Chen, K., Corrado, G. & Dean, J. (2013). Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781.
- Bahdanau, D., Cho, K. & Bengio, Y. (2014). Neural machine translation by jointly learning to align and translate. arXiv preprint arXiv:1409.0473.
- Pennington, J., Socher, R. & Manning, C. D. (2014, 十月). GloVe: 用于词表示的全局向量. 在 2014 年自然语言处理会议(EMNLP)论文集中的论文 (pp. 1532-1543).
- Hochreiter, S. & Schmidhuber, J. (1997). 长短期记忆网络. 神经计算, 9(8), 1735-1780.
- Bengio, Y., Simard, P, & Frasconi, P. (1994). 使用梯度下降学习长期依赖关系困难. IEEE 神经网络交易, 5(2), 157-166.
- Cho, K., Van Merriënboer, B., Gulcehre, C., Bahdanau, D., Bougares, F., Schwenk, H. & Bengio, Y. (2014). 使用 RNN 编码器-解码器学习短语表示进行统计机器翻译. arXiv 预印本 arXiv:1406.1078.
- Kim, Y. (2014). 句子分类的卷积神经网络. CoRR abs/1408.5882 (2014). arXiv 预印本 arXiv:1408.5882.
- Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N. & Polosukhin, I. (2017). 注意力就是一切. arXiv 预印本 arXiv:1706.03762.
- Devlin, J., Chang, M. W., Lee, K. & Toutanova, K. (2018). Bert: 深度双向 Transformer 的预训练用于语言理解. arXiv 预印本 arXiv:1810.04805.
第二章:主题的实践介绍
到目前为止,我们已经总体了解了基于深度学习(DL)方法的自然语言处理(NLP)的演变。我们也学习了一些有关 Transformer 及其各自架构的基本信息。在本章中,我们将深入研究如何使用 transformer 模型。在本章中,像双向编码器表示的 Transformer(BERT)这样的分词器和模型将以更加技术性的细节进行描述,并提供实际示例,包括如何加载分词器/模型和使用社区提供的预训练模型。但在使用任何特定模型之前,我们需要了解使用安装 Anaconda 所需的安装步骤以提供必要的环境。在安装步骤中,将涵盖在各种操作系统如 Linux、Windows 和 macOS 上安装库和程序的内容。还会展示PyTorch和TensorFlow的安装,在CPU和GPU的两个版本上。还提供了一个Google Colaboratory(Google Colab)安装 Transformer 库的快速指南。还有一个专门讨论在 PyTorch 和 TensorFlow 框架中使用模型的部分。
HuggingFace 模型存储库也是本章的另一个重要部分,讨论了查找不同模型和使用各种管道的步骤,例如,详细介绍了像双向自回归 Transformer(BART)、BERT 和表格解析(TAPAS)这样的模型,以及一瞥生成式预训练 Transformer 2(GPT-2)文本生成。然而,这只是一个概述,在本章中涉及到的部分是准备环境和使用预训练模型,这里不讨论模型训练,因为这在接下来的章节中被赋予了更重要的意义。
一切就绪,我们已经了解了如何通过社区提供的模型使用Transformer
库进行推理,接下来介绍datasets
库。在这里,我们将介绍加载各种数据集、基准测试和使用指标的方法。加载特定数据集并从中获取数据是我们在这里主要关注的领域之一。这里还会考虑跨语言数据集以及如何使用datasets
库中的本地文件。datasets
库中的map
和filter
函数是模型训练的重要函数,并且在本章中也会被研究。
本章是书中的重要部分,因为这里更详细地介绍了datasets
库。了解如何使用社区提供的模型并准备好系统以供接下来的内容是非常重要的。
总而言之,本章中我们将涵盖以下主题:
- 使用 Anaconda 安装 Transformer
- 使用语言模型和分词器进行工作
- 使用社区提供的模型进行工作
- 处理基准测试和数据集
- 速度和内存的基准测试
技术要求
您需要安装接下来列出的库和软件。虽然拥有最新版本是一个优点,但是强制安装与彼此兼容版本是必须的。有关 HuggingFace Transformer 的最新版本安装的更多信息,请查看它们在huggingface.co/transformers/installation.html
的官方网页:
- Anaconda
- Transformer 4.0.0
- PyTorch 1.1.0
- TensorFlow 2.4.0
- 数据集 1.4.1
最后,本章中显示的所有代码都可以在本书的 GitHub 存储库 https://github.com/PacktPublishing/Mastering-Transformer/tree/main/CH02 中找到。
点击以下链接查看动态代码演示视频:bit.ly/372ek48
使用 Anaconda 安装 Transformer
Transformer
库。但是,也可以在没有 Anaconda 的帮助下安装此库。使用 Anaconda 的主要动机是更容易解释过程并调节使用的软件包。
要开始安装相关库,安装 Anaconda 是必须的一步。Anaconda 文档提供了官方指南,简单介绍了为常见操作系统(macOS,Windows 和 Linux)安装 Anaconda 的步骤。
Linux 安装
用户可以享受许多 Linux 发行版,但其中Ubuntu是偏爱的之一。在本节中,将介绍安装 Anaconda 的步骤。请按以下步骤进行:
- 从 https://www.anaconda.com/products/individual#Downloads 下载 Linux 版本的 Anaconda 安装程序并转到 Linux 部分,如下截图所示:
图 2.1 - Linux 的 Anaconda 下载链接 - 运行
bash
命令来安装它并完成以下步骤: - 打开终端并运行以下命令:
bash Terminal./FilePath/For/Anaconda.sh
- 按下Enter键查看许可协议,如果你不想全部阅读,按Q键,然后执行以下操作:
- 点击是同意。
- 点击
conda
根环境。 - 在终端中运行
python
命令后,您应该看到 Python 版本信息后出现 Anaconda 提示符。 - 您可以通过从终端运行
anaconda-navigator
命令来访问 Anaconda Navigator。结果,您将看到 Anaconda 图形用户界面(GUI)开始加载相关模块,如下面的截图所示:
图 2.2 - Anaconda Navigator
让我们继续下一节!
Windows 安装
下面的步骤描述了如何在 Windows 操作系统上安装 Anaconda:
- 从 https://www.anaconda.com/products/individual#Downloads 下载安装程序并转到 Windows 部分,如下截图所示:
图 2.3 – Windows 上的 Anaconda 下载链接 - 打开安装程序并通过点击我同意按钮按照指南进行操作。
- 选择安装位置,如下截图所示:
图 2.4 – Windows 上的 Anaconda 安装程序 - 不要忘记从 Windows shell 或 Windows 命令行检查
python
命令:
图 2.5 – Windows 上的 Anaconda 安装程序高级选项 - 按照其余的安装说明进行操作并完成安装。
现在您应该能够从开始菜单启动 Anaconda Navigator。
macOS 上的安装
安装 Anaconda 在 macOS 上必须遵循以下步骤:
- 从 https://www.anaconda.com/products/individual#Downloads 下载安装程序并转到 macOS 部分,如下截图所示:
图 2.6 – macOS 上的 Anaconda 下载链接 - 打开安装程序。
- 按照说明并点击安装按钮在预定义位置安装 macOS,如下截图所示。你可以更改默认目录,但不建议这样做:
图 2.7 – macOS 上的 Anaconda 安装程序
完成安装后,您应该能够访问 Anaconda Navigator。
安装 TensorFlow、PyTorch 和 Transformer
安装 TensorFlow 和 PyTorch 作为用于 DL 的两个主要库可以通过pip
或conda
本身进行。conda
提供了一个用于更轻松安装这些库的命令行界面(CLI)。
为了进行干净的安装并避免中断其他环境,最好为huggingface
库创建一个conda
环境。您可以通过运行以下代码来实现:
conda create -n Transformer
此命令将创建一个空的环境以安装其他库。一旦创建,我们需要激活它,如下:
conda activate Transformer
安装Transformer
库非常简单,只需运行以下命令:
conda install -c conda-forge tensorflow conda install -c conda-forge pytorch conda install -c conda-forge Transformer
conda install
命令中的-c
参数让 Anaconda 使用额外的渠道来搜索库。
请注意,必须安装 TensorFlow 和 PyTorch,因为Transformer
库同时使用这两个库。另一个注意事项是,通过 Conda 轻松处理 TensorFlow 的 CPU 和 GPU 版本。如果在tensorflow
之后简单地放置–gpu
,它将自动安装 GPU 版本。通过cuda
库(GPU 版本)安装 PyTorch 时,需要相关库,如cuda
,但conda
会自动处理这个,不需要进一步的手动设置或安装。以下屏幕截图显示了conda
如何自动处理安装 PyTorch GPU 版本,安装相关的cudatoolkit
和cudnn
库:
图 2.8 – 使用 Conda 安装 PyTorch 和相关 cuda 库
请注意,所有这些安装也可以在没有conda
的情况下进行,但使用 Anaconda 的原因是它的易用性。在使用环境或安装 TensorFlow 或 PyTorch 的 GPU 版本方面,Anaconda 像魔术一样工作,是一个很好的时间节省工具。
使用 Google Colab 进行安装
即使使用 Anaconda 节省时间且有用,但在大多数情况下,不是每个人都有这样好的和合理的计算资源可用。在这种情况下,Google Colab 是一个很好的替代方案。在 Colab 中安装Transformer
库的命令如下进行:
!pip install Transformer
在语句前加上感叹号会使代码在 Colab shell 中运行,这相当于在终端中而不是使用 Python 解释器运行代码。这将自动安装Transformer
库。
使用语言模型和分词器
在本节中,我们将介绍如何使用Transformer
库与语言模型及其相关的分词器。为了使用任何指定的语言模型,我们首先需要导入它。我们将从谷歌提供的 BERT 模型开始,并使用其预训练版本,如下所示:
>>> from Transformer import BERTTokenizer >>> tokenizer = \ BERTTokenizer.from_pretrained('BERT-base-uncased')
前面代码片段的第一行导入了 BERT 分词器,第二行下载了 BERT 基础版本的预训练分词器。请注意,无大小写版本是使用无大小写字母训练的,因此字母出现在大写或小写中都没有关系。要测试并查看输出,必须运行以下代码行:
>>> text = "Using Transformer is easy!" >>> tokenizer(text)
这将是输出:
{'input_ids': [101, 2478, 19081, 2003, 3733, 999, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1]}
input_ids
显示每个标记的标记 ID,token_type_ids
显示每个标记的类型,它们分隔了第一个和第二个序列,如下面的屏幕截图所示:
图 2.9 – BERT 的序列分隔
attention_mask
是用于显示Transformers模型序列的起始和结束的 0 和 1 的掩码,以防止不必要的计算。每个分词器都有将特殊标记添加到原始序列的自己方式。对于 BERT 分词器,它在序列的开头添加了一个 [CLS]
标记,在序列的结尾添加了一个 [SEP]
标记,可以通过 101 和 102 观察到。这些数字来自预训练分词器的标记 ID。
分词器可用于基于 PyTorch 和 TensorFlow 的 Transformer
模型。为了每个模型都有输出,必须在 return_tensors
中使用 pt
和 tf
关键字。例如,您可以通过简单运行以下命令来使用分词器:
>>> encoded_input = tokenizer(text, return_tensors="pt")
encoded_input
具有将被 PyTorch 模型使用的标记化文本。为了运行模型,例如 BERT 基础模型,可以使用以下代码从 huggingface
模型存储库下载模型:
>>> from Transformer import BERTModel >>> model = BERTModel.from_pretrained("BERT-base-uncased")
分词器的输出可以通过以下代码行传递给已下载的模型:
>>> output = model(**encoded_input)
这将以嵌入和交叉注意输出的形式给您模型的输出。
在加载和导入模型时,您可以指定要使用的模型的版本。如果您只需在模型名称前加上 TF
,Transformer
库将加载其 TensorFlow 版本。以下代码显示了如何加载和使用 TensorFlow 版本的 BERT base:
from Transformer import BERTTokenizer, TFBERTModel tokenizer = \ BERTTokenizer.from_pretrained('BERT-base-uncased') model = TFBERTModel.from_pretrained("BERT-base-uncased") text = " Using Transformer is easy!" encoded_input = tokenizer(text, return_tensors='tf') output = model(**encoded_input)
对于特定任务,如使用语言模型填充掩码,huggingface
设计了准备就绪的管道。例如,可以在以下代码片段中看到填充掩码的任务:
>>> from Transformer import pipeline >>> unmasker = \ pipeline('fill-mask', model='BERT-base-uncased') >>> unmasker("The man worked as a [MASK].")
此代码将生成以下输出,显示分数和可能放置在 [MASK]
标记中的标记:
[{'score': 0.09747539460659027, 'sequence': 'the man worked as a carpenter.', 'token': 10533, 'token_str': 'carpenter'}, {'score': 0.052383217960596085, 'sequence': 'the man worked as a waiter.', 'token': 15610, 'token_str': 'waiter'}, {'score': 0.049627091735601425, 'sequence': 'the man worked as a barber.', 'token': 13362, 'token_str': 'barber'}, {'score': 0.03788605332374573, 'sequence': 'the man worked as a mechanic.', 'token': 15893, 'token_str': 'mechanic'}, {'score': 0.03768084570765495, 'sequence': 'the man worked as a salesman.', 'token': 18968, 'token_str': 'salesman'}]
要使用 pandas 获取清晰的视图,请运行以下代码:
>>> pd.DataFrame(unmasker("The man worked as a [MASK]."))
结果可以在以下截图中看到:
图 2.10 – BERT 填充掩码的输出
到目前为止,我们已经学习了如何加载和使用预训练的 BERT 模型,并了解了分词器的基础知识,以及模型的 PyTorch 和 TensorFlow 版本之间的区别。在下一节中,我们将学习如何使用社区提供的模型,通过加载不同的模型,阅读模型作者提供的相关信息,并使用不同的管道,如文本生成或问答(QA)管道。
使用社区提供的模型
Hugging Face 拥有大量由来自大型人工智能(AI)和信息技术(IT)公司(如谷歌和 Facebook)的合作者提供的社区模型。还有许多个人和大学提供的有趣模型。访问和使用它们也非常容易。要开始,请访问他们网站上提供的 Transformer 模型目录(https://huggingface.co/models),如下截图所示:
图 2.11 – Hugging Face 模型库
除了这些模型,还有很多好用的数据集可供 NLP 任务使用。要开始使用其中一些模型,你可以通过关键字搜索或只需指定你的主要 NLP 任务和流水线来探索它们。
例如,我们正在寻找一个表格 QA 模型。在找到我们感兴趣的模型之后,从 Hugging Face 网站(huggingface.co/google/tapas-base-finetuned-wtq
)会提供类似下面这个页面:
图 2.12 – TAPAS 模型页面
右侧有一个面板,你可以在这里测试这个模型。请注意,这是一个可以回答关于提供给模型的表格的问题的表格 QA 模型。如果你问一个问题,它会用高亮显示的方式来回复你。以下截图展示了它如何获取输入并为特定表格提供答案:
图 2.13 – 使用 TAPAS 进行表格 QA
每个模型都有一个由模型作者提供的页面,也被称为huggingface
库页面,并查看作者提供的示例(huggingface.co/gpt2
),如下截图所示:
图 2.14 – 来自 Hugging Face GPT-2 页面的文本生成代码示例
使用流水线是推荐的,因为所有繁琐的工作都由Transformer
库处理好了。举个例子,假设你需要一个开箱即用的零-shot 分类器。下面的代码片段展示了实现和使用这样一个预训练模型是多么容易:
>>> from Transformer import pipeline >>> classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli") >>> sequence_to_classify = "I am going to france." >>> candidate_labels = ['travel', 'cooking', 'dancing'] >>> classifier(sequence_to_classify, candidate_labels)
上述代码将提供以下结果:
{'labels': ['travel', 'dancing', 'cooking'], 'scores': [0.9866883158683777, 0.007197578903287649, 0.006114077754318714], 'sequence': 'I am going to france.'}
我们已经完成了安装和hello-world
应用程序部分。到目前为止,我们介绍了安装过程,完成了环境设置,并体验了第一个 transformer 流水线。接下来,我们将介绍datasets
库,这将是我们接下来的实验章节中的必备工具。
与基准和数据集一起工作
在介绍datasets
库之前,我们最好先谈谈重要的基准,比如Transformer
库,我们可以将从一个特定任务学到的内容转移到一个相关任务中,这被称为迁移学习(TL)。通过在相关问题之间迁移表示,我们能够训练出共享通用语言知识的通用模型,也就是多任务学习(MTL)。TL 的另一个方面是跨语言传递知识(多语言模型)。
重要的基准指标
在这一部分中,我们将介绍被基于 Transformer 的架构广泛使用的重要基准。这些基准专门对 MTL 和多语言以及零-shot 学习做出了很大贡献,包括许多具有挑战性的任务。我们将看看以下基准:
- GLUE
- SuperGLUE
- XTREME
- XGLUE
- SQuAD
为了使用更少的页面,我们只详细介绍 GLUE 基准的任务,所以我们先看看这个基准。
GLUE 基准
最近的研究指出,多任务训练方法可以比单任务学习获得更好的结果,作为一个特定任务的特定模型。在这个方向上,为了 MTL 引入了 GLUE 基准,这是一个用于评估 MTL 模型在一系列任务上的性能的工具和数据集集合。它提供了一个公共排行榜,用于监控基准测试提交的性能,以及一个总结 11 个任务的单一数字度量标准。该基准包括许多基于现有任务的理解句子任务,这些任务涵盖了各种数据集,包括不同大小、文本类型和难度级别的文本。这些任务按照以下三种类型分类:
- 单句子任务
- CoLA:Corpus of Linguistic Acceptability 数据集。这个任务由来自语言学理论文章的英语可接受性判断组成。
pos
/neg
标签。- 相似度和释义任务
- MRPC:Microsoft Research Paraphrase Corpus 数据集。这个任务是看一对句子是否语义上等价。
- QQP:Quora Question Pairs 数据集。这个任务决定一对问题是否语义上等价。
- STS-B:Semantic Textual Similarity Benchmark 数据集。这个任务是从新闻标题中抽取的句子对集合,其相似性得分在 1 到 5 之间。
- 推理任务
- MNLI:Multi-Genre Natural Language Inference 语料库。这是一组带有文本蕴涵的句子对。任务是预测文本是否蕴涵假设(蕴涵)、否定假设(否定)或者既不是(中性)。
- QNLI:Question Natural Language Inference 数据集。这是 SQuAD 的转换版本。任务是检查一个句子是否包含问题的答案。
- RTE:Recognizing Textual Entailment 数据集。这是一个文本蕴涵挑战任务,将来自各种来源的数据结合起来。这个数据集类似于前面的 QNLI 数据集,其中任务是检查第一个文本是否蕴涵第二个文本。
- WNLI:Winograd Natural Language Inference 架构挑战。这原本是一个代词解析任务,将一个代词和一个句子中的短语联系起来。GLUE 将问题转换为句子对分类,如下面详细说明。
SuperGLUE 基准
与 Glue 类似,SuperGLUE是一个新的基准测试,具有一组更难的语言理解任务,并提供大约八项语言任务的公共排行榜,借鉴了现有数据,与 GLUE 的类似,都使用单一数字性能指标。其背后的动机是,截至撰写本书,在写作时间,当前的 GLUE 得分(90.8)超过人类表现(87.1)。因此,SuperGLUE 提供了一个更具挑战性和多样化的任务,以实现通用目的的语言理解技术。
你可以在gluebenchmark.com上访问 GLUE 和 SuperGLUE 基准测试。
XTREME 基准测试
近年来,自然语言处理研究人员越来越注重学习通用表示而不是单一任务,可以应用于许多相关任务。构建通用语言模型的另一种方法是使用多语言任务。已经观察到最近的多语言模型,如多语言 BERT(mBERT)和 XLM-R,预训练了大量的多语言语料库,当将它们转移到其他语言时表现更好。因此,这里的主要优势是跨语言泛化使我们能够通过零样本跨语言传输在资源匮乏的语言中构建成功的自然语言处理应用程序。
在这个方向上,XTREME基准测试已经设计好。它目前包括约 40 种属于 12 个语言家族的不同语言,并包括需要在各种句法或语义水平上进行推理的 9 个不同任务。然而,将模型扩展到覆盖超过 7000 种世界语言仍然具有挑战性,并存在语言覆盖和模型能力之间的权衡。有关此事的更多详细信息,请查看以下链接:sites.research.google/xtreme
。
XGLUE 基准测试
XGLUE是另一个跨语言基准测试,用于评估和改进自然语言理解(NLU)和自然语言生成(NLG)的跨语言预训练模型的性能。它最初由 19 种语言的 11 项任务组成。与 XTREME 的主要区别在于,每项任务的训练数据仅在英语中可用。这迫使语言模型仅从英语文本数据中学习,并将这些知识传递给其他语言,这被称为零样本跨语言传输能力。第二个区别是它同时具有 NLU 和 NLG 任务。有关此事的更多详细信息,请查看以下链接:microsoft.github.io/XGLUE/
。
SQuAD 基准测试
SQuAD是 NLP 领域中广泛使用的 QA 数据集。它提供了一组 QA 对,用于评估 NLP 模型的阅读理解能力。它包含一系列问题、一个阅读段落和由众包工作者在一系列维基百科文章上注释的答案。问题的答案是阅读段落中的一段文本。最初的版本,SQuAD1.1,在数据集收集时没有一个无法回答的选项,因此每个问题都有一个在阅读段落中某处可以找到的答案。即使这看起来不可能,NLP 模型也被强制回答问题。SQuAD2.0 是一个改进版本,其中 NLP 模型不仅在可能时必须回答问题,而且在不可能回答时也必须弃权。SQuAD2.0 包含由众包工作者以与可回答问题相似的方式编写的 50,000 个无法回答的问题。此外,它还有来自 SQuAD1.1 的 100,000 个问题。
精通 Transformers(一)(3)https://developer.aliyun.com/article/1511462