人工智能之语言领域
第十四章 预训练模型
文章目录
- 人工智能之语言领域
- [前言 预训练模型](#前言 预训练模型)
- [14.1 预训练模型的发展与核心思想](#14.1 预训练模型的发展与核心思想)
- [14.1.1 预训练-微调范式的诞生](#14.1.1 预训练-微调范式的诞生)
- [14.1.2 自监督学习在预训练中的应用](#14.1.2 自监督学习在预训练中的应用)
- [14.2 预训练模型的分类](#14.2 预训练模型的分类)
- [14.2.1 自回归预训练模型(Autoregressive)](#14.2.1 自回归预训练模型(Autoregressive))
- [14.2.2 自编码预训练模型(Autoencoding)](#14.2.2 自编码预训练模型(Autoencoding))
- [14.2.3 混合式预训练模型(Encoder-Decoder)](#14.2.3 混合式预训练模型(Encoder-Decoder))
- [14.3 预训练模型的训练任务](#14.3 预训练模型的训练任务)
- [14.3.1 掩码语言模型(MLM)](#14.3.1 掩码语言模型(MLM))
- [14.3.2 下一句预测(NSP)](#14.3.2 下一句预测(NSP))
- [14.3.3 因果语言模型(CLM)](#14.3.3 因果语言模型(CLM))
- [14.4 预训练模型的微调策略](#14.4 预训练模型的微调策略)
- [14.4.1 全参数微调与部分参数微调](#14.4.1 全参数微调与部分参数微调)
- [LoRA 微调示例(使用 PEFT 库)](#LoRA 微调示例(使用 PEFT 库))
- [14.4.2 提示学习(Prompt Learning)与少样本微调](#14.4.2 提示学习(Prompt Learning)与少样本微调)
- [手动提示(Manual Prompt)](#手动提示(Manual Prompt))
- [自动提示(Prompt Tuning)](#自动提示(Prompt Tuning))
- 补充:主流中文预训练模型推荐
- 小结
- 资料
前言 预训练模型
预训练模型(Pre-trained Models, PTMs)是自然语言处理(NLP)近十年来最重大的技术突破之一。它们通过在大规模无标注语料 上进行自监督学习,获得通用的语言理解与生成能力,再通过微调(Fine-tuning) 快速适配下游任务。从 ELMo、GPT 到 BERT、T5,预训练模型彻底改变了 NLP 的研发范式。本章将系统讲解预训练模型的发展脉络、核心思想、分类体系、训练任务与微调策略,并辅以代码实现帮助你深入掌握。
14.1 预训练模型的发展与核心思想
14.1.1 预训练-微调范式的诞生
传统 NLP 流程 :
特征工程 → 模型训练(每个任务独立训练)
→ 耗时、数据依赖强、泛化能力弱
预训练-微调范式:
- 预训练阶段:在海量文本(如维基百科、网页)上训练通用语言模型
- 微调阶段:在特定任务小数据集上微调模型参数
自监督学习
海量无标注文本
通用语言模型\n(e.g., BERT, GPT)
文本分类
命名实体识别
问答系统
机器翻译
✅ 优势:
- 减少对标注数据的依赖
- 提升模型泛化能力
- 实现"一次预训练,多任务复用"
14.1.2 自监督学习在预训练中的应用
自监督学习(Self-Supervised Learning) :
利用数据本身的结构构造监督信号,无需人工标注。
🌰 示例:
原句:"自然语言处理很有趣。"
构造任务:"自然 [MASK] 处理很有趣。" → 预测 "语言"
常见自监督任务:
- 掩码语言建模(MLM):随机遮盖词,预测原词(BERT)
- 因果语言建模(CLM):根据前文预测下一个词(GPT)
- 句子排序/替换检测:判断两句话是否连续(NSP)
14.2 预训练模型的分类
14.2.1 自回归预训练模型(Autoregressive)
特点 :单向建模,只能利用左侧上下文预测当前词。
代表模型:GPT 系列(GPT-1/2/3/4)
训练目标:最大化序列似然
L = ∑ t = 1 T log P ( x t ∣ x < t ) \mathcal{L} = \sum_{t=1}^T \log P(x_t | x_{<t}) L=t=1∑TlogP(xt∣x<t)
x1
x2
x3
x4
预测x₃时,仅能看到x₁,x₂
✅ 优势 :天然适合文本生成
❌ 劣势:无法利用右侧信息,理解能力受限
14.2.2 自编码预训练模型(Autoencoding)
特点 :双向建模,利用左右全部上下文预测被遮盖词。
代表模型:BERT、RoBERTa
训练目标:掩码语言建模(MLM)
L = ∑ i ∈ mask log P ( x i ∣ x masked ) \mathcal{L} = \sum_{i \in \text{mask}} \log P(x_i | x_{\text{masked}}) L=i∈mask∑logP(xi∣xmasked)
x1
x2
x3
x4
预测x₂时,可看到x₁,x₃,x₄
✅ 优势 :强大的语言理解能力
❌ 劣势:预训练与生成任务不一致(不能直接用于生成)
14.2.3 混合式预训练模型(Encoder-Decoder)
特点:结合编码器(双向)与解码器(单向),统一理解与生成。
代表模型:T5、BART、UL2
架构:Transformer Encoder-Decoder
训练方式:
- T5:将所有任务转为"文本到文本"格式(如"summarize: 原文 → 摘要")
- BART:加噪+重建(如删除、打乱词序后恢复)
输入: 原文
Encoder\n(双向)
Decoder\n(单向)
输出: 摘要/翻译/标签
✅ 优势 :统一框架支持多种任务
📊 性能:在生成与理解任务上均表现优异
14.3 预训练模型的训练任务
14.3.1 掩码语言模型(MLM)
步骤:
- 随机选择 15% 的 token
- 其中:
- 80% 替换为
[MASK] - 10% 替换为随机词
- 10% 保持不变
- 80% 替换为
- 预测原始 token
python
# Hugging Face Transformers 中的 MLM 示例
from transformers import BertTokenizer, BertForMaskedLM
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForMaskedLM.from_pretrained('bert-base-chinese')
text = "自然[MASK]处理很有趣"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
predictions = outputs.logits
# 获取 [MASK] 位置的预测
mask_token_index = torch.where(inputs.input_ids == tokenizer.mask_token_id)[1]
mask_token_logits = predictions[0, mask_token_index, :]
top_tokens = torch.topk(mask_token_logits, 5, dim=1).indices[0].tolist()
print("预测结果:", [tokenizer.decode([token]) for token in top_tokens])
# 输出: ['语言', '文字', '语音', ...]
💡 为什么不用 100% [MASK] ?
防止微调时出现预训练未见过的
[MASK]token
14.3.2 下一句预测(NSP)
任务:判断句子 B 是否是句子 A 的下一句。
- 正样本:A + B(真实连续)
- 负样本:A + 随机句子
⚠️ 争议:后续研究(如 RoBERTa)发现 NSP 对多数任务无益,常被弃用
14.3.3 因果语言模型(CLM)
任务:给定前缀,预测下一个词。
python
from transformers import GPT2Tokenizer, GPT2LMHeadModel
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
input_text = "Today is a beautiful"
inputs = tokenizer(input_text, return_tensors="pt")
outputs = model.generate(
inputs.input_ids,
max_length=20,
do_sample=True,
temperature=0.8
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# 输出: "Today is a beautiful day to go for a walk."
🔒 实现关键 :使用注意力掩码防止看到未来词
14.4 预训练模型的微调策略
14.4.1 全参数微调与部分参数微调
| 方法 | 描述 | 适用场景 |
|---|---|---|
| 全参数微调 | 更新所有模型参数 | 数据充足、计算资源足 |
| 部分微调 | 仅更新部分层(如最后几层) | 小数据、防过拟合 |
| 适配器(Adapter) | 在每层插入小型可训练模块 | 多任务共享主干 |
| LoRA(Low-Rank Adaptation) | 用低秩矩阵近似权重更新 | 大模型高效微调 |
LoRA 微调示例(使用 PEFT 库)
python
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=8, # 低秩维度
lora_alpha=16,
target_modules=["q_proj", "v_proj"], # 作用于注意力层
lora_dropout=0.1,
bias="none"
)
model = AutoModelForSequenceClassification.from_pretrained("bert-base-chinese")
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 仅训练 0.1% 参数
14.4.2 提示学习(Prompt Learning)与少样本微调
问题 :标准微调在极少量样本(few-shot)下效果差。
提示学习(Prompting) :将下游任务重构为预训练任务的形式。
🌰 文本分类 → 填空任务
原任务:判断"这部电影太棒了!"的情感 → 正面
提示模板:
"这部电影太棒了!总的来说,这是一部 [MASK] 的电影。"
预测 [MASK] 为 "好" → 正面
转换
情感分类
填空任务
预训练模型
预测 [MASK]
映射为标签
手动提示(Manual Prompt)
python
template = "这句话的情感是[MASK]。{}"
input_text = template.format("服务态度很差")
# 预测 [MASK] 为 "负面"
自动提示(Prompt Tuning)
- 可学习的 soft prompt(连续向量)
- 不修改模型参数,仅优化 prompt embeddings
✅ 优势:
- 少样本场景性能显著提升
- 减少任务间差异(统一为 MLM/CLM)
补充:主流中文预训练模型推荐
| 模型 | 类型 | 特点 | Hugging Face 模型 ID |
|---|---|---|---|
| BERT-wwm-ext | 自编码 | 全词掩码,中文优化 | hfl/chinese-bert-wwm-ext |
| MacBERT | 自编码 | 用相似词替代 [MASK] | hfl/chinese-macbert-base |
| ChatGLM | 自回归 | 支持对话、高效推理 | THUDM/chatglm3-6b |
| Qwen | 混合 | 阿里通义千问系列 | Qwen/Qwen-7B-Chat |
| Baichuan | 自回归 | 百川大模型 | baichuan-inc/Baichuan2-7B-Chat |
小结
预训练模型通过自监督学习 在海量文本中学习通用语言知识,形成"预训练 + 微调 "的新范式。从自回归 (GPT)到自编码 (BERT),再到混合式 (T5),模型架构不断演进。微调策略也从全参数更新发展到LoRA、提示学习等高效方法,极大降低了大模型应用门槛。掌握预训练模型的原理与使用,是现代 NLP 工程师的核心能力。
资料
咚咚王
《Python 编程:从入门到实践》
《利用 Python 进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第 3 版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow 机器学习实战指南》
《Sklearn 与 TensorFlow 机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python 深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习 +(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第 2 版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨 +&+ 张孜铭
《AIGC 原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战 AI 大模型》
《AI 3.0》