Hugging Face Transformers是当下非常受欢迎的深度学习库,为NLP提供了丰富预训练的模型。由于这个学习库由Hugging Face公司开发,并与Transformers论文一起发布,因此也被称为Hugging Face Transformers。那么这个深度学习库如何使用?跟随站长百科一起来看下。
一、安装轻量级Transformers
1、基础安装(适合新手快速入门)
打开命令行输入这行代码,就能安装一个小巧的Transformers库:
!pip install transformers
装完后在Python里导入:“import transformers“
2、进阶安装(自带更多实用功能)
如果想解锁更多玩法(比如分词、文本生成),建议装这个版本:
!pip install transformers[sentencepiece]
二、Transformer的作用
1、pipeline功能
Transformers里最神奇的是“pipeline()“函数,把模型、文本处理步骤打包好。第一次用的时候会偷偷下载模型和分词器存到本地,下次就不用等了。
目前支持的热门功能包括:
- feature-extraction 特征提取:把一段文字用一个向量来表示;
- fill-mask 填词:把一段文字的某些部分mask住,然后让模型填空;
- ner 命名实体识别:识别文字中出现的人名地名的命名实体;
- question-answering 问答:给定一段文本以及针对它的一个问题,从文本中抽取答案;
- sentiment-analysis 情感分析:一段文本是正面还是负面的情感倾向;
- summarization 摘要:根据一段长文本中生成简短的摘要;
- text-generation文本生成:给定一段文本,让模型补充后面的内容;
- translation 翻译:把一种语言的文字翻译成另一种语言。
2、Transformer模型分工
| Model | Examples | Tasks |
| Encoder 编码器模型 |
ALBERT, BERT, DistilBERT, ELECTRA, RoBERTa | Sentence classification, named entity recognition, extractive question answering 适合需要理解完整句子的任务,例如句子分类、命名实体识别(以及更一般的单词分类)和提取式问答 |
| Decoder 解码器模型 |
CTRL, GPT, GPT-2, Transformer XL | Text generation 解码器模型的预训练通常围绕预测句子中的下一个单词。这些模型最适合涉及文本生成的任务 |
| Encoder-decoder 序列到序列模型 |
BART, T5, Marian, mBART | Summarization, translation, generative question answering 序列到序列模型最适合围绕根据给定输入生成新句子的任务,例如摘要、翻译或生成式问答。 |
三、Using Transformers使用流程
1、pipeline背后流程
第一步:切词器(Tokenizer)把文字变数字
Transformer模型看不懂文字,得先切成单词再转成数字。比如用“AutoTokenizer“加载一个模型:
from transformers import AutoTokenizer
checkpoint = “distilbert-base-uncased-finetuned-sst-2-english”tokenizer = AutoTokenizer.from_pretrained(checkpoint)
padding是自动补全长度,truncation是截断过长的句子
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”)print(inputs)
输出的是这样的数字字典,“input_ids“是单词对应的数字,“attention_mask“标记哪些位置是真实单词(1)哪些是补的空位(0)。
{
‘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]
])}
第二步:模型(Model)处理数字算结果
用“AutoModel“加载模型,把刚才的数字放进去:
from transformers import AutoModel
checkpoint = “distilbert-base-uncased-finetuned-sst-2-english”model = AutoModel.from_pretrained(checkpoint)
输出结果的形状是2句话,每句16个词,每个词768维特征
outputs = model(**inputs)print(outputs.last_hidden_state.shape)
不同任务有专门的模型,比如“ForSequenceClassification“用于分类,“ForQuestionAnswering“用于问答,按需选择就好。
第三步:结果翻译(Post-Processing)
模型输出的是原始分数,需要用SoftMax转成概率(比如情感分析中“正面”和“负面”的概率):
import torch
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)print(predictions)
2、模型操作指南:创建、加载、保存一条龙
自己搭一个模型:
from transformers import BertConfig, BertModel
# Building the configconfig = BertConfig()
# Building the model from the configmodel = BertModel(config)
加载预训练模型:
from transformers import BertModel
model = BertModel.from_pretrained(“bert-base-cased”)
保存模型到本地:
model.save_pretrained(“directory_on_my_computer”)
使用Transformer model:
sequences = [“Hello!”, “Cool.”, “Nice!”]encoded_sequences = [
[101, 7592, 999, 102],
[101, 4658, 1012, 102],
[101, 3835, 999, 102],]
import torch
model_inputs = torch.tensor(encoded_sequences)
3、分词器(Tokenizer)的独家技巧
加载和保存:
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(“bert-base-cased”)tokenizer(“Using a Transformer network is simple”)
# 输出”'{‘input_ids’: [101, 7993, 170, 11303, 1200, 2443, 1110, 3014, 102], ‘token_type_ids’: [0, 0, 0, 0, 0, 0, 0, 0, 0], ‘attention_mask’: [1, 1, 1, 1, 1, 1, 1, 1, 1]}”’
# 保存tokenizer.save_pretrained(“directory_on_my_computer”)
4、批量处理文本
模型一次能处理一批文本,但需要把句子长度对齐(短的补空位,长的截断):
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(“bert-base-cased”)
sequence = “Using a Transformer network is simple”tokens = tokenizer.tokenize(sequence)
print(tokens) # 输出 : [‘Using’, ‘a’, ‘transform’, ‘##er’, ‘network’, ‘is’, ‘simple’]
# 从token 到输入 IDids = tokenizer.convert_tokens_to_ids(tokens)print(ids) # 输出:[7993, 170, 11303, 1200, 2443, 1110, 3014]
5、加载情感分析模型
import torchfrom transformers import AutoTokenizer, AutoModelForSequenceClassification
checkpoint = “distilbert-base-uncased-finetuned-sst-2-english”tokenizer = AutoTokenizer.from_pretrained(checkpoint)model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
sequence = “I’ve been waiting for a HuggingFace course my whole life.”
tokens = tokenizer.tokenize(sequence)ids = tokenizer.convert_tokens_to_ids(tokens)
input_ids = torch.tensor([ids])print(“Input IDs:”, input_ids)
output = model(input_ids)print(“Logits:”, output.logits)
# 输出”’Input IDs: [[ 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012]]Logits: [[-2.7276, 2.8789]]”’
6、处理单句话
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
sequence1_ids = [[200, 200, 200]]sequence2_ids = [[200, 200]]batched_ids = [
[200, 200, 200],
[200, 200, tokenizer.pad_token_id],]
print(model(torch.tensor(sequence1_ids)).logits)print(model(torch.tensor(sequence2_ids)).logits)print(model(torch.tensor(batched_ids)).logits)
# 输出”’tensor([[ 1.5694, -1.3895]], grad_fn=<AddmmBackward>)tensor([[ 0.5803, -0.4125]], grad_fn=<AddmmBackward>)tensor([[ 1.5694, -1.3895], [ 1.3373, -1.2163]], grad_fn=<AddmmBackward>)”’
-
广告合作
-
QQ群号:4114653







