-
一,Transformers 术语
- 1.1,token、tokenization 和 tokenizer
- 1.2,input IDs
- 1.3,attention mask
- 1.4,eop_token、pad_token、bos_token、eos_token
- 1.5,decoder models
- 1.6,架构与参数
-
二,Transformers 功用
- API 概述
-
三,快速上手
- 3.1,transformer 模型类别
- 3.2,Pipeline
-
3.3,AutoClass
- 3.3.1,AutoTokenizer
- 3.3.2,AutoModel
- 参阅链接
一,Transformers 术语
1.1,token、tokenization 和 tokenizer
token
能够了解为最小语义单元,翻译的话能够是词元、令牌、词,也能够是 word/char/subword,单了解便是单词和标点。
tokenization
是指分词进程,目的是将输入序列划分红一个个词元(token
),保证各个词元具有相对完好和独立的语义,以供后续使命(比方学习 embedding 或作为 LLM 的输入)运用。
在 transformers 库中,tokenizer
便是完成 tokenization
的方针,每个 tokenizer 会有不同的 vocabulary。在代码中,tokenizer 用以将输入文本序列划分红 tokenizer vocabulary 中可用的 tokens
。
举两个 tokenization 例子:
- “VRAM” 一般不在词汇表中,所以其一般会被划分红 “V”, “RA” and “M” 这样的
tokens
。 - 我是中国人->[‘我’, ‘是’, ‘中国人’]
1.2,input IDs
LLM
仅有有必要的输入是 input ids
,本质是 tokens
索引(token indices in tokenizer vocabulary),即数字 ID 数组,从而符合模型输入的要求。
- 将输入文本序列转换成 tokens,即 tokenized 进程;
- 将输入文本序列转换成 input ids,即输入编码进程,数值对应的是 tokenizer 词汇表中的索引,
Transformer 库完成了不同模型的 tokenizer。下面代码展示了将输入序列转换成 tokens 和 input_ids 的成果。
from transformers import BertTokenizer
sequence = "A Titan RTX has 24GB of VRAM"
tokenizer = BertTokenizer.from_pretrained("bert-base-multilingual-cased")
tokenized_sequence = tokenizer.tokenize(sequence) # 将输入序列转换成tokens,tokenized 进程
inputs = tokenizer(sequence) # 将输入序列转化成符合模型输入要求的 input_ids,编码进程
encoded_sequence = inputs["input_ids"]
print(tokenized_sequence)
print(encoded_sequence)
print("[INFO]: length of tokenized_sequence and encoded_sequence:", len(tokenized_sequence), len(encoded_sequence))
"""
['A', 'Titan', 'RT', '##X', 'has', '24', '##GB', 'of', 'VR', '##AM']
[101, 138, 28318, 56898, 12674, 10393, 10233, 32469, 10108, 74727, 36535, 102]
[INFO]: length of tokenized_sequence and encoded_sequence: 10 12
"""
值得留意的是,调用 tokenizer() 函数回来的是字典方针,包含相应模型正常工作所需的一切参数,token indices 在键 input_ids
对应的键值中。一起,tokenizer 会主动填充 “special tokens”(如果相关模型依赖它们),这也是 tokenized_sequence 和 encoded_sequence 列表中长度不一致的原因。
decoded_sequence = tokenizer.decode(encoded_sequence)
print(decoded_sequence)
"""
[CLS] A Titan RTX has 24GB of VRAM [SEP]
"""
1.3,attention mask
留意掩码(attention mask
)是一个可选参数,一般在将输入序列进行批处理时运用。作用是告诉咱们哪些 tokens
应该被重视,哪些不必。由于如果输入的序列是一个列表,每个序列长度是不相同的,一般是经过填充的方法把他们处理成同一长度。原始 token id 是咱们需求重视的,填充的 id 是不必重视的。
attention mask 是二进制张量类型,值为 1
的方位索引对应的原始 token
表明应该留意的值,而 0
表明填充值。
示例代码如下:
from transformers import AutoTokenizer
sentence_list = ["We are very happy to show you the Transformers library.",
"Deepspeed is faster"]
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(model_name)
padded_sequences = tokenizer(sentence_list, padding=True, return_tensors="pt")
print(padded_sequences["input_ids"])
print(padded_sequences["attention_mask"])
"""
tensor([[101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102],
[101, 15526, 65998, 54436, 10127, 51524, 102, 0, 0, 0, 0, 0, 0, 0]])
tensor([[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]])
"""
1.4,eop_token、pad_token、bos_token、eos_token
咱们在模型的 checkpoints 目录下的装备文件中,常常能看到 eop_token、pad_token、bos_token、eos_token 这些与文本序列处理相关的特别 token
,它们代表的含义如下:
-
bos_token
(开始符号):它表明文本序列的开始方位。在某些文本生成使命中,或许需求在序列的开头增加一个开始符号,以指示生成文本的开始点。 -
eop_token
(完毕符号):它表明文本序列的完毕方位。在某些文本生成使命中,或许需求在序列中指定一个完毕符号以表明文本的完毕。 -
pad_token
(填充符号):它用于将文本序列填充到相同长度时运用的特别token
。在处理变长文本序列时,较短的序列或许需求经过增加填充符号来与较长的序列对齐。填充符号一般是一个特别的token
,用于填充序列中的空白方位,使得一切序列具有相同的长度。
1.5,decoder models
decoder 模型也称为自回归(auto-regressive)模型、causal language models,其按顺序阅览输入文本并有必要猜测下一个单词,在练习中会阅览增加掩码的句子。
1.6,架构与参数
- 架构:模型的骨架,包含每个层的类别及定义、各个层的连接方法等等内容。
- Checkpoints:给定架构中会被加载的权重。
- 模型:一个抽象的术语,没有“架构”或“参数”那么准确:它能够指两者。
二,Transformers 功用
Transformers 库提供创立 transformer 模型和加载运用同享模型的功用;另外,模型中心(hub)包含数千个能够恣意下载和运用的预练习模型,也支撑用户上传模型到 Hub。
API 概述
Transformers 库的 API
主要包含以下三种:
- MAIN CLASSES:主要包含装备(configuration)、模型(model)、分词器(tokenizer)和流水线(pipeline)这几个最重要的类。
- MODELS:库中和每个模型完成有关的类和函数。
- INTERNAL HELPERS:内部运用的工具类和函数。
三,快速上手
3.1,transformer 模型类别
Transformer 模型架构主要由两个部件组成:
- Encoder (左侧): 编码器接收输入并构建其表明(其特征)。这意味着对模型进行了优化,以从输入中取得了解。
- Decoder (右侧): 解码器运用编码器的表明(特征)以及其他输入来生成方针序列。这意味着该模型已针对生成输出进行了优化。
上述两个部件中的每一个都能够作为模型架构独立运用,具体取决于使命:
- Encoder-only models: 也叫主动编码 Transformer 模型,如 BERT-like 系列模型,适用于需求了解输入的使命。如句子分类和命名实体辨认。
- Decoder-only models: 也叫自回归 Transformer 模型,如 GPT-like 系列模型。适用于生成使命,如文本生成。
- Encoder-decoder models 或许 sequence-to-sequence models: 也被称作序列到序列的 Transformer 模型,如 BART/T5-like 系列模型。适用于需求依据输入进行生成的使命,如翻译或摘要。
下表总结了现在的 transformers 架构模型类别、示例以及适用使命:
模型 | 示例 | 使命 |
---|---|---|
编码器 | ALBERT, BERT, DistilBERT, ELECTRA, RoBERTa | 句子分类、命名实体辨认、从文本中提取答案 |
解码器 | CTRL, GPT, GPT-2, Transformer XL | 文本生成 |
编码器-解码器 | BART, T5, Marian, mBART | 文本摘要、翻译、生成问题的回答 |
3.2,Pipeline
Transformers 库支撑经过 pipeline() 函数设置 task
使命类型参数,来跑通不同模型的推理,可完成一行代码跑通跨不同模态的多种使命,其支撑的使命列表如下:
使命 | 描述 | 模态 | Pipeline |
---|---|---|---|
文本分类 | 为给定的文本序列分配一个标签 | NLP | pipeline(task=”sentiment-analysis”) |
文本生成 | 依据给定的提示生成文本 | NLP | pipeline(task=”text-generation”) |
命名实体辨认 | 为序列里的每个token分配一个标签(人, 安排, 地址等等) | NLP | pipeline(task=”ner”) |
问答体系 | 经过给定的上下文和问题, 在文本中提取答案 | NLP | pipeline(task=”question-answering”) |
掩盖填充 | 猜测出正确的在序列中被掩盖的token | NLP | pipeline(task=”fill-mask”) |
文本摘要 | 为文本序列或文档生成总结 | NLP | pipeline(task=”summarization”) |
文本翻译 | 将文本从一种语言翻译为另一种语言 | NLP | pipeline(task=”translation”) |
图画分类 | 为图画分配一个标签 | Computer vision | pipeline(task=”image-classification”) |
图画切割 | 为图画中每个独立的像素分配标签(支撑语义、全景和实例切割) | Computer vision | pipeline(task=”image-segmentation”) |
方针检测 | 猜测图画中方针方针的边界框和类别 | Computer vision | pipeline(task=”object-detection”) |
音频分类 | 给音频文件分配一个标签 | Audio | pipeline(task=”audio-classification”) |
主动语音辨认 | 将音频文件中的语音提取为文本 | Audio | pipeline(task=”automatic-speech-recognition”) |
视觉问答 | 给定一个图画和一个问题,正确地回答有关图画的问题 | Multimodal | pipeline(task=”vqa”) |
以下代码是经过 pipeline 函数完成对文本的心情分类。
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
print(classifier("I've been waiting for a HuggingFace course my whole life."))
# [{'label': 'POSITIVE', 'score': 0.9598049521446228}]
在 NLP
问题中,除了运用 pipeline()
使命中默认的模型,也能够经过指定 model
和 tokenizer
参数来主动查找相关模型。
3.3,AutoClass
Pipeline() 函数背后实践是经过 “AutoClass” 类,完成经过预练习模型的称号或路径主动查找其架构的快捷方法。经过为使命选择适宜的 AutoClass
和它相关的预处理类,来重现运用 pipeline()
的成果。
3.3.1,AutoTokenizer
分词器(tokenizer
)的作用是担任预处理文本,将输入文本(input prompt)转换为数字数组(array of numbers)来作为模型的输入。tokenization
进程主要的规矩包含:怎么拆分单词和什么样级别的单词应该被拆分。值得留意的是,实例化 tokenizer 和 model 有必要是同一个模型称号或许 checkpoints
路径。
关于 LLM
,一般仍是运用 AutoModel
和 AutoTokenizer
来加载预练习模型和它相关的分词器。
from transformers import AutoModel, AutoTokenizer
tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path)
model = AutoModel.from_pretrained(model_name_or_path, torch_dtype=torch.float16)
一般运用 AutoTokenizer
加载分词器(tokenizer
):
from transformers import AutoTokenizer
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(model_name)
encoding = tokenizer("We are very happy to show you the Transformers library.")
print(encoding)
"""
{'input_ids': [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
"""
tokenizer
的回来是包含了如下“键”的字典:
-
input_ids: 用数字表明的
token
。 -
attention_mask: 应该重视哪些
token
的指示。
tokenizer() 函数还支撑列表作为输入,并可填充和切断文本, 回来具有一致长度的批次:
pt_batch = tokenizer(
["We are very happy to show you the Transformers library.", "We hope you don't hate it."],
padding=True,
truncation=True,
max_length=512,
return_tensors="pt",
)
3.3.2,AutoModel
Transformers 提供了一种简略一致的方法来加载预练习的模型实例,即能够像加载 AutoTokenizer
相同加载 AutoModel
,咱们所需求提供的有必要参数只有模型称号或许 checkpoints
路径,即只需输入初始化的 checkpoint(检查点)或许模型称号就能够回来正确的模型体系结构。示例代码如下所示:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from torch import nn
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(model_name) # 会下载 vocab.txt 词表
# ["We are very happy to show you the Transformers library.", "We hope you don't hate it."],
pt_batch = tokenizer(
"We are very happy to show you the Transformers library.", "We hope you don't hate it.",
padding=True,
truncation=True,
max_length=512,
return_tensors="pt",
)
pt_model = AutoModelForSequenceClassification.from_pretrained(model_name) # 会下载 pytorch_model.bin 模型权重
pt_outputs = pt_model(**pt_batch) # ** 可解包 pt_batch 字典
pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1) # 在 logits上使用softmax函数来查询概率
print(pt_predictions)
print(pt_model.config.id2label) # {0: '1 star', 1: '2 stars', 2: '3 stars', 3: '4 stars', 4: '5 stars'}
留意,Transformers 模型默认情况下需求多个句子,尽管这儿输入是一个句子,但 tokenizer 不只会将输入ID列表转换为张量,还在其顶部增加了一个维度。
程序运转成果输出如下所示。
tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725], [0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=)
参阅链接
- HuggingFace Transformers 官方文档
- NLP Course
- NLP领域中的token和tokenization究竟指的是什么