Transformer 自然语言处理简介

2021-12-01 17:18:02 浏览数 (1)

磐创AI分享

作者 | JNK789

编译 | Flin

来源 | analyticsvidhya

介绍

自然语言处理(NLP)是与理解人类语言相关的语言学和深度学习领域。NLP所处理的任务是理解讲话的上下文,而不仅仅是理解句子。

自然语言处理中的一些常见任务包括:

  • 文本分类:将整个文本分类为垃圾邮件/非垃圾邮件等
  • 文本生成:使用生成的文本生成文本或自动完成等
  • 情感分析:分析文本的情感,即正面/负面情绪等
  • 语言翻译:将文本翻译成不同的语言等

NLP 的应用不仅限于文本,在语音识别、会话 AI、计算机视觉等方面都有广泛的应用

《Attention Is All You Need》(https://arxiv.org/abs/1706.03762)一文中介绍的Transformers架构改变了创建更复杂、更高级的 NLP 模型的场景。

转换器架构由编码器和解码器模型组成,它们协同工作以生成有意义的结果。

  • 编码器:编码器模型构建输入的表示/特征,以便从给定的输入文本中获取理解和含义。它经过优化以从输入中获取特征表示。示例:BERT、DistilBERT、RoBERTa 等
  • 解码器:解码器模型使用编码器的表示与其他输入来执行生成任务。通常,解码器模型是很好的语言模型,即用于从给定的输入文本生成下一个单词。示例:GPT、GPT-2、Transformer-XL 等

因此,该架构可用于训练模型以解决上述几乎任何类型的 NLP 任务。

现在让我们通过HuggingFace深入了解Transformer

要继续本教程,建议使用带有 GPU 的 Jupyter Notebook。可以通过Google Colaboratory访问,该实验室提供基于云的 jupyter Notebook环境和免费的 Nvidia GPU。

Transformer库

HuggingFaceTransformer库由数以千计的预先训练模式,在巨大的数据集训练了成千上万的GPU小时,提供给我们,以便我们可以为我们的具体应用使用它或微调它。

ModelHub由各种预先训练过的模型组成,用于不同的任务,可以轻松下载和使用。它还支持Hosted Inference API,这样我们就可以直接输入文本并获得输出。

现在让我们开始安装transformers库。

安装

如果你使用的是 jupyter Notebook,请在单元格中运行此命令以安装转换器库,

代码语言:javascript复制
!pip installtransformers

要在本地环境中安装库,请点击此链接:https://huggingface.co/course/chapter0

在我们开始之前,创建一个HuggingFace( https://huggingface.co/welcome )帐户以访问来自 ModelHub 和许多其他对象的模型。

Pipeline API

Pipeline API 是一个高级 API,它执行所有必需的步骤,即输入的预处理、获取模型预测和执行输出的后处理。这个 API 允许我们直接输入任何文本并获得可理解的答案。

它支持各种 NLP 任务,其中一些是:

  • 情感分析:将输入句子分类为正面或负面情绪
  • 特征提取:获取输入的向量表示
  • 问答:根据上下文回答问题
  • 摘要:获取给定输入文本的摘要。等等…

现在让我们看一下 Pipeline API 支持的一些任务

情绪分析

首先,让我们导入 Pipeline API,

代码语言:javascript复制
from transformers import pipeline

现在让我们为情感分析任务创建一个分类器对象,

代码语言:javascript复制
classifier = pipeline('sentiment-analysis')

执行上述代码时,管道 API 会选择一个特定的预训练模型,该模型已经针对英语情感分析进行了微调。创建分类器对象时,会下载并缓存此模型。

因此,如果你重新运行上述命令,将加载缓存模型而不是下载它。

我们可以通过以下方式检查我们的分类器对象正在使用哪个模型,

代码语言:javascript复制
classifier.model.name_or_path

输出:

![](http://qiniu.aihubs.net/97543Screenshot 2021-08-24 at 7.55.40 AM.png)

模型的输出给出了模型的名称。在上述情况下,分类器选择了一种bert模型。你可以在 ModelHub 中搜索此模型以获取更多信息。

现在让我们通过将输入句子传递给模型来执行一些推理,

代码语言:javascript复制
classifier("I am  really excited about about today !! ")

输出:

![](http://qiniu.aihubs.net/19650Screenshot 2021-08-24 at 7.59.18 AM.png)

我们可以看到分类器将输入句子分类为 正面 句子,置信度几乎为 100%。

现在让我们尝试使用分类器对多个输入进行分类,

代码语言:javascript复制
classifier(["I am very excited for this new movie !!",
            "I not very unhappy",
            "I hate this weather !!",
            "I really hate that movie.."])

输出:

![](http://qiniu.aihubs.net/72755Screenshot 2021-08-24 at 8.05.13 AM.png)

我们可以看到分类器对句子的情感进行了正确的分类,并且非常有信心。

任务:只需输入不同的输入,看看模型的行为……

零样本分类

在零样本分类中,输入文本没有标记,我们可以根据需要定义标签。

因此,我们不需要依赖已经训练过的预训练模型的标签。

让我们检查一些例子,

代码语言:javascript复制
from transformers import pipeline
classifier = pipeline('zero-shot-classification')

在输入文本时,我们还应该指定模型进行分类的相关标签,

代码语言:javascript复制
classifier(
    ["This is a course about the Transformers library",
     "This App can generate more than 100 million in revenue",],
    candidate_labels=["education", "politics", "business"],
)

输出:

![](http://qiniu.aihubs.net/73221Screenshot 2021-08-24 at 8.20.28 AM.png)

我们可以看到我们已经决定了标签,即教育、商业和政治,并且模型能够根据给定的输入对句子进行分类,即模型返回我们输入的类别的概率。

第一句话是关于教育的有 85% 的把握,而第二句话是关于商业的有几乎 99% 的把握。

任务:只需输入不同的序列和标签,然后检查模型的行为……

文本生成

这是最令人兴奋的任务之一,即通过生成剩余文本来生成具有自动完成功能的初始提示和模型的文本。

此外,文本生成涉及一些随机性,因此结果可能不完全匹配。

代码语言:javascript复制
from transformers import pipeline
generator = pipeline('text-generation')

让我们给出一个提示并指定num_return_sequences参数 来定义要生成的句子数和 max_length参数来定义生成句子的最大长度。

代码语言:javascript复制
results = generator("I am really happy because ", 
          num_return_sequences=2, 
          max_length=30)

来看看结果吧

代码语言:javascript复制
for i in results:
    print(i['generated_text'])
    print('n')

输出:

![](http://qiniu.aihubs.net/23859Screenshot 2021-08-24 at 8.37.50 AM.png)

任务:通过给出不同的提示和改变 max_length 或 num_return_sequences 来玩弄一些句子……

问答

问答管道使用给定上下文的信息回答问题。

代码语言:javascript复制
from transformers import pipeline
question_answerer = pipeline("question-answering")

按以下格式提供输入,

代码语言:javascript复制
question_answerer(
    question = "What is the capital of India ?",
    context = """India, officially the Republic of India, is a country in South Asia. 
    It is the second-most populous country, the seventh-largest country by land area, and the most populous democracy in the world.
    The capital is New Delhi"""
)

输出:

![](http://qiniu.aihubs.net/55794Screenshot 2021-08-24 at 8.44.42 AM.png)

我们可以看到答案是从上下文中提取出来的,并没有生成。

任务:尝试提供不同的上下文和问题以更好地理解……

摘要

摘要pipeline API 生成给定输入文本的摘要,同时保留引用文本中的大部分重要方面。

代码语言:javascript复制
from transformers import pipeline
summarizer = pipeline('summarization')

我们应该输入文本以及 用于生成文本/摘要的max_length 或 min_length参数 。

代码语言:javascript复制
summarizer("""
America has changed dramatically during recent years. Not only has the number of 
    graduates in traditional engineering disciplines such as mechanical, civil, 
    electrical, chemical, and aeronautical engineering declined, but in most of 
    the premier American universities engineering curricula now concentrate on 
    and encourage largely the study of engineering science. As a result, there 
    are declining offerings in engineering subjects dealing with infrastructure, 
    the environment, and related issues, and greater concentration on high 
    technology subjects, largely supporting increasingly complex scientific 
    developments. While the latter is important, it should not be at the expense 
    of more traditional engineering.
    Rapidly developing economies such as China and India, as well as other 
    industrial countries in Europe and Asia, continue to encourage and advance 
    the teaching of engineering. Both China and India, respectively, graduate 
    six and eight times as many traditional engineers as does the United States. 
    Other industrial countries at minimum maintain their output, while America 
    suffers an increasingly serious decline in the number of engineering graduates 
    and a lack of well-educated engineers.
""")

输出:

![](http://qiniu.aihubs.net/73654Screenshot 2021-08-24 at 8.55.17 AM.png)

使用管道 API 可以完成更多任务,例如

  • 文字翻译
  • 命名实体识别
  • mask填充等

我们已经看到管道对象自动选择特定的预训练模型。现在终于让我们看到,我们还可以在管道 API 中定义/选择要定义的模型。

任务:尝试生成一些文本摘要并尝试使用 min_length/max_length。

在管道中使用 Hub 中的任何模型

在初始化管道对象时,我们可以通过在模型参数中指定模型的名称来指定在管道中使用的模型。我们可以从ModelHub的任何模型中选择特定任务。

例如,如果我们正在初始化用于文本生成的管道对象,则从模型中心左侧的任务菜单中选择文本生成任务。然后从显示的列表中选择一个模型。

让我们使用GPT2模型创建一个文本生成管道对象

代码语言:javascript复制
from transformers import pipeline
generator = pipeline('text-generation', model='gpt2')

为了验证我们可以通过以下方式检查模型,

代码语言:javascript复制
generator.model.name_or_path

输出:

![](http://qiniu.aihubs.net/80684Screenshot 2021-08-24 at 9.33.39 AM.png)

因此,我们的管道对象使用模型“gpt2”

结论

正如我们已经看到的,在大量NLP任务中使用预训练模型是多么受欢迎和强大,我们可以意识到,通过在自定义数据集上对模型进行微调,为我们自己的应用程序创建/训练模型具有非常大的潜力,从而使人工智能成为日常应用中不可或缺的一部分。

参考

  1. HuggingFace 课程 – 链接:https://huggingface.co/course/chapter1
  2. HuggingFace Transformer文档 -链接:https://huggingface.co/transformers/

0 人点赞