如果说BERT是一位阅读理解和分析的高手,那GPT就是一位创作能力出众的写作大师。
在之前的篇章中,我们了解了BERT如何通过双向注意力深刻理解文本,擅长分类、问答等任务。但AI的疆域不止于理解,当我们需要机器“创造”内容时,比如续写一篇文章、完成一首诗,甚至编一个冷笑话,这就是GPT大显身手的舞台。
GPT = Generative Pre-trained Transformer
其核心可以拆解为:生成式 + 预训练 + Transformer解码器。
从OpenAI发布的GPT-1到如今的GPT-4,这一系列模型引领了生成式AI的浪潮,并最终催生了ChatGPT这样的现象级产品。
一、核心思想:单向自回归的语言模型
1. 与BERT的本质区别
GPT与BERT在设计哲学上截然不同,我们可以通过下表清晰地看到二者的对比:
| 维度 |
BERT |
GPT |
| 架构 |
Transformer编码器(双向) |
Transformer解码器(单向) |
| 训练任务 |
掩码语言模型 + 下一句预测 |
标准语言模型(预测下一个词) |
| 注意力 |
每个词可以“看到”所有词 |
每个词只能“看到”它左边的词 |
| 擅长任务 |
理解(分类、NER、问答) |
生成(文本续写、对话) |
| 典型代表 |
BERT-base, RoBERTa |
GPT-2, GPT-3, ChatGPT |
2. 自回归生成
GPT采用自回归的方式生成文本,其过程可以概括为:
- 给定一个初始的提示序列
x₁, x₂, ..., xₜ。
- 模型预测下一个词的概率分布
P(xₜ₊₁ | x₁...xₜ)。
- 从这个分布中采样,得到下一个词
xₜ₊₁。
- 将新生成的
xₜ₊₁ 加入输入序列,重复步骤2-3,直到达到预设的长度或遇到结束符。
这个过程模拟了人类的写作方式:基于已有的文字,一个字一个字地向下推进,始终只依赖已经生成的内容。
GPT模型的核心是Transformer的解码器部分,并对其中的注意力机制进行了关键改造——引入了掩码自注意力。
1. 掩码自注意力
在标准的自注意力中,序列中的每个位置都能“看见”所有位置的信息。但在语言生成任务中,模型在预测当前位置的词时,不应该知道未来词的信息。为此,GPT使用了上三角掩码。
我们用一个简化的注意力分数矩阵来说明,其中1表示“可见”,0表示“被掩码不可见”:
词1 词2 词3 词4
词1 1 0 0 0
词2 1 1 0 0
词3 1 1 1 0
词4 1 1 1 1
这样,位于位置 i 的词,只能关注到位置 ≤i 的词,确保了生成过程的单向性。
2. 堆叠的解码器层
一个GPT模型由多个结构相同的解码器层堆叠而成。每一层都包含:
- 掩码多头自注意力机制
- 前馈神经网络
- 残差连接与层归一化
值得注意的是,GPT的解码器层没有原始Transformer解码器中的“编码器-解码器注意力”子层,因为GPT是纯生成模型,没有独立的编码器输入。
3. GPT家族模型规格
GPT系列模型的发展伴随着参数规模的急剧膨胀:
| 模型 |
参数量 |
层数 |
隐藏层维度 |
注意力头数 |
| GPT-1 |
117M |
12 |
768 |
12 |
| GPT-2 |
1.5B |
48 |
1600 |
25 |
| GPT-3 |
175B |
96 |
12288 |
96 |
| GPT-4 |
未公开 |
- |
- |
- |
三、训练与生成策略
1. 训练目标
GPT的训练目标非常直观:最大化下一个词的概率。给定一个文本序列 x₁, x₂, ..., xₙ,其训练损失函数为标准的语言模型目标:
L = -∑ log P(xᵢ | x₁...xᵢ₋₁)
因此,GPT可以在海量的无标注文本上进行预训练。
- GPT-1:BooksCorpus数据集(约7000本书)。
- GPT-2:WebText数据集(4500万网页)。
- GPT-3:混合数据集(如Common Crawl,总计约570GB文本)。
2. 文本生成策略
训练好的GPT是一个概率模型,从其中采样生成文本有多种策略:
- 贪心搜索:每一步都选择概率最高的词。结果往往短小、重复、不够自然。
- 束搜索:保留多个(束宽)候选序列,最后选择整体概率最高的。虽然减少了错误,但生成的文本依然容易陷入重复模式。
- 随机采样:根据模型输出的概率分布随机挑选下一个词。这带来了多样性,但也可能选中一些不合理或低质量的词。
- Top-k采样:仅从概率最高的k个词中采样,避免选中概率极低的词。
- Top-p(核)采样:目前最常用的策略。它选择累积概率超过p的最小词集,然后在这个集合内重新归一化并采样。这种方法能动态调整候选词的数量。
在采样中,温度参数也至关重要。它通过 logits = logits / temperature 来调整Softmax分布的平滑度。温度越低(<1),分布越尖锐,生成结果越保守和确定;温度越高(>1),分布越均匀,生成结果越随机和多样。
让我们通过HuggingFace Transformers库,实际体验一下GPT-2的文本生成能力。
1. 环境准备
首先,安装必要的库:
pip install transformers torch
2. 基础文本生成
以下代码演示了如何使用GPT-2生成多个续写文本。
from transformers import GPT2LMHeadModel, GPT2Tokenizer
# 加载模型和分词器
model_name = "gpt2" # 也可选择 "gpt2-medium", "gpt2-large", "gpt2-xl"
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
model = GPT2LMHeadModel.from_pretrained(model_name)
# 设置生成参数
prompt = "Once upon a time,"
inputs = tokenizer(prompt, return_tensors="pt")
# 生成文本
outputs = model.generate(
inputs.input_ids,
max_length=50,
num_return_sequences=3,
do_sample=True,
top_p=0.9,
temperature=0.8,
pad_token_id=tokenizer.eos_token_id
)
# 解码并打印输出
for i, output in enumerate(outputs):
text = tokenizer.decode(output, skip_special_tokens=True)
print(f"生成 {i+1}: {text}\n")
3. 条件生成示例
我们可以给模型一个经典的开头,让它续写一首诗:
prompt = "Roses are red, violets are blue,"
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(
inputs.input_ids,
max_length=50,
do_sample=True,
top_k=50,
temperature=0.9
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
五、从GPT-3到ChatGPT的演进
1. GPT-3:规模效应的奇迹
拥有1750亿参数的GPT-3展现了惊人的少样本学习能力。你只需要在提示词中给出几个任务示例,GPT-3就能理解并执行新任务,而无需进行额外的模型微调。
例如,一个情感分类的少样本提示可能是:
文本:这部电影很棒!情感:正面
文本:太无聊了。情感:负面
文本:我喜欢它。情感:
GPT-3会基于前两个例子,自动为第三个句子输出“正面”。
2. InstructGPT与ChatGPT
尽管GPT-3能力强大,但它生成的内容并不总是符合人类的指令或价值观。InstructGPT通过基于人类反馈的强化学习对GPT-3进行微调,极大地提升了模型对指令的遵循能力和输出的有用性、真实性、无害性。
ChatGPT则是在此基础上,进一步针对多轮对话场景进行了优化,最终成为我们熟知的、能够进行流畅自然对话的AI助手。
总结
从GPT-1到GPT-4的发展历程,清晰地证明了“数据规模 + 自回归架构 + Transformer”这条技术路线的巨大潜力。GPT让机器不仅能够理解语言,更能够创造语言。以ChatGPT为代表的大语言模型的出现,无疑开启了一个生成式AI的新纪元。
希望本文能帮助你系统地理解GPT的原理、架构与实战应用。如果你想进一步探讨AIGC相关技术,欢迎在云栈社区的“人工智能”版块与其他开发者交流。