严格意义上讲 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 的常用预训练模型:
模型 模型细节 bert-base-uncased
12-layer, 768-hidden, 12-heads, 110M parameters. Trained on lower-cased English text. bert-large-uncased
24-layer, 1024-hidden, 16-heads, 340M parameters. Trained on lower-cased English text. bert-base-cased
12-layer, 768-hidden, 12-heads, 110M parameters. Trained on cased English text. bert-large-cased
24-layer, 1024-hidden, 16-heads, 340M parameters. Trained on cased English text. bert-base-multilingual-cased
12-layer, 768-hidden, 12-heads, 110M parameters. Trained on cased text in the top 104 languages with the largest Wikipedias bert-base-chinese
12-layer, 768-hidden, 12-heads, 110M parameters. Trained on cased Chinese Simplified and Traditional text. 完整的预训练模型列表可以在 transformers 官网上找到。
使用 transformers 库有三种方法:
使用
pipeline
;指定预训练模型;
使用
AutoModels
加载预训练模型。1.
transformers.pipeline
这个管线函数包含三个部分:
Tokenizer;
一个模型实例;
其它增强模型输出的功能。
它只有一个必需参数
task
,接受如下变量之一:
- ”feature-extraction”
- ”sentiment-analysis”
- ”ner”
- ”question-answering”
- ”fill-mask”
- ”summarization”
- ”translation_xx_to_yy”
- ”text-generation”
这个函数还有其它可选参数,但是我的试用经验是,什么都不要动,使用默认参数即可。
例子:
1 | from transformers import pipeline |
2. 指定预训练模型
这里我们以 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.
使用方法:
1 | configuration = BertConfig() # 进行模型的配置,变量为空即使用默认参数 |
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
:可选参数,遮盖标记,默认为 ‘‘。
为了演示,我们先实例化一个 BertTokenizer
。
1 | tokenizer = BertTokenizer.from_pretrained('bert-base-cased') |
常用的方法有:
from_pretrained(model)
:载入预训练词汇表;tokenizer.tokenize(str)
:分词;1
2'Hello word!') tokenizer.tokenize(
['Hello', 'word', '!']encode(text, ...)
:将文本分词后编码为包含对应 id 的列表;1
2'Hello word!') tokenizer.encode(
[101, 8667, 1937, 106, 102]encode_plus(text, ...)
:将文本分词后创建一个包含对应 id,token 类型及是否遮盖的词典;1
2tokenizer.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;1
2tokenizer.convert_ids_to_tokens(tokens)
['[CLS]', 'Hello', 'word', '!', '[SEP]']decode(token_ids)
:将 id 解码;1
2tokenizer.decode(tokens)
'[CLS] Hello word! [SEP]'convert_tokens_to_ids(tokens)
:将 token 映射为 id。1
2'[CLS]', 'Hello', 'word', '!', '[SEP]']) tokenizer.convert_tokens_to_ids([
[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
加载模型配置,参数既可以为模型名称,也可以为具体文件。
1 | config = AutoConfig.from_pretrained('bert-base-uncased') |
3.2 加载分词器 transformers.AutoTokenizer
与上面的 BertTokenizer
非常相似,也是使用 from_pretrained
类方法加载预训练模型。
1 | tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased') |
3.3 加载模型 transformers.AutoModel
可以使用 from_pretrained
加载预训练模型:
1 | model = AutoModel.from_pretrained('bert-base-uncased') |
选好了预训练模型以后,只需要给模型接一个全连接层,这个神经网络就搭好了(当然可以根据需要添加更复杂的结构)。是不是香?
欢迎关注我的微信公众号“花解语 NLP”: