开始使用NLP变压器
诸如转移学习、NLP转化器、强化学习和低代码工具等新技术已经改变了数据科学家处理文本数据的方式。
这些领域也有助于增加NLP的应用范围。它们包括检测假新闻和监测社交媒体平台的网络欺凌案件。
本文将探讨NLP中的变形金刚,以及它们相对于传统深度学习算法(如循环神经网络(RNN))的优势。
我们还将学习如何使用变形器建立一个NLP模型。
前提条件
要跟上,你需要。
- 在你的机器上安装Python或者有一个Google Colab账户
- 拥有一些深度学习的基本知识。
目标
在本教程结束时,你应该能够。
- 理解NLP Transformer的模型架构。
- 理解变压器背后的工作原理。
- 使用变形器为NLP建模。
开始使用NLP变压器
自然语言处理(NLP)是指人工智能的一个子领域,向机器解释人类的自然语言。它们包括语言检测系统和语言翻译。
变换器是一个深度学习模型,它是自给自足的,并评估其输入和输出的数据表示。
变压器主要应用于计算机视觉和自然语言处理。它们也被用于机器语言翻译、对话式聊天机器人和搜索引擎中。
了解预先存在的模型架构
由于NLP转化器是为了解决序列到序列的任务而建立的,我们必须首先了解其他相关的模型。
序列到序列的模型
这些模型在NLP中被用来将一种类型的序列转换为另一种类型的序列。一个例子可以是,语言翻译,像中文这样的语言被翻译成英文。
由于世界上大多数数据主要以序列的形式存在,近年来,基于序列到序列的模型如递归神经网络(RNN)的引入已经得到了普及。
递归神经网络依赖于序列或时间序列数据。
顺序到顺序模型的弱点
尽管效率高,但序列到序列模型有以下限制。
- 无法处理长距离的依赖关系。
- 无法执行并行化。
注:谷歌大脑的Transformer概念已经解决了这些限制。
了解变形器背后的原理
建立一个Transformer是为了使用attention 和repetition 来处理输入和输出数据之间的依赖关系。
一个转化器模型使用自我注意来计算其输入和输出的表示,与使用序列的RNN不同。
转化器架构的可视化表示如下。

为了更好地理解转化器的工作原理,我们将解决Encoder 和Decoder 部分。
注意:输入部分是编码器,输出部分是解码器。
变换器的编码器和解码器部分的工作原理解释如下。
- 字输入序列被传递给第一个编码器。
- 然后,输入被重塑,并反复传递给下一个编码器,直到最后一个编码器。
- 然后从编码器堆中的最后一个编码器生成一个输出。
- 从最后一个编码器生成的输出再通过堆栈中的其他解码器。
使用NLP变形器进行建模
在了解了变压器背后的基础知识后,我们现在可以开始实现NLP。
像BERT(来自变形器的双向编码器表示法)这样的变形器架构模型通常非常复杂,需要大量时间从头开始构建。
这就是为什么使用预训练的模型,如Hugging Face库,是一个好的做法。
在本教程中,我们将使用Hugging Face为至少两个任务建模,从序列分类任务开始。
序列分类任务
这是序列分类中最直接的任务。
我们将使用带有GLUE数据集的转化器管道,在SST2上利用微调模型。
我们首先需要使用以下命令安装Transformer库。
pip install transformers
编写以下代码来导入该库。
from transformers import pipeline
继续并使用下面的代码下载一个预训练的模型。
classification_task = pipeline("sentiment-analysis")
使用下面的代码检查预训练模型的推理。
result = classification_task("I love you")
result
上述代码的结果是基于单词love 的积极情绪,如下图所示。

result = classification_task("I hate you")
result
上述代码的结果是基于单词hate 的负面情绪。

序列转述任务
释义是指用不同的词来表达一个短语、段落或句子的意思,以达到清晰的效果。
我们将使用自动模型来实现这一功能。这些是根据给定的检查点自动选择正确的模型架构的包。
第一步是导入所需的库。
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
然后,我们从检查点中实例化一个tokenizer 和model ,具体如下。
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased-finetuned-mrpc")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased-finetuned-mrpc")
然后,我们将为解析句子和非解析句子创建类。
classes = ["Paraphrase", "Not_Paraphrase"]
创建两组序列句子,如下图所示。
main_sentence = "I went shopping yesterday."
sentence1 = "the shopkeeper sells goods"
sentence2 = "I bought a few items the day before today."
为了知道哪一个是我们的main_sentence的转述,我们将查看输出,以获得句子的输入ID、Token类型ID和注意力掩码。
paraphrase = tokenizer(main_sentence, sentence1, return_tensors="pt")
not_paraphrase = tokenizer(main_sentence, sentence2, return_tensors="pt")
paraphrase

对两个可用的类别进行分类。如下图所示,通过将序列传递给模型,划分出两个可用的类别:0(被转述)和1(未被转述)。
model_p = model(**paraphrase)
model_np = model(**not_paraphrase)
我们需要计算模型结果的softmax,以确定两个类别的概率。
result_p = torch.softmax(paraphrase_model[0], dim=1).tolist()[0]
result_np = torch.softmax(nonparaphrase_model[0], dim=1).tolist()[0]
运行下面的代码来检查解析模型的结果。
# Paraphrased output
for i in range(len(classes)):
print(f"{classes[i]}: {result_p[i] * 100:.2f}%")

# Not Paraphrased output
for i in range(len(classes)):
print(f"{classes[i]}: {result_np[i] * 100:.2f}%")

总结
在本教程中,我们了解了变形金刚的基本工作原理,并建立了两个NLP模型。
我们还讨论了使用Transformers比RNN这样的序列对序列模型的好处。
现在你可以把这些知识应用到你的个人或工作项目中。