人工智能之语言领域
第十六章 生成式预训练模型
文章目录
- 人工智能之语言领域
- [前言 生成式预训练模型](#前言 生成式预训练模型)
- [16.1 生成式预训练模型概述](#16.1 生成式预训练模型概述)
- [16.1.1 生成式与判别式模型的区别](#16.1.1 生成式与判别式模型的区别)
- [16.1.2 核心应用](#16.1.2 核心应用)
- [16.2 经典生成式模型](#16.2 经典生成式模型)
- [16.2.1 GPT系列模型:架构与迭代历程](#16.2.1 GPT系列模型:架构与迭代历程)
- 架构演进
- [GPT 核心机制](#GPT 核心机制)
- [16.2.2 T5模型:统一文本到文本范式](#16.2.2 T5模型:统一文本到文本范式)
- [16.2.3 BART模型:降噪自编码生成模型](#16.2.3 BART模型:降噪自编码生成模型)
- [16.3 生成式模型的解码策略](#16.3 生成式模型的解码策略)
- [16.3.1 贪心搜索与束搜索(Beam Search)](#16.3.1 贪心搜索与束搜索(Beam Search))
- [16.3.2 采样策略:引入随机性提升多样性](#16.3.2 采样策略:引入随机性提升多样性)
- [(1)随机采样(Random Sampling)](#(1)随机采样(Random Sampling))
- [(2)Top-K 采样](#(2)Top-K 采样)
- [(3)Nucleus 采样(Top-p)](#(3)Nucleus 采样(Top-p))
- [16.4 生成式模型的评估](#16.4 生成式模型的评估)
- [16.4.1 自动评估指标](#16.4.1 自动评估指标)
- [16.4.2 人工评估维度与方法](#16.4.2 人工评估维度与方法)
- [16.5 实战:基于GPT的中文对话生成模型微调](#16.5 实战:基于GPT的中文对话生成模型微调)
- 补充:生成式模型安全与对齐
- 小结
- 资料
前言 生成式预训练模型
生成式预训练模型(Generative Pre-trained Models)是自然语言处理(NLP)迈向通用人工智能 的关键一步。与仅能"理解"语言的判别式模型(如 BERT)不同,生成式模型能够主动创造连贯、合理、多样化的文本,广泛应用于对话系统、内容创作、代码生成等领域。本章将系统讲解生成式模型的核心思想、主流架构(GPT、T5、BART)、解码策略、评估方法,并通过中文对话生成实战演示其微调与部署。
16.1 生成式预训练模型概述
16.1.1 生成式与判别式模型的区别
| 特性 | 判别式模型(Discriminative) | 生成式模型(Generative) |
|---|---|---|
| 目标 | 学习 P(y|x) :给定输入,预测标签 | 学习 P(x) 或 P(x,y) :建模数据分布 |
| 代表模型 | BERT、RoBERTa | GPT、T5、BART |
| 典型任务 | 分类、NER、问答(抽取式) | 文本生成、对话、摘要(生成式) |
| 训练方式 | MLM(掩码预测) | CLM(自回归)或 Seq2Seq(降噪) |
| 输出形式 | 固定标签或 span | 可变长度序列 |
💡 通俗比喻:
- 判别式模型像"阅卷老师":判断句子是否正确
- 生成式模型像"作家":从零开始创作新句子
生成式
输入: '写一首关于春天的诗'
GPT
输出: '春风拂面花自开...'
(全新生成)
判别式
输入: '这部电影很___'
BERT
输出: '好' (填空)
16.1.2 核心应用
- 文本生成:新闻、诗歌、故事创作
- 代码生成:GitHub Copilot(基于 Codex)
- 对话系统:ChatGPT、通义千问、文心一言
- 机器翻译/摘要:T5 将所有任务转为文本生成
16.2 经典生成式模型
16.2.1 GPT系列模型:架构与迭代历程
GPT(Generative Pre-trained Transformer)采用纯解码器(Decoder-only) 架构,通过自回归(Autoregressive) 方式生成文本。
架构演进
| 模型 | 参数量 | 关键创新 | 训练语料 |
|---|---|---|---|
| GPT-1 | 117M | 首次验证 Transformer 解码器生成能力 | BooksCorpus |
| GPT-2 | 1.5B | "Zero-shot" 能力,无需微调 | WebText (40GB) |
| GPT-3 | 175B | 上下文学习(In-context Learning) | Common Crawl + 多源 |
| GPT-3.5/4 | >1T | 多模态、强化学习对齐(RLHF) | 私有超大规模 |
GPT 核心机制
- 因果注意力掩码(Causal Mask):确保预测第 t 个词时只能看到 x_{\\leq t}
- 位置编码:使用可学习的位置嵌入(非正弦)
Causal Mask
注意力矩阵上三角置 -∞
防止信息泄露
Token Sequence:
x₁, x₂, ..., xₜ
Embedding + Position
Transformer Decoder × N
Language Model Head
(Linear + Softmax)
P(xₜ₊₁ | x₁...xₜ)
16.2.2 T5模型:统一文本到文本范式
T5(Text-to-Text Transfer Transformer)由 Google 提出,将所有 NLP 任务转化为"文本到文本"格式。
🌰 任务转换示例:
- 分类:
"cola sentence: This is wrong." → "unacceptable"- 翻译:
"translate English to German: Hello!" → "Hallo!"- 摘要:
"summarize: [长文本] → [摘要]"
架构特点
- Encoder-Decoder 结构(类似 Transformer 原始架构)
- Span Corruption 预训练任务:随机掩盖连续片段,用 sentinel token 替代
python
# 输入: "The <X> brown <Y> jumps."
# 目标: "<X> quick <Y> fox"
✅ 优势:统一框架简化多任务训练与推理
16.2.3 BART模型:降噪自编码生成模型
BART(Bidirectional and Auto-Regressive Transformers)结合 BERT 的双向编码与 GPT 的自回归解码。
预训练任务:文本降噪(Denoising)
- 对输入加噪声(删除、打乱、掩码等)
- 用 Encoder 编码加噪文本
- 用 Decoder 重建原始文本
原始文本:
I love NLP.
加噪:
I [MASK] [MASK].
Encoder
(双向)
Decoder
(自回归)
重建:
I love NLP.
📊 适用场景:文本摘要、对话生成、翻译(尤其适合需要理解全文的任务)
16.3 生成式模型的解码策略
解码策略决定如何从概率分布中选择下一个词,直接影响生成质量。
16.3.1 贪心搜索与束搜索(Beam Search)
| 方法 | 描述 | 优缺点 |
|---|---|---|
| 贪心搜索 | 每步选概率最高的词 | 快但易重复、局部最优 |
| 束搜索 | 保留 top-k 个候选序列(k=beam size) | 更优但计算量大 |
python
# Hugging Face 中使用 beam search
generated = model.generate(
input_ids,
max_length=50,
num_beams=5, # 束宽
early_stopping=True # 找到 EOS 即停
)
⚠️ 问题 :束搜索易产生重复、保守的文本(因追求高概率)
16.3.2 采样策略:引入随机性提升多样性
(1)随机采样(Random Sampling)
- 从完整词汇表概率分布中采样
- 问题:可能采到低质量词
(2)Top-K 采样
- 仅从概率最高的 K 个词中采样
- 例:K=50,忽略低概率尾部词
(3)Nucleus 采样(Top-p)
- 动态选择最小词集,使其累积概率 ≥ p
- 例:p=0.9,可能选 10 个或 100 个词(取决于分布)
python
# Hugging Face 采样示例
generated = model.generate(
input_ids,
do_sample=True,
top_k=50, # Top-K
top_p=0.95, # Nucleus
temperature=0.7 # 控制分布平滑度(<1更确定,>1更多样)
)
🔥 Temperature 调节:
- T \\to 0 :趋近贪心搜索
- T = 1 :原始分布
- T \> 1 :分布更均匀,增加随机性
16.4 生成式模型的评估
16.4.1 自动评估指标
| 指标 | 适用任务 | 原理 | 局限 |
|---|---|---|---|
| Perplexity (PPL) | 语言模型 | 衡量预测不确定性(越低越好) | 不反映语义质量 |
| BLEU | 翻译、摘要 | n-gram 重叠度 | 忽略同义词、语序 |
| ROUGE | 摘要 | 召回率导向的 n-gram 匹配 | 同 BLEU |
| METEOR | 翻译 | 引入同义词匹配 | 计算复杂 |
📌 注意:自动指标与人工评价相关性有限,需谨慎解读
16.4.2 人工评估维度与方法
人工评估仍是黄金标准,常用维度:
| 维度 | 说明 |
|---|---|
| 流畅性(Fluency) | 语法是否正确、是否自然 |
| 相关性(Relevance) | 是否回应输入主题 |
| 信息量(Informativeness) | 是否提供新信息(非套话) |
| 一致性(Coherence) | 逻辑是否连贯 |
| 多样性(Diversity) | 多次生成是否重复 |
📊 方法:A/B 测试、Likert 量表(1-5分)、成对比较
16.5 实战:基于GPT的中文对话生成模型微调
任务目标
微调开源中文 GPT 模型(如 ChatGLM、Qwen),实现领域对话生成。
方案选择
- 模型 :
THUDM/chatglm3-6b(高效、支持中文、开源) - 框架:Hugging Face Transformers + PEFT(参数高效微调)
完整代码实现
python
# Step 1: 安装依赖
# pip install transformers accelerate peft bitsandbytes
from transformers import (
AutoTokenizer, AutoModelForCausalLM,
TrainingArguments, Trainer
)
from peft import LoraConfig, get_peft_model
import torch
# Step 2: 加载模型与分词器(4-bit 量化节省显存)
model_name = "THUDM/chatglm3-6b"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_name,
trust_remote_code=True,
load_in_4bit=True, # 4-bit 量化
device_map="auto"
)
# Step 3: 配置 LoRA(仅训练少量参数)
lora_config = LoraConfig(
r=8,
lora_alpha=16,
lora_dropout=0.1,
target_modules=["query_key_value"], # ChatGLM 的注意力层名
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 通常 <1% 参数
# Step 4: 准备对话数据(格式:[{"role": "user", "content": "..."}, ...])
def format_conversation(conversations):
"""将对话历史转为模型输入格式"""
prompt = tokenizer.build_prompt(
query=conversations[-1]["content"],
history=[(conv["content"], "") for conv in conversations[:-1] if conv["role"]=="user"]
)
response = conversations[-1]["content"] if conversations[-1]["role"]=="assistant" else ""
return prompt + response
# 示例数据
train_data = [
[{"role": "user", "content": "你好!"}, {"role": "assistant", "content": "你好呀!有什么我可以帮你的吗?"}],
[{"role": "user", "content": "今天天气怎么样?"}, {"role": "assistant", "content": "我无法获取实时天气,建议查看天气预报哦!"}]
]
# Tokenize
def tokenize_function(examples):
texts = [format_conversation(conv) for conv in examples]
return tokenizer(texts, truncation=True, padding="max_length", max_length=512)
# 假设已构建 Dataset 对象 train_dataset
train_tokenized = train_dataset.map(tokenize_function, batched=True)
# Step 5: 设置训练参数
training_args = TrainingArguments(
output_dir="./chatglm-finetune",
per_device_train_batch_size=1, # 大模型 batch_size 通常=1
gradient_accumulation_steps=8, # 梯度累积等效 batch_size=8
learning_rate=2e-4,
num_train_epochs=3,
logging_steps=10,
save_strategy="epoch",
fp16=True
)
# Step 6: 创建 Trainer 并训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_tokenized,
data_collator=lambda data: {'input_ids': torch.stack([f["input_ids"] for f in data])}
)
trainer.train()
# Step 7: 推理(对话生成)
def chat(query, history=[]):
inputs = tokenizer.build_chat_input(query, history=history, role="user")
outputs = model.generate(
**inputs,
max_new_tokens=128,
do_sample=True,
top_p=0.9,
temperature=0.7
)
response = tokenizer.decode(outputs[0][len(inputs["input_ids"][0]):], skip_special_tokens=True)
return response
# 测试
print(chat("你好!")) # 输出: "你好呀!有什么我可以帮你的吗?"
关键技巧
| 技巧 | 说明 |
|---|---|
| 4-bit 量化 | 使用 bitsandbytes 加载大模型(6B 模型仅需 ~6GB 显存) |
| LoRA 微调 | 避免全参数微调,节省资源 |
| 梯度累积 | 小 batch 下模拟大 batch 效果 |
| 对话模板 | 严格遵循模型训练时的 prompt 格式 |
补充:生成式模型安全与对齐
- 有害内容过滤:训练后添加分类器或 RLHF 对齐人类偏好
- 事实性约束:检索增强生成(RAG)引入外部知识
- 可控生成:通过 prompt engineering 或 control codes 控制风格/主题
小结
生成式预训练模型通过自回归或 Seq2Seq 架构,实现了强大的文本创造能力。GPT 系列引领了纯解码器范式,T5 和 BART 则通过 Encoder-Decoder 结构统一多任务。合理的解码策略(如 nucleus 采样)可平衡质量与多样性,而人工评估仍是衡量生成效果的金标准。通过参数高效微调(如 LoRA),我们能在消费级 GPU 上定制领域对话模型。掌握生成式模型,是构建下一代 AI 应用的核心能力。
资料
咚咚王
《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》