一、什么是预训练模型?
预训练模型是指在海量数据上提前训练好的模型,可以直接用于下游任务,如情感分类、问答、文本生成等,节省训练时间,提升精度。
典型模型包括:
-
BERT:适合分类、问答、抽取任务
-
GPT:适合文本生成、对话
-
RoBERTa、DistilBERT、T5、XLNet、ERNIE 等
二、安装 Hugging Face Transformers 库
在命令行中输入:
pip install transformers
还可搭配:
pip install torch
三、加载预训练模型与分词器
下面以 bert-base-uncased
为例:
1. 加载 Tokenizer(分词器)
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
2. 加载预训练模型(无下游任务头)
from transformers import BertModel
model = BertModel.from_pretrained('bert-base-uncased')
这时模型已准备好,可用于提取语义特征。
四、输入编码与输出获取
import torch
text = "Transformers are powerful models."
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
print(outputs.last_hidden_state.shape) # [batch_size, seq_len, hidden_dim]
其中:
-
inputs
: 包含 input_ids、attention_mask -
outputs.last_hidden_state
: 每个 token 的语义向量
五、使用 BERT 做分类(有下游任务头)
from transformers import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
inputs = tokenizer("I love AI.", return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
predicted = torch.argmax(logits, dim=1)
print("预测标签:", predicted.item())
此模型在预训练 BERT 上加了一个线性分类层,可直接 fine-tune 用于二分类任务。
六、加载中文预训练模型
以哈工大 BERT 为例:
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
inputs = tokenizer("今天天气不错。", return_tensors="pt")
outputs = model(**inputs)
七、如何微调(finetune)
在自有数据集上进行训练,需要使用 Trainer
或 Trainer + Dataset
结构:
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(output_dir="./results", num_train_epochs=3)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset
)
trainer.train()
train_dataset
与eval_dataset
可用datasets
库加载如 GLUE、SST-2、MNLI 等,也可自定义。
八、文本生成模型的加载与使用(以 GPT2 为例)
from transformers import GPT2LMHeadModel, GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2")
input_ids = tokenizer("Once upon a time", return_tensors="pt").input_ids
outputs = model.generate(input_ids, max_new_tokens=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
九、快速总结:常见模型一览
模型 | 适用方向 | 任务示例 |
---|---|---|
BERT | 编码器模型 | 分类、问答、抽取 |
RoBERTa | 强化版 BERT | 同上 |
DistilBERT | 轻量版 BERT | 快速推理 |
GPT2/GPT3/GPT4 | 解码器模型 | 文本生成、对话 |
T5 | 编码器-解码器 | 文本摘要、翻译 |
十、结语
通过预训练模型 + Transformers 工具库,即使没有强大的计算资源,也可以利用大模型完成高质量的 NLP 任务。