1 特点
1.1 易于使用:下载、加载和使用最先进的NLP模型进行推理只需两行代码即可完成。
1.2 灵活:所有型号的核心都是简单的PyTorch nn.Module 或者 TensorFlow tf.kears.Model,可以像它们各自的机器学习(ML)框架中的任何其他模型一样进行处理。
1.3 简单:当前位置整个库几乎没有任何摘要。“都在一个文件中”是一个核心概念:模型的正向传递完全定义在一个文件中,因此代码本身是可以理解的,并且是可以破解的。
2 管道的内部
2.1 使用分词器进行预处理
2.1.1 Transformer模型无法直接处理原始文本, 因此我们管道的第一步是将文本输入转换为模型能够理解的数字
2.1.2 tokenizer(标记器),负责
- 将输入拆分为单词、子单词或符号(如标点符号),称为标记(token)
- 将每个标记(token)映射到一个整数
- 添加可能对模型有用的其他输入
使用 - 通过from_pretrained 指定模型(checkpoint)
- 指定要返回的张量类型(PyTorch、TensorFlow或plain NumPy),我们使用return_tensors参数
输出-高维向量?- 矢量输出通常较大。它通常有三个维度
- Batch size: 一次处理的序列数(在我们的示例中为2)。
- Sequence length: 序列的数值表示的长度(在我们的示例中为16)。
- Hidden size: 每个模型输入的向量维度。-高维向量
- 最后一个值,它被称为“高维”。隐藏的大小可能非常大(768通常用于较小的型号,而在较大的型号中,这可能达到3072或更大
- 矢量输出通常较大。它通常有三个维度
outputs = model(**inputs)
print(outputs.last_hidden_state.shape)
2.2 Model heads: Making sense out of numbers
2.2.1 模型头将隐藏状态的高维向量作为输入,并将其投影到不同的维度。它们通常由一个或几个线性层组成:
2.2.2
2.3 对输出进行后处理
2.4 语言建模 Pipeline 的顺序
2.4.1 标记器(Tokenizer) 处理文本并返回 id。模型处理这些 id 并输出一个预测。然后可以再次使用 标记器(Tokenizer) 将这些预测转换回某些文本
3 名词
3.1 checkpoint
3.1.1 name of our model
3.1.2 已经预训练好的模型,使用from_pretrained() 装载
4 模型
4.1 automodel
4.1.1 AutoModel类及其所有相关项实际上是对库中各种可用模型的简单包装。它是一个聪明的包装器,因为它可以自动猜测检查点的适当模型体系结构,然后用该体系结构实例化模型。
4.1.2 如果您知道要使用的模型类型,则可以使用直接定义其体系结构的类
4.1.3 AutoModel只需要知道初始化的Checkpoint(检查点)就可以返回正确的体系结构
4.2 随机值对其进行初始化
4.2.1 该模型可以在这种状态下使用,但会输出胡言乱语
from transformers import BertConfig, BertModel
config = BertConfig()
model = BertModel(config)
# Model is randomly initialized!
4.3 pretrained函数
4.3.1 本质是使用训练后的参数来运行模型
from transformers import BertModel
model = BertModel.from_pretrained("bert-base-cased")
4.3.3 下载cache目录
通过Hugging Face的Transformers库自动下载模型,会先缓存在默认路径:
Linux:‘~/.cache/huggingface/hub’
Windows :C:\Users\username.cache\huggingface\hub
https://blog.csdn.net/yyh2508298730/article/details/137773125
4.4 保存模型
4.4.1 model.save_pretrained(“directory_on_my_computer”)
4.4.2 会将两个文件保存到磁盘
config.json pytorch_model.bin
4.4.3 如果你使用的是Hugging Face的Transformers库,并且想要自定义模型的保存路径,你可以通过设置环境变量HF_HOME或HUGGINGFACE_HUB_CACHE来全局修改默认路径。这样,当你调用save_pretrained方法时,模型将会保存到你指定的新路径中
4.5 使用Transformers模型进行推理
4.5.1 ransformer模型只能处理数字——分词器生成的数字
4.5.2 输入
使用张量作为模型的输入
output = model(model_inputs)
model_inputs = torch.tensor(encoded_sequences)
4.6 Transformer模型的输出有多少个维度
4.6.1 3个维度,分别是: 序列长度(Sequence Length)、批次大小(Batch Size)和隐藏层大小(Hidden Size)
4.7 head层
4.7.1 一个附加组件,通常由一个或几个层组成,用于将Transformer的预测转换为特定于任务的输出
4.7.2 自注意力层确实包含注意力“Head”层
4.8 Tokenizer(标记器)和模型应该来自相同的Checkpoint(检查点)。
5 标记器(Tokenizer)
5.1 标记器(Tokenizer)是 NLP 管道的核心组件之一。它们有一个目的:将文本转换为模型可以处理的数据。模型只能处理数字,因此标记器(Tokenizer)需要将我们的文本输入转换为数字数据。
5.2 类型
5.2.1 基础
基于词的(Word-based)
第一种标记器是基于词的(word-based).它通常很容易设置和使用,只需几条规则,并且通常会产生不错的结果
每个单词都分配了一个 ID,从 0 开始一直到词汇表的大小。该模型使用这些 ID 来识别每个单词
需要一个自定义标记(token)来表示不在我们词汇表中的单词。这被称为“未知”标记(token),通常表示为“[UNK]”或”“
减少未知标记数量的一种方法是使用更深一层的标记器(tokenizer),即基于字符的(character-based)标记器(tokenizer)。
基于字符(Character-based)
基于字符的标记器(tokenizer)将文本拆分为字符,而不是单词。这有两个主要好处:
词汇量要小得多。
词汇外(未知)标记(token)要少得多,因为每个单词都可以从字符构建。
问题
从直觉上讲,它的意义不大:每个字符本身并没有多大意义,而单词就是这种情况
在中文中,每个字符比拉丁语言中的字符包含更多的信息。
我们的模型最终会处理大量的词符(token):虽然使用基于单词的标记器(tokenizer),单词只会是单个标记,但当转换为字符时,它很容易变成 10 个或更多的词符(token)
子词标记化(subword tokenization)
子词分词算法依赖于这样一个原则,即不应将常用词拆分为更小的子词,而应将稀有词分解为有意义的子词。
子词
“annoyingly”可能被认为是一个罕见的词,可以分解为“annoying”和“ly”。这两者都可能作为独立的子词出现得更频繁,同时“annoyingly”的含义由“annoying”和“ly”的复合含义保持
5.2.2 其它模型使用的tokenizer
Byte-level BPE, 用于 GPT-2
WordPiece, 用于 BERT
SentencePiece or Unigram, 用于多个多语言模型
5.3 加载和保存-和模型一致
5.3.1 load
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
5.3.2 save
tokenizer.save_pretrained("directory_on_my_computer")
5.4 编码
5.4.1 文本翻译成数字被称为编码(encoding).编码分两步完成:标记化,然后转换为输入 ID
标记化过程由标记器(tokenizer)的tokenize() 方法实现:
5.4.2 第一步是将文本拆分为单词(或单词的一部分、标点符号等),通常称为标记(token)
输入 ID 的转换由标记器(tokenizer)的convert_tokens_to_ids()方法实现:
5.4.3 实际上不用分别调用
tokenizer(“Using a Transformer network is simple”)
5.5 解码
5.5.1 解码(Decoding) 正好相反:从词汇索引中,我们想要得到一个字符串。这可以通过 decode() 方法实现
decoded_string = tokenizer.decode([7993, 170, 11303, 1200, 2443, 1110, 3014])
print(decoded_string)
5.5.2 decode 方法不仅将索引转换回标记(token),还将属于相同单词的标记(token)组合在一起以生成可读的句子
6 处理多个序列
6.1 问题
6.1.1 我们如何处理多个序列?
6.1.2 我们如何处理多个序列不同长度?
6.1.3 词汇索引是让模型正常工作的唯一输入吗?
6.1.4 是否存在序列太长的问题?
6.2 数字列表转换为张量
6.2.1 方式1
tokenized_inputs = tokenizer(sequence, return_tensors=“pt”)
print(tokenized_inputs[“input_ids”])
6.2.2 方式2-隐式转换
input_ids = torch.tensor([ids])
6.3 Batching 是一次通过模型发送多个句子的行为
6.4 填充输入
6.4.1 将多个不等长度的序列(id)转为张量-tensor
6.4.2 Padding通过在值较少的句子中添加一个名为Padding token的特殊单词来确保我们所有的句子长度相同
6.5 Attention masks
6.5.1 Attention masks是与输入ID张量形状完全相同的张量,用0和1填充:1s表示应注意相应的标记,0s表示不应注意相应的标记(即,模型的注意力层应忽略它们)。
6.6 长序列
6.6.1 对于Transformers模型,我们可以通过模型的序列长度是有限的。大多数模型处理多达512或1024个令牌的序列,当要求处理更长的序列时,会崩溃。此问题有两种解决方案
使用支持的序列长度较长的模型。
截断序列。
6.6.2 指定max_sequence_length参数
sequence = sequence[:max_sequence_length]
6.7 不同长度的序列批处理
6.7.1 截断是一个正确的方式,可以将他们转化为一个固定长度的矩形序列
6.7.2 填充是一个正确的方式,可以将他们转化为一个固定长度的矩形序列
6.7.3 处理不同长度的序列时,注意力遮蔽是最重要的
7 放在一起
7.1 标记化、到输入ID的转换、填充、截断和注意掩码
7.2 指定pad模式
# Will pad the sequences up to the maximum sequence length
model_inputs = tokenizer(sequences, padding="longest")
# Will pad the sequences up to the model max length
# (512 for BERT or DistilBERT)
model_inputs = tokenizer(sequences, padding="max_length")
# Will pad the sequences up to the specified max length
model_inputs = tokenizer(sequences, padding="max_length", max_length=8)
7.3 截断序列
7.3.1 model_inputs = tokenizer(sequences, max_length=8, truncation=True)
7.4 特定框架张量的转换
7.4.1 # Returns PyTorch tensors
model_inputs = tokenizer(sequences, padding=True, return_tensors=“pt”)
Returns TensorFlow tensors
model_inputs = tokenizer(sequences, padding=True, return_tensors=“tf”)
Returns NumPy arrays
model_inputs = tokenizer(sequences, padding=True, return_tensors=“np”)
7.5 特殊词符(token)
7.5.1 由模型决定是否添加,如何添加
7.5.2 有些模型不添加特殊单词,或者添加不同的单词;模型也可能只在开头或结尾添加这些特殊单词
7.6 Tokenizer(标记器)和模型应该来自相同的Checkpoint(检查点)。