元数据卡
- 前置知识:ch10 Transformer、Vol 12 文本数据处理
- 预计时间:50 分钟
- 核心难度:进阶/深入
- 阅读模式:高度专注
- 完成标志:能解释 Tokenization 原理、理解 BERT vs GPT 的区别、完成一次 Prompt Engineering 实验
你的进度
基于注意力的 Transformer 在工坊里跑起来了。但训练一个 Transformer 需要海量数据——比你能收集到的多得多。
你正发愁的时候,阿花从远方寄来一个硬盘。里面是一个已经训练好的基础模型,附着一张小纸条:“我训了个基础版,你在此基础上改一改应该就能用了。”
这就是预训练与微调的范式。
你的任务
预训练(Pre-training)和微调(Fine-tuning)把深度学习从"每个任务单独训练"带到了"一个基础模型服务于多个任务"。你从 Tokenization 开始,经历 BERT 的编码器范式到 GPT 的解码器范式,最后掌握 Prompt Engineering 这个与预训练模型互动的新方式。
本章分层
- 必读:Tokenization、BERT/GPT 预训练目标、Prompt Engineering 模式
- 选读:LoRA 参数高效微调、RLHF 对齐简介
- 进阶:预训练数据组成与去重策略
破局 · 溯源
你面前是几十 TB 的文本——整个互联网上的文章、书籍、代码。这些数据没有标注(没有人给它们打标签"这篇在讲什么"),但它们包含了语言的全部结构。
如果能让模型先在这些数据上"自学"(预训练),它就能学到语言的基本规律——单词含义、语法结构、常识知识。然后只需要给少量"教学示例"(微调)就能适配具体任务。这就是"基础模型(Foundation Model)"的诞生。
Tokenization
计算机不认识"文字",只认识数字。Tokenization 把文本变成整数序列。
# 使用 Hugging Face Tokenizers
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
text = "The cat sat on the mat."
tokens = tokenizer.tokenize(text)
ids = tokenizer.convert_tokens_to_ids(tokens)
print(f"原始: {text}")
print(f"Token: {tokens}")
print(f"IDs: {ids}")Tokenizer 的三种类型:
- Word-based:按空格/标点切分。简单但词表巨大,"run""runs""running"是三个不同的词。
- Character-based:按字符切分。词表小但序列变长,学习效率低。
- Subword(BPE/WordPiece/SentencePiece):统计最常出现的子词片段作为分词单位,高频词保持完整,罕见词被切分。BERT 使用 WordPiece,GPT 使用 BPE。
# BPE 分词示例:"unhappiness" → ["un", "happiness"]
# "playing" → ["play", "##ing"] (WordPiece 的 ## 表示续前)BERT:双向编码器预训练
BERT(2018)用 Transformer Encoder,在所有层看到左右上下文。预训练目标:
- MLM(Masked Language Model):随机遮盖 15% 的 token,让模型预测被盖住的是什么
- NSP(Next Sentence Prediction):两段文本是否相邻(后续研究中发现不重要)
from transformers import BertForSequenceClassification, BertTokenizer
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)
text = "This movie was fantastic!"
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
outputs = model(**inputs)
print(f"Logits: {outputs.logits}")BERT 的微调:在预训练好的模型头上加一个分类器,在标注数据上做少量全参数更新。由于预训练已经学到了语言表示,微调通常只需要几百到几千个标注样本。
GPT:自回归解码器预训练
GPT(2018~2023 系列)用 Transformer Decoder(或只有 Decoder 的因果语言模型),从左到右单向预测下一个词。预训练目标是标准的语言建模(LM):给定上文,预测下一个 token。
# GPT 的预训练损失:
# L = -sum_t log P(token_t | token_1, ..., token_{t-1})关键区别:
| 特性 | BERT | GPT |
|---|---|---|
| 架构 | Encoder-only | Decoder-only |
| 上下文方向 | 双向(全可见) | 单向(只看左边) |
| 预训练目标 | MLM + NSP | 自回归 LM |
| 适合任务 | 分类/理解/标注 | 生成/对话/续写 |
| 典型模型 | BERT, RoBERTa, DeBERTa | GPT-2/3/4, LLaMA, Mistral |
Prompt Engineering
GPT 系列模型带来的新范式:你不微调模型,而是设计输入(Prompt)来引导生成的输出。
from transformers import pipeline
generator = pipeline('text-generation', model='gpt2')
# Zero-shot:直接问
prompt = "Translate to French: 'The cat is on the table.'"
result = generator(prompt, max_length=50, num_return_sequences=1)
print(result[0]['generated_text'])
# Few-shot:给例子再问
prompt = """
English: Hello -> French: Bonjour
English: Goodbye -> French: Au revoir
English: Thank you -> French:"""
result = generator(prompt, max_length=30, num_return_sequences=1)
print(result[0]['generated_text'])Prompt Engineering 的核心模式:
- Zero-shot:直接指令,不给例子
- Few-shot / In-Context Learning:在 prompt 中放几个例子,模型"现学现用"——不更新权重
- Chain-of-Thought(CoT):"让我们一步一步思考" → 引导模型输出推理过程
- System Prompt:设定模型角色和行为规范
这一范式颠覆了传统的"训练→部署"流程——你现在可以通过改变字符串来控制模型行为。
常见陷阱
- Tokenization 的隐式偏见:不同语言的分词效率不同(英文一个词 1~2 个 token,中文一个字 ~1 个 token),这影响了模型的推理成本。
- BERT 的 MLM 预训练需要计算 [MASK] 位置,生成任务做不了。GPT 生成和微调都用同一个自回归目标,更简洁。
- Prompt 对措辞极其敏感。把"将这个翻译成中文"改成"请翻译以下句子"可能带来完全不同的输出。
- 上下文窗口有限(GPT-3 的 2048 tokens → GPT-4 的 32K → 新模型已达 128K~1M),超出窗口的内容完全不可见。
- Few-shot 的质量比数量重要:3 个精心挑选的例子可能比 10 个随机例子效果好。
通关挑战
- 热身(10 分钟):用 HuggingFace 的 AutoTokenizer,分别用 bert-base-uncased 和 gpt2 切分同一段英文,比较 token 数量差异。
- 挑战(40 分钟):在 huggingface.co/datasets 找到一个文本分类数据集(如 IMDB 情感分析),用 DistilBERT 做微调,达到 90%+ 准确率。
- 观察:设计 3 种不同的 prompts 让 GPT-2 完成同一个任务(如总结一段文字),观察哪种 prompt 更稳定。
旅人笔记
"预训练 + 微调"范式让 NLP 从每个任务单独建模进化到共享一个大型基础模型。Tokenization 是第一步,BERT vs GPT 是两种不同的预训练策略,Prompt Engineering 开创了"与模型对话"的新交互方式。模型越强,微调越少。
-> 下一站预告
预训练和微调只是开始。LLM 部署到真实世界需要对齐、知识更新、工具使用——RLHF、RAG、Agent 是答案。