使用 BERT 进行文本分类
HuggingFace transformers、AutoTokenizer、AutoModelForSequenceClassification 和微调。
使用 BERT 进行文本分类 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
静态嵌入的局限
Word2Vec 和 GloVe 为每个词提供一个固定向量。但在 "river bank" 和 "savings bank" 中,"bank" 的含义不同。像 BERT 这样的上下文模型可以解决这个问题。
BERT 是什么
BERT 是一种变换器模型,会一次性读取整个句子并生成理解上下文的嵌入。它在海量文本上进行预训练,因此可以针对分类等任务进行微调。
Hugging Face 的 transformers 库
transformers 库可以方便地使用 BERT 和数千种预训练模型,并为标记器和模型提供统一的类。
from transformers import AutoTokenizer, AutoModelForSequenceClassification
name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(name)
model = AutoModelForSequenceClassification.from_pretrained(name)AutoTokenizer
AutoTokenizer 会为模型加载正确的标记器。它会将文本拆分为子词标记,并将其映射为模型所需的 ID。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
print(tokenizer.tokenize("unbelievable"))
# subwords like ["un", "##bel", "##ievable"]AutoModelForSequenceClassification
AutoModelForSequenceClassification 会加载顶部带有分类头的 BERT,为整个序列的每个类别输出一个分数。
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained(
"distilbert-base-uncased-finetuned-sst-2-english"
)标记化输入
对文本调用标记器,并使用 truncation、padding 和 return_tensors 获取模型可用的张量。截断会限制过长的输入;填充会使批次中的长度保持一致。
inputs = tokenizer(
"This movie was fantastic!",
truncation=True,
padding=True,
return_tensors="pt",
)
print(inputs["input_ids"].shape)特殊标记
BERT 会自动添加特殊标记:开头的 [CLS](其隐藏状态概括整个序列),以及句子之间或句子末尾的 [SEP]。分类器会读取 [CLS] 表示。
运行模型
将经过标记化的输入传给模型,以获取对数几率,即原始且未经归一化的类别分数。
import torch
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
print(logits)从对数几率得到预测结果
对对数几率应用 softmax 获得概率,然后使用 argmax 获取预测的类别索引。将该索引映射到标签。
import torch
probs = torch.softmax(logits, dim=-1)
pred = torch.argmax(probs, dim=-1).item()
print(model.config.id2label[pred])针对您的任务进行微调
对于自定义数据集,请在带标签的示例上训练分类头(也可以选择训练整个模型),从而对 BERT 进行微调。Trainer API 会处理训练循环。
from transformers import Trainer, TrainingArguments
args = TrainingArguments(output_dir="out", num_train_epochs=3)
trainer = Trainer(model=model, args=args, train_dataset=train_ds)
trainer.train()pipeline 捷径
对于快速推理,pipeline 辅助工具会将标记化、运行和解码封装为一次调用,非常适合原型开发。
from transformers import pipeline
clf = pipeline("sentiment-analysis")
print(clf("I love this product!"))
# [{"label": "POSITIVE", "score": 0.99...}]快速检查
测试您对 BERT 的了解。
总结
总结:BERT 通过变换器生成理解上下文的嵌入。使用 AutoTokenizer 配合 truncation/padding/return_tensors 进行标记化,并使用 AutoModelForSequenceClassification 获取对数几率。先使用 softmax,再使用 argmax 转换对数几率。使用 Trainer 进行微调,或使用 pipeline 快速构建原型。
常见问题解答
「使用 BERT 进行文本分类」课时是免费的吗?
是的 — 「使用 BERT 进行文本分类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「使用 BERT 进行文本分类」这节课中我会学到什么?
HuggingFace transformers、AutoTokenizer、AutoModelForSequenceClassification 和微调。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 BERT 进行文本分类」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Word2Vec:Skip-gram 与 CBOW
- GloVe 与 FastText 嵌入
- 使用 BERT 进行文本分类
- 语义相似度与句子嵌入