1 什么是预训练模型?
在自然语言处理(NLP)里,训练一个好模型通常需要很多数据和计算资源。为了解决这个难题,就出现了“预训练模型”。
- 预训练模型 是指我们先在海量文本(比如网络上爬到的大量文章、对话等)上训练出一个“懂语言”的大模型。它已经学会了如何理解和使用语言的大部分规律。
- 之后,你只需要在自己的“小数据”上稍微训练一下(叫“微调”),就能让这个大模型学会完成具体的任务,比如情感分析、文本分类等。
打个比方:
- 预训练模型就好比一个学生先在“全国语文教材”上学习了超多词汇和语法。
- 现在,你只需要教他一些更专业的知识,他就能快速上手,不用从零开始。
2 代表性的预训练模型:BERT、GPT、T5
说到预训练模型,就不能不提到三个“明星选手”:
-
BERT
- 最擅长“理解”文本,因为它可以同时看一个词左右两边的内容,得到上下文信息。
- 常常用于情感分析、阅读理解、问答、文本分类等。
-
GPT
- 最擅长“生成”文本,因为它擅长猜测“下一个词”应该是什么。
- 对话机器人、文本续写、智能写作等场景,会经常用到它。
-
T5
- 强调“把各种NLP任务都当成文本输入和文本输出”的形式。
- 可以做翻译、摘要、分类、问答等等,一种方法适合很多任务。
3 使用 Hugging Face 加载 BERT 进行文本分类
现在,让我们用一个非常具体的小例子,来看看如何利用Hugging Face这个流行的Python库,去调用“预训练好的BERT模型”做文本分类,比如判断一句评论是“正面”还是“负面”。
3.1 环境准备
- 安装
transformers
:pip install transformers
- 安装 PyTorch(或 TensorFlow),我们这里用 PyTorch:
pip install torch
3.2 推理阶段:从文本到结果
下面的代码会演示:
- 加载分词器和模型
- 把一句话变成“模型能看懂的数字”
- 得到模型对这句话的情感判断结果
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch# 1. DistilBERT (已经在SST-2情感分析上微调好)
model_name = "distilbert-base-uncased-finetuned-sst-2-english"# 2. 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)# 3. 预测示例
text = "I really love this movie. The acting is wonderful!"
inputs = tokenizer(text, return_tensors="pt")with torch.no_grad():outputs = model(**inputs)# 4. 返回分类结果
logits = outputs.logits
predicted_class_id = torch.argmax(logits, dim=1).item()
print("Predicted Class ID:", predicted_class_id)
示例输出:
Predicted Class ID: 1
下面分别解释一下每一步:
-
加载分词器:
- 文字本质上是“字符串”,而模型只能理解数字。
- 分词器会把你的句子,比如“love this movie”,变成
[ 101, 2293, 2023, 3185, ... ]
这样的数字列表,然后给出必要的格式信息(attention_mask
等)。
-
加载模型:
- 这里的模型是已经训练好的“DistilBERT情感分析模型”版本,能直接判断文本的情感倾向。
- 你不需要自己写BERT网络结构或训练逻辑,Hugging Face直接帮你搞定了。
-
输入文本并转换成PyTorch需要的张量:
inputs
是一个字典,里面包含了input_ids
、attention_mask
等,是模型需要的输入格式。
-
前向传播(Forward Pass):
- 就是把输入数据喂给模型,模型内部做一系列计算后,输出结果(
outputs
)。 - 因为我们只是想要预测结果,不需要计算梯度,所以用
with torch.no_grad():
能节省内存和加速。
- 就是把输入数据喂给模型,模型内部做一系列计算后,输出结果(
-
得到预测分类:
- 最后,把模型的输出分数 (
logits
) 里最大的那一个类别当作预测结果。 - 不同模型会给出不同类别数。
- 最后,把模型的输出分数 (
3.3 如果要训练或微调模型?
上面的代码只做了“推理”(预测结果)。要想“训练”或“微调(Fine-tuning)”这个模型,就需要多几个步骤:
- 准备好训练数据:比如有几千条电影评论,每条都打上“正面/负面”标签。
- 用 DataLoader 逐批读取:如果你有1万条数据,不可能一次全塞进模型里,那会占用很多内存。
- PyTorch 提供
DataLoader
帮你分批次读数据,比如每次读32条。
- PyTorch 提供
- 前向传播 + 计算损失(Loss):
- 跟推理一样会得到
outputs
,但这回你要跟真实标签比对来算损失值,看模型猜的对不对。
- 跟推理一样会得到
- 反向传播 + 更新模型参数:
- 通过
optimizer.step()
等操作,根据损失值来调整模型的权重,让它下次预测更准。 - 如此循环多次,直到训练结束。
- 通过
总结一下:
- “推理”只需要前向传播,看结果就好,不用算梯度;
- “训练”还要加上计算损失值和反向传播的步骤。
4 为什么要用预训练模型?应用场景是啥?
- 速度更快:不用从头把模型训练到能理解语言的地步,直接用已经“见多识广”的模型做少量微调就能用。
- 效果更好:模型看过的“大量文本”会帮它学到很多词汇和语法知识,对小数据集很友好。
- 适用面广:几乎任何涉及文本的场景都能用上,比如客服聊天机器人、舆情分析、文本审查、问答系统等等。
5 课后练习与思考
-
自己尝试微调
- 找到 IMDb 的电影评论数据,练习用 BERT 做正面/负面分类。
- 调整学习率、批大小等超参数,看看对准确率有多大影响。
-
比较 BERT 和 GPT
- GPT更擅长“生成文本”,BERT更擅长“理解文本”。如果你只想做分类,BERT常常更好;如果你想写文章、做对话,GPT是更好选手。
- 不妨亲自试试,感受一下它们的差异。
-
试试 T5
- 把分类任务也当成“文本生成”:输入:“This is an awesome movie.”,让模型输出:“positive”。看看 T5 表现如何。
总结
在这章里,我们了解了预训练模型的基本概念,认识了BERT、GPT、T5这三位“明星”;然后用一个小例子实际演示了如何用Hugging Face的工具快速完成“加载分词器—>转成张量—>前向传播—>预测结果”这四步。我们还提到,如果想“训练”或“微调”,需要多加“计算损失”和“反向传播”这两个步骤。
掌握了这些,你就能灵活运用现有的大模型来完成各种NLP任务,再也不用从零写代码、找海量数据、苦哈哈地训练啦!这也是现在NLP最常见、最高效的做法。祝你学习愉快!