💻 模块5:从理论到实践——使用Hugging Face的Transformers

本模块预计时长: 1.5-2小时
目标: 使学生能够独立从Hugging Face加载任何Transformer模型,理解其输入和输出,并将其用于常见的分类、生成或问答任务——无需微调。


课程5.1——什么是Hugging Face?民主化Transformers的库

Hugging Face不仅仅是一个库。它是一个完整的语言模型生态系统

🔹 它提供:

  • 🤗 transformers:用于加载、使用和训练模型的主要库。
  • 🧩 datasets:访问数千个现成的数据集。
  • 🏷️ tokenizers:将文本转换为标记的工具(模型理解的输入)。
  • 🧪 evaluate:用于评估模型的标准化指标。
  • 🌐 模型中心:包含数十万个预训练模型的存储库,可随时下载(BERT、GPT-2、T5、Llama、Mistral等)。

🔹 有用的类比:

Hugging Face就像"AI模型的应用商店"。
需要一个总结文本的模型?有几十个。
一个检测情感的模型?有几百个。
一个中文模型?也有。
一个可以在笔记本电脑上运行的小模型?绝对有!
只需搜索、安装和使用。


课程5.2——安装和初始设置

开始之前,我们需要安装库。我们将在干净环境中进行(推荐:Google Colab或本地虚拟环境)。

pip install torch transformers datasets

注意:torch(PyTorch)是Hugging Face默认使用的深度学习框架。你也可以使用TensorFlow,但PyTorch在社区中更常见。


课程5.3——你的第一个模型:加载情感分类器

让我们从简单的开始:一个读取文本并告诉你它是积极还是消极的模型。

我们将使用distilbert-base-uncased-finetuned-sst-2-english,这是一个为此任务预训练的小型、快速模型。

from transformers import pipeline

# 创建文本分类管道
classifier = pipeline("sentiment-analysis")

# 用短语测试
result = classifier("I love this course! It's amazing and very clear.")
print(result)
# 输出: [{'label': 'POSITIVE', 'score': 0.9998}]

就是这样!3行代码,你就有了一个工作的AI模型。

🔹 pipeline做了什么?

  • 自动从中心下载模型和分词器。
  • 预处理文本(分词、填充等)。
  • 运行模型(推理)。
  • 后处理输出(将logits转换为标签和概率)。

课程5.4——理解"管道":最简单的开始方式

Hugging Face为常见任务提供管道:

  • "sentiment-analysis" → 情感分类
  • "text-generation" → 文本生成(GPT-2等)
  • "question-answering" → 问答(BERT等)
  • "translation" → 翻译
  • "summarization" → 摘要
  • "ner" → 命名实体识别(人名、地名等)

示例:使用GPT-2生成文本

generator = pipeline("text-generation", model="gpt2")

text = "The future of artificial intelligence is"
result = generator(text, max_length=50, num_return_sequences=1)
print(result[0]['generated_text'])

可能的输出:

"The future of artificial intelligence is one of the most exciting areas of research today. It has the potential to revolutionize..."


课程5.5——幕后发生了什么?分词、IDs和attention_mask

管道很神奇……但要真正理解发生了什么,我们需要看到手动过程。

让我们采用相同的分类器,逐步进行。

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

# 1. 加载分词器和模型
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

# 2. 对文本进行分词
text = "This movie is absolutely wonderful!"
inputs = tokenizer(text, return_tensors="pt")  # "pt" = PyTorch张量
print(inputs)

输出:

{
  'input_ids': tensor([[  101,  2023,  3042,  2003,  2675, 12712,  1029,   102]]),
  'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1]])
}

🔹 解释:

  • input_ids:每个数字是一个标记。101 = [CLS],102 = [SEP],其余是单词。
  • attention_mask:指示哪些标记是真实的(1)哪些是填充的(0)。这里,所有都是真实的。

课程5.6——手动运行模型

# 3. 将输入传递给模型
outputs = model(**inputs)

# 4. 获取logits(未标准化的输出)
logits = outputs.logits
print("Logits:", logits)  # 例如: tensor([[-4.5, 3.2]])

# 5. 应用softmax获取概率
probabilities = torch.softmax(logits, dim=-1)
print("Probabilities:", probabilities)  # 例如: tensor([[0.001, 0.999]])

# 6. 获取预测标签
predicted_class = torch.argmax(probabilities, dim=-1).item()
labels = ["NEGATIVE", "POSITIVE"]
print("Predicted label:", labels[predicted_class])  # → POSITIVE

🔹 为什么要手动做? 为了理解其工作原理,调试错误,或自定义过程(例如,更改决策阈值)。


课程5.7——如何为你的任务选择正确的模型

并非所有模型都适合所有任务。这里是一个快速指南:

任务 模型类型 Hugging Face上的示例模型
文本分类 仅编码器(BERT风格) bert-base-uncased, distilbert-base-uncased, nlptown/bert-base-multilingual-uncased-sentiment
文本生成 仅解码器(GPT风格) gpt2, facebook/opt-350m, mistralai/Mistral-7B-v0.1(需要更多RAM)
问答(提取式) 仅编码器 bert-large-uncased-whole-word-masking-finetuned-squad, deepset/roberta-base-squad2
翻译/摘要 编码器-解码器 t5-small, facebook/bart-large-cnn, Helsinki-NLP/opus-mt-en-es
命名实体识别(NER) 仅编码器 dslim/bert-base-NER, Jean-Baptiste/roberta-large-ner-english

🔍 提示:Hugging Face模型中心,你可以按以下方式筛选:

  • 任务
  • 语言
  • 模型大小
  • 许可证
  • 框架(PyTorch, TensorFlow)

课程5.8——使用中文模型

是的,有很多中文模型!

示例:中文推文的情感分类。

classifier_zh = pipeline(
    "sentiment-analysis",
    model="nlptown/bert-base-multilingual-uncased-sentiment"
)

result = classifier_zh("这门课程太棒了,强烈推荐!")
print(result)
# 输出: [{'label': '5 stars', 'score': 0.8742}]

另一个更具体的模型:ckiplab/bert-base-chinese-ner (用于中文命名实体识别)。


课程5.9——处理常见错误和解决方案

错误1:"CUDA out of memory"

解决方案:使用较小的模型(distilbert而不是bert-large),或在CPU上运行(较慢,但有效)。

model = AutoModelForSequenceClassification.from_pretrained(model_name).to("cpu")

错误2:文本太长

解决方案:截断文本。

inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)

错误3:找不到模型

解决方案:在模型中心验证确切名称。在网站上使用自动完成。


✍️ 反思练习5.1

选择一个你感兴趣的任务(例如,总结新闻、检测垃圾邮件、翻译短语)。
转到Hugging Face模型中心并找到2-3个候选模型。
比较它们的指标、大小、语言和许可证。
你会选择哪个?为什么?


📊 概念图5.1——使用Hugging Face的推理流程(描述)

文本 → 分词器 → input_ids + attention_mask → 模型 → logits → softmax → 标签 + 概率
          ↑               ↑                          ↑            ↑
      转换为       指示真实       预训练         转换为
      数字       vs 填充标记     神经网络       概率

🧠 模块5总结

Hugging Face消除了使用Transformer模型的入门障碍。
你不再需要数周的设置、昂贵的GPU或深度深度学习知识来开始。
只需几行代码,你就可以让AI模型生成文本、分类情感或回答问题。

但是……这只是开始!在下一个模块中,我们将把所学知识应用到指导项目中:我们将构建一个问答系统,回答关于给定文本的查询——使用预训练模型,无需微调。


Course Info

Course: AI-course2

Language: ZH

Lesson: Module5