1.Transformer models
首先介绍了 - what is NLP?
-
Classifying whole sentences: Getting the sentiment of a review, detecting if an email is spam, determining if a sentence is grammatically correct or whether two sentences are logically related or not
-
Classifying each word in a sentence: Identifying the grammatical components of a sentence (noun, verb, adjective), or the named entities (person, location, organization)
-
Generating text content: Completing a prompt with auto-generated text, filling in the blanks in a text with masked words
-
Extracting an answer from a text: Given a question and a context, extracting the answer to the question based on the information provided in the context
-
Generating a new sentence from an input text: Translating a text into another language, summarizing a text
NLP isn’t limited to written text though. It also tackles complex challenges in speech recognition and computer vision, such as generating a transcript of an audio sample or a description of an image.
然后介绍了transformer模型的架构和它的衍生模型:
encoder model
编码器模型仅使用 Transformer 模型的编码器。在每个阶段,注意力层都可以访问初始句子中的所有单词。这些模型通常具有“双向”注意力的特征,通常称为自动编码模型。
这些模型的预训练通常围绕着以某种方式破坏给定的句子(例如,通过屏蔽其中的随机单词)并让模型找到或重建初始句子。
编码器模型最适合需要理解完整句子的任务,例如句子分类、命名实体识别(以及更一般的单词分类)和提取式问答。
一些主要的encoder模型:
decoder model
解码器模型仅使用 Transformer 模型的解码器。在每个阶段,对于给定的单词,注意力层只能访问句子中位于它之前的单词。这些模型通常称为自回归模型。
解码器模型的预训练通常围绕预测句子中的下一个单词。
这些模型最适合涉及文本生成的任务。
一些主要的decoder模型:
seq2seq model
编码器-解码器模型(也称为序列到序列模型)使用 Transformer 架构的两个部分。在每个阶段,编码器的注意力层可以访问初始句子中的所有单词,而解码器的注意力层只能访问输入中位于给定单词之前的单词。
这些模型的预训练可以使用编码器或解码器模型的目标来完成,但通常涉及更复杂的事情。例如,T5是通过用单个掩码特殊词替换随机文本跨度(可以包含多个词)来预训练的,然后目标是预测这个掩码词替换的文本。
序列到序列模型最适合围绕根据给定输入生成新句子的任务,例如摘要、翻译或生成式问答。
一些主要的seq2seq模型:
总结:
2.Using Transformers
首先介绍了transformer库的一些特点:
-
易于使用:只需两行代码即可下载、加载和使用最先进的 NLP 模型进行推理。
-
灵活性:从本质上讲,所有模型都是简单的 PyTorchnn.Module或 TensorFlowtf.keras.Model类,并且可以像其各自机器学习 (ML) 框架中的任何其他模型一样进行处理。
-
简单性:在整个库中几乎没有任何抽象。“一体化文件”是一个核心概念:模型的前向传递完全定义在单个文件中,因此代码本身是可理解和可破解的。
然后以一些完整的例子来介绍:
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
classifier(
[
"I've been waiting for a HuggingFace course my whole life.",
"I hate this so much!",
]
)
输出:
[{'label': 'POSITIVE', 'score': 0.9598047137260437},
{'label': 'NEGATIVE', 'score': 0.9994558095932007}]
Preprocessing with a tokenizer
正如我们在第 1 章中看到的,这个pipeline将三个步骤组合在一起:预处理、通过模型传递输入和后处理:
与其他神经网络一样,Transformer 模型不能直接处理原始文本,因此我们pipeline的第一步是将文本输入转换为模型可以理解的数字。为此,我们使用了一个tokenizer,它将负责:
- 将输入拆分为称为标记的单词、子词或符号(如标点符号)
- 将每个标记映射到一个整数
- 添加可能对模型有用的其他输入
所有这些预处理都需要以与模型预训练时完全相同的方式完成,因此我们首先需要从Model Hub下载该信息。为此,我们使用AutoTokenizer类及其from_pretrained()方法。
from transformers import AutoTokenizer
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
一旦我们有了tokenizer,我们就可以直接将我们的句子传递给它,我们将得到一个准备好提供给我们模型的字典!唯一要做的就是将输入 ID 列表转换为张量。
raw_inputs = [
"I've been waiting for a HuggingFace course my whole life.",
"I hate this so much!",
]
inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt") #pt代表pytorch
print(inputs)
输出:
{
'input_ids': tensor([
[ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012, 102],
[ 101, 1045, 5223, 2023, 2061, 2172, 999, 102, 0, 0, 0, 0, 0, 0, 0, 0]
]),
'attention_mask': tensor([
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
])
}
然后载入模型:
from transformers import AutoModel
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModel.from_pretrained(checkpoint)
The vector output by the Transformer module is usually large. It generally has three dimensions:
- Batch size: The number of sequences processed at a time (2 in our example).
- Sequence length: The length of the numerical representation of the sequence (16 in our example).
- Hidden size: The vector dimension of each model input.
outputs = model(**inputs)
print(outputs.last_hidden_state.shape)
输出
torch.Size([2, 16, 768])
Model heads: 从数字中寻找意义
The model heads将隐藏状态的高维向量作为输入,并将它们投影到不同的维度上。它们通常由一个或几个线性层组成:
Transformer 模型的输出直接送到模型头进行处理。
在此图中,模型由其嵌入层和后续层表示。嵌入层将标记化输入中的每个输入 ID 转换为表示相关标记的向量。随后的层使用注意力机制操纵这些向量以产生句子的最终表示。
对于我们的示例,我们需要一个带有序列分类头的模型(能够将句子分类为正面或负面)。所以,我们实际上不会使用这个AutoModel类,而是AutoModelForSequenceClassification:
from transformers import AutoModelForSequenceClassification
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
outputs = model(**inputs)
print(outputs.logits.shape)
输出维度
torch.Size([2, 2])
Postprocessing the output 将输出处理为我们需要的类型
我们从模型中获得的作为输出的值本身并不一定有意义。让我们来看看:
print(outputs.logits)
输出:
tensor([[-1.5607, 1.6123],
[ 4.1692, -3.3464]], grad_fn=<AddmmBackward>)
我们的模型预测[-1.5607, 1.6123]了第一句话和[ 4.1692, -3.3464]第二句话。这些不是概率,而是一些实数,即模型最后一层输出的原始非标准化分数。要转换为概率,它们需要经过一个SoftMax层(所有