00179 NLP Course - Transformers, what can they do? ubuntu
前言
在本节中,我们将看看Transformer模型可以做什么,并使用🤗Transformers库中的第一个工具:pipeline()函数。
src link: https://huggingface.co/learn/nlp-course/chapter1/3
Google Colab notebook: https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter1/section3.ipynb
Operating System: Ubuntu 22.04.4 LTS
参考文档
到处都是Transformers!
Transformer模型用于解决各种NLP任务,如上一节中提到的。以下是一些使用Hugging Face和Transformer模型的公司和组织,他们也通过分享他们的模型来回馈社区:
🤗Transformers库提供了创建和使用这些共享模型的功能。模型中心包含数千个任何人都可以下载和使用的预训练模型。您还可以将自己的模型上传到中心!
⚠️ Hugging Face Hub不限于Transformer模型。任何人都可以共享他们想要的任何类型的模型或数据集!创建一个huggingface.co帐户以受益于所有可用功能!
在深入研究Transformer模型如何在幕后工作之前,让我们看几个如何使用它们来解决一些有趣的NLP问题的示例。
使用管道
🤗Transformers库中最基本的对象是pipeline()函数,它将一个模型与其必要的预处理和后处理步骤连接起来,允许我们直接输入任何文本并得到一个可理解的答案:
1 | from transformers import pipeline |
1 | [{'label': 'POSITIVE', 'score': 0.9598047137260437}] |
我们甚至可以传递几个句子!
1 | classifier( |
1 | [{'label': 'POSITIVE', 'score': 0.9598047137260437}, |
默认情况下,此管道选择一个特定的预训练模型,该模型已被英文微调用于情感分析。当您创建分类器对象时,模型将被下载并缓存。如果您重新运行该命令,将使用缓存的模型代替,无需再次下载模型。
将文本传递到管道时涉及三个主要步骤:
- 文本被预处理成模型可以理解的格式。
- 预处理的输入被传递给模型。
- 模型的预测是后处理的,因此您可以理解它们。
目前可用的一些管道是:
feature-extraction
(get the vector representation of a text)fill-mask
ner
(named entity recognition)question-answering
sentiment-analysis
summarization
text-generation
translation
zero-shot-classification
让我们看看其中的几个!
Zero-shot分类
我们将从处理一个更具挑战性的任务开始,我们需要对尚未标记的文本进行分类。这是现实世界项目中的常见场景,因为注释文本通常很耗时,并且需要领域专业知识。对于这个用例,zero-shot-classification管道非常强大:它允许您指定用于分类的标签,因此您不必依赖预训练模型的标签。您已经看到模型如何使用这两个标签将句子分类为正面或负面-但它也可以使用您喜欢的任何其他标签集对文本进行分类。
1 | from transformers import pipeline |
1 | {'sequence': 'This is a course about the Transformers library', |
这个管道被称为zero-shot,因为你不需要在你的数据上微调模型来使用它,它可以直接为你想要的任何标签列表返回概率分数!
文本生成
现在让我们看看如何使用管道来生成一些文本。这里的主要思想是,您提供一个提示,模型将通过生成剩余的文本来自动完成它。这类似于许多手机上的预测文本功能。文本生成涉及随机性,因此如果您没有得到如下所示的相同结果,这是正常的。
1 | from transformers import pipeline |
1 | [{'generated_text': 'In this course, we will teach you how to understand and use ' |
你可以通过参数 num_return_sequences
控制生成多少个不同的序列,以及通过参数 max_length
控制输出文本的总长度。
在管道中使用Hub中的任何模型
前面的示例对手头的任务使用默认模型,但您也可以从Hub中选择特定模型以在特定任务的管道中使用-例如文本生成。转到模型Hub并单击左侧的相应标签以仅显示该任务支持的模型。您应该会进入这样的页面。
让我们试一试distilgpt2模型!以下是如何将其加载到与以前相同的管道中:
1 | from transformers import pipeline |
1 | [{'generated_text': 'In this course, we will teach you how to manipulate the world and ' |
您可以通过单击语言标签来优化模型搜索,并选择将生成另一种语言文本的模型。模型中心甚至包含支持多种语言的多语言模型的检查点。
通过单击选择模型后,您会看到有一个小部件使您能够直接在线尝试。这样您就可以在下载模型之前快速测试模型的功能。
Mask filling
您将尝试的下一个管道是fill-mask。此任务的想法是填充给定文本中的空白:
1 | from transformers import pipeline |
1 | [{'sequence': 'This course will teach you all about mathematical models.', |
参数 top_k
控制你想要显示多少种可能性。请注意,在这里模型填充的是特殊的 <mask>
单词,这通常被称为掩码token。其他掩码填充模型可能有不同的掩码token,所以在探索其他模型时,验证正确的掩码单词总是好的。检查的一种方法是通过查看小部件中使用的掩码单词。
命名实体识别
命名实体识别(NER)是一项任务,其中模型必须找到输入文本的哪些部分对应于人员、位置或组织等实体。让我们看一个例子:
1 | from transformers import pipeline |
1 | [{'entity_group': 'PER', 'score': 0.99816, 'word': 'Sylvain', 'start': 11, 'end': 18}, |
在这里,模型正确地识别出 Sylvain 是一个人(PER),Hugging Face 是一个组织(ORG),而 Brooklyn 是一个地点(LOC)。
我们在管道创建函数中传递了选项 grouped_entities=True,以告诉管道将句子的对应同一实体部分重新组合在一起:在这里,模型正确地将“Hugging”和“Face”作为一个单一的组织组合在一起,尽管名称由多个单词组成。实际上,正如我们将在下一章看到的,预处理甚至将一些单词分割成更小的部分。例如,Sylvain 被分割成四部分:S, ##yl, ##va, 和 ##in。在后期处理步骤中,管道成功地重新组合了这些部分。
问答
问答管道使用给定上下文中的信息来回答问题:
1 | from transformers import pipeline |
1 | {'score': 0.6385916471481323, 'start': 33, 'end': 45, 'answer': 'Hugging Face'} |
请注意,此管道通过从提供的上下文中提取信息来工作;它不会生成答案。
摘要
摘要是将文本简化为更短的文本,同时保留文本中引用的所有(或大部分)重要方面的任务。这里有一个例子:
1 | from transformers import pipeline |
1 | [{'summary_text': ' America has changed dramatically during recent years . The ' |
与文本生成一样,您可以指定结果的最大长度(max_length)或最小长度(min_length)。
翻译
对于翻译,如果您在任务名称中提供一个语言对(例如 “translation_en_to_fr”),则可以使用默认模型,但最简单的方法是在模型库中选择您想要使用的模型。这里我们将尝试从法语翻译成英语:
1 | from transformers import pipeline |
1 | [{'translation_text': 'This course is produced by Hugging Face.'}] |
与文本生成和摘要一样,您可以指定结果的最大长度(max_length)或最小长度(min_length)。
到目前为止展示的管道主要是用于演示目的。它们是为特定任务编程的,不能执行这些任务的变体。在下一章中,您将学习 pipeline()
函数内部的内容以及如何自定义其行为。
结语
第一百七十九篇博文写完,开心!!!!
今天,也是充满希望的一天。