A-A+

[NLP] transformers 使用指南 Tokenizer

2023年04月28日 15:16 汪洋大海 暂无评论 共5408字 (阅读424 views次)

严格意义上讲 transformers 并不是 PyTorch 的一部分,然而 transformers 与 PyTorch 或 TensorFlow 结合的太紧密了,而且可以把 transformers 看成是 PyTorch 或 TensorFlow 的延伸,所以也在这里一并讨论了。

transformers 内置了 17 种以 transformer 结构为基础的神经网络:

T5 model
DistilBERT model
ALBERT model
CamemBERT model
XLM-RoBERTa model
Longformer model
RoBERTa model
Reformer model
Bert model
OpenAI GPT model
OpenAI GPT-2 model
Transformer-XL model
XLNet model
XLM model
CTRL model
Flaubert model
ELECTRA model

这些模型的参数、用法大同小异。默认框架为 PyTorch,使用 TensorFlow 框架在类的前面加上 'TF" 即可。

每种模型都有至少一个预训练模型,限于篇幅,这里仅仅列举 Bert 的常用预训练模型:

images

完整的预训练模型列表可以在 transformers 官网上找到。

使用 transformers 库有三种方法:

使用 pipeline
指定预训练模型;
使用 AutoModels 加载预训练模型。

transformers.pipeline

这个管线函数包含三个部分:

Tokenizer;

一个模型实例;其它增强模型输出的功能。它只有一个必需参数 task,接受如下变量之一:

feature-extraction
sentiment-analysis
ner
question-answering
fill-mask
summarization
translation_xx_to_yy
text-generation

这个函数还有其它可选参数,但是我的试用经验是,什么都不要动,使用默认参数即可。

例子:

>>> from transformers import pipeline

>>> nlp = pipeline("sentiment-analysis")

>>> print(nlp("I hate you"))
[{'label': 'NEGATIVE', 'score': 0.9991129040718079}]

>>> print(nlp("I love you"))
[{'label': 'POSITIVE', 'score': 0.9998656511306763}]

指定预训练模型 Bert

这里我们以 Bert 为例。

2.1 配置 Bert 模型(可选,推荐不使用)transformers.BertConfig
transformers.BertConfig 可以自定义 Bert 模型的结构,以下参数都是可选的:

vocab_size:词汇数,默认 30522;

hidden_size:编码器内隐藏层神经元数量,默认 768;

num_hidden_layers:编码器内隐藏层层数,默认 12;

num_attention_heads:编码器内注意力头数,默认 12;

intermediate_size:编码器内全连接层的输入维度,默认 3072;

hidden_act:编码器内激活函数,默认 ‘gelu’,还可为 ‘relu’、‘swish’ 或 ‘gelu_new’

hidden_dropout_prob:词嵌入层或编码器的 dropout,默认为 0.1;

attention_probs_dropout_prob:注意力的 dropout,默认为 0.1;

max_position_embeddings:模型使用的最大序列长度,默认为 512;

type_vocab_size:词汇表类别,默认为 2;

initializer_range:神经元权重的标准差,默认为 0.02;

layer_norm_eps:layer normalization 的 epsilon 值,默认为 1e-12.

 

使用方法:

configuration = BertConfig() # 进行模型的配置,变量为空即使用默认参数

model = BertModel(configuration) # 使用自定义配置实例化 Bert 模型

configuration = model.config # 查看模型参数

2.2 分词 transformers.BertTokenizer
所有的 tokenizer 都继承自 transformers.PreTrainedTokenizer 基类,因此有共同的参数和方法实例化的参数有

model_max_length:可选参数,最大输入长度,默认为 1e30;

padding_side:可选参数,填充的方向,应为 ‘left’ 或 ‘right’;

bos_token:可选参数,每句话的起始标记,默认为 ‘’;

eos_token:可选参数,每句话的结束标记,默认为 ‘’;

unk_token:可选参数,未知的标记,默认为 ‘’;

sep_token:可选参数,分隔标记,默认为 ‘’;

pad_token:可选参数,填充标记,默认为 ‘’;

cls_token:可选参数,分类标记,默认为 ‘’;

mask_token:可选参数,遮盖标记,默认为 ‘<MASK’。

 

为了演示,我们先实例化一个 BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-base-cased')

常用的方法有:

from_pretrained(model):载入预训练词汇表;

tokenizer.tokenize(str):分词;

tokenizer.tokenize('Hello word!')

['Hello', 'word', '!']

encode(text, ...):将文本分词后编码为包含对应 id 的列表;

tokenizer.encode('Hello word!')
[101, 8667, 1937, 106, 102]

encode_plus(text, ...):将文本分词后创建一个包含对应 id,token 类型及是否遮盖的词典;

tokenizer.encode_plus('Hello world!')
{'input_ids': [101, 8667, 1937, 106, 102], 'token_type_ids': [0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1]}

convert_ids_to_tokens(ids, skip_special_tokens)


:将 id 映射为 token;

tokenizer.convert_ids_to_tokens(tokens)
['[CLS]', 'Hello', 'word', '!', '[SEP]']

decode(token_ids):将 id 解码;

tokenizer.decode(tokens)
'[CLS] Hello word! [SEP]'

convert_tokens_to_ids(tokens):将 token 映射为 id。

tokenizer.convert_tokens_to_ids(['[CLS]', 'Hello', 'word', '!', '[SEP]'])
[101, 8667, 1937, 106, 102]

2.3 使用预训练模型
根据任务的需要,既可以选择没有为指定任务 finetune 的模型如 transformers.BertModel,也可以选择为指定任务 finetune 之后的模型如 transformers.BertForSequenceClassification。一共有 6 个指定的任务类型:

transformers.BertForMaskedLM:语言模型;

transformers.BertForNextSentencePrediction:判断下一句话是否与上一句有关;

transformers.BertForSequenceClassification:序列分类如 GLUE;

transformers.BertForMultipleChoice:文本分类;

transformers.BertForTokenClassification:token 分类如 NER,

transformers.BertForQuestionAnswering;问答。

3. 使用 AutoModels
使用 AutoModels 与上面的指定模型进行预训练大同小异,只不过是另一种方式加载模型而已。

3.1 加载自动配置 transformers.AutoConfig
使用类方法 from_pretrained 加载模型配置,参数既可以为模型名称,也可以为具体文件。

config = AutoConfig.from_pretrained('bert-base-uncased')
# 或者直接加载模型文件
config = AutoConfig.from_pretrained('./test/bert_saved_model/')

3.2 加载分词器 transformers.AutoTokenizer
与上面的 BertTokenizer 非常相似,也是使用 from_pretrained 类方法加载预训练模型。

tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
# 或者直接加载模型文件
tokenizer = AutoTokenizer.from_pretrained('./test/bert_saved_model/')

3.3 加载模型 transformers.AutoModel
可以使用 from_pretrained 加载预训练模型:

model = AutoModel.from_pretrained('bert-base-uncased')
# 或者直接加载模型文件
model = AutoModel.from_pretrained('./test/bert_model/')

选好了预训练模型以后,只需要给模型接一个全连接层,这个神经网络就搭好了(当然可以根据需要添加更复杂的结构)。

 
tokenizer是进行语言处理的基础,transformer实现分词器的基类是

tokenizer = AutoTokenizer.from_pretrained(tokenizer_type)

后面可以通过from_pretrained函数中的retrained_model_name_or_path()方法,指定路径或者模型名称来加载对应的分词器。

文档给的实例

tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased') # Download vocabulary from S3 and cache.
tokenizer = AutoTokenizer.from_pretrained('./test/bert_saved_model/') # E.g. tokenizer was saved using `save_pretrained('./test/saved_model/')`

分别从Amazon的s3里直接下载以及从本地路径读取。

2.分词器的核心函数
2.1 tokenize
作为分词器,首先一定是进行分词操作。

from transformers.tokenization_bert import BertTokenizer


tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
print("词典大小:",tokenizer.vocab_size)
text = "hello world!I am Lisa."
tokens = tokenizer.tokenize(text)
print("分词结果:",tokens)
##词典大小: 30522

##分词结果: ['hello', 'world', '!', 'I', 'am', 'Lisa', '.']

这里使用了Bert的分词器,注意Bert会将不常用的词汇进行细分,比如fearless,经过分词会给出 'fear','##less'。使用双#号表示连续词汇的分词。

2.2 Encode
编码操作,实现了分词tokenize和词汇的编码convert_tokens_to_ids。首先将会对输入序列进行分词操作,之后将分词的结果进行编码,将词汇转换为词典中的id返回。

self.convert_tokens_to_ids(self.tokenize(text))
##这里的结果是一个列表,包含多个id,如

[24,64,8636,414,125,23,982]

2.3 Decode
解码操作,实现了词汇的解码convert_ids_to_tokens和转换convert_tokens_to_string。首先会将给出的编码输入,如上面的id列表,转换成相应的分词结果,再转换成相应的输入序列。

self.convert_tokens_to_string(self.convert_ids_to_tokens(token_ids))

文章来源:https://www.cnblogs.com/End1ess/p/16165854.html
https://blog.csdn.net/weixin_44614687/article/details/106800244

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言