Skip to content

元数据卡

  • 前置知识: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 把文本变成整数序列。

python
# 使用 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,在所有层看到左右上下文。预训练目标:

  1. MLM(Masked Language Model):随机遮盖 15% 的 token,让模型预测被盖住的是什么
  2. NSP(Next Sentence Prediction):两段文本是否相邻(后续研究中发现不重要)
python
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})

关键区别:

特性BERTGPT
架构Encoder-onlyDecoder-only
上下文方向双向(全可见)单向(只看左边)
预训练目标MLM + NSP自回归 LM
适合任务分类/理解/标注生成/对话/续写
典型模型BERT, RoBERTa, DeBERTaGPT-2/3/4, LLaMA, Mistral

Prompt Engineering

GPT 系列模型带来的新范式:你不微调模型,而是设计输入(Prompt)来引导生成的输出。

python
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 是答案。

Built with VitePress | Software Systems Atlas