预训练模型
预训练模型是先在海量数据上训练,再微调到具体任务。解决”标注数据少”的核心问题。
flowchart LR A[海量无标注数据] --> B[预训练] B --> C[基础模型] C --> D[少量标注数据] D --> E[微调] E --> F[下游任务]为什么需要预训练?
Section titled “为什么需要预训练?”训练一个 GPT-4 级别的模型需要数亿美元。但大多数人不需要从头训练——用别人预训练好的模型,在自己的数据上微调即可。
两种预训练范式
Section titled “两种预训练范式”BERT 式:编码器预训练
Section titled “BERT 式:编码器预训练”Masked Language Model (MLM):随机遮住 15% 的词,让模型预测:
输入: The [MASK] sat on the mat预测: catfrom transformers import AutoModelForMaskedLM, AutoTokenizer
model = AutoModelForMaskedLM.from_pretrained("bert-base-uncased")tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
text = "The [MASK] is the capital of France."inputs = tokenizer(text, return_tensors="pt")outputs = model(**inputs)
# 找到 [MASK] 位置的预测mask_idx = (inputs["input_ids"] == tokenizer.mask_token_id).nonzero()[0, 1]predicted_id = outputs.logits[0, mask_idx].argmax()print(f"预测: {tokenizer.decode(predicted_id)}") # ParisGPT 式:解码器预训练
Section titled “GPT 式:解码器预训练”Next Token Prediction:给定前文,预测下一个词:
输入: The cat sat on the预测: matfrom transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")tokenizer = AutoTokenizer.from_pretrained("gpt2")
text = "The capital of France is"inputs = tokenizer(text, return_tensors="pt")outputs = model.generate(**inputs, max_new_tokens=5, do_sample=False)print(tokenizer.decode(outputs[0]))# The capital of France is Paris, the capital of微调:适配你的任务
Section titled “微调:适配你的任务”from transformers import AutoModelForSequenceClassification, Trainer, TrainingArguments
# 加载预训练模型,加分类头model = AutoModelForSequenceClassification.from_pretrained( "bert-base-uncased", num_labels=3)
training_args = TrainingArguments( output_dir="./results", num_train_epochs=3, per_device_train_batch_size=8, learning_rate=2e-5,)
trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset,)trainer.train()扩散模型:图像生成
Section titled “扩散模型:图像生成”扩散模型通过逐步去噪生成图像:
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")pipe = pipe.to("cuda")
image = pipe("A cat sitting on a mat, digital art").images[0]image.save("cat.png")常见预训练模型
Section titled “常见预训练模型”| 模型 | 类型 | 参数量 | 用途 |
|---|---|---|---|
| BERT | 编码器 | 110M / 340M | 分类、NER、问答 |
| GPT-2 | 解码器 | 124M-1.5B | 文本生成 |
| T5 | Encoder-Decoder | 60M-11B | 翻译、摘要 |
| CLIP | 双编码器 | 400M | 图文匹配 |
| Stable Diffusion | 扩散 | 860M | 图像生成 |
- Transformer 教程 — 预训练模型的底层架构
- 大模型原理 — 从预训练到对齐