一、开篇:如果说BERT是阅读理解高手,那GPT就是写作大师
昨天你学习了BERT——它通过双向注意力理解文本,擅长分类、问答、实体识别等理解型任务。
但如果我们想要AI写出一段文字呢?比如:
这就是GPT的舞台。
GPT = Generative Pre-trained Transformer
核心:生成式 + 预训练 + Transformer解码器
GPT系列模型(由OpenAI开发)从GPT-1到GPT-4,一路引领了生成式AI的浪潮,最终催生了ChatGPT这个现象级产品。
二、GPT的核心思想:单向的、自回归的语言模型
2.1 与BERT的本质区别
2.2 自回归生成
GPT采用自回归(autoregressive)方式生成文本:
给定初始提示 x₁, x₂, ..., xₜ
模型预测下一个词的概率分布 P(xₜ₊₁ | x₁...xₜ)
采样得到 xₜ₊₁
将 xₜ₊₁ 加入输入,重复直到达到终止条件
这个过程就像人类写作:一个字一个字地往下写,永远只依赖已经写过的内容。
三、GPT的架构:Transformer解码器
GPT使用的是Transformer的解码器部分,并对注意力层进行了修改——掩码自注意力。
3.1 掩码自注意力
在标准的自注意力中,每个位置可以看见所有位置。但在GPT中,为了让模型在预测下一个词时看不到未来的词,我们引入上三角掩码:
注意力分数矩阵: 词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 的位置。
3.2 堆叠解码器层
GPT由多个相同的解码器层堆叠而成。每个解码器层包含:
掩码多头自注意力
前馈网络(FFN)
残差连接 + 层归一化
与原始Transformer解码器不同,GPT没有编码器-解码器注意力层(因为没有编码器输入)。
3.3 模型规格(GPT家族)
四、GPT的训练:标准语言模型
GPT的训练目标很简单:最大化下一个词的概率。
给定一个文本序列 x₁, x₂, ..., xₙ,模型计算:
L = -∑ log P(xᵢ | x₁...xᵢ₋₁)
也就是传统的语言模型目标。因此GPT的训练完全可以在海量无标注文本上进行。
训练数据:
五、GPT的生成策略
训练好的GPT是一个概率模型,从它生成文本有多种策略:
5.1 贪心搜索(Greedy Search)
每一步选概率最大的词。结果往往短、重复、不自然。
5.2 束搜索(Beam Search)
保留多个候选序列(束宽),最后选整体概率最高的。常用于机器翻译,但生成文本也易重复。
5.3 随机采样(Random Sampling)
根据概率分布随机采样下一个词。引入随机性,使生成更多样。
import torch# 假设logits是模型输出的原始分数(未经过softmax)probs = torch.softmax(logits, dim=-1)next_token = torch.multinomial(probs, num_samples=1)
5.4 Top-k 采样
只从概率最高的k个词中采样,避免采到极低概率词。
5.5 Top-p(Nucleus)采样
选择累积概率超过p的最小词集,然后重新归一化采样。目前最常用的生成策略。
# 使用HuggingFace时output = model.generate(input_ids, do_sample=True, top_p=0.9, max_length=100)
5.6 温度参数(Temperature)
调整softmax的平滑度:logits = logits / temperature。温度越低(<1),分布越尖锐,生成更保守;温度越高(>1),分布越均匀,生成更随机。
六、实战:用GPT-2生成文本
我们将使用 transformers 库加载GPT-2并生成文本。
6.1 安装与环境
pip install transformers torch
6.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")
6.3 条件生成(给定前缀)
GPT可以基于任何前缀续写。我们可以尝试写一首诗:
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))
6.4 控制生成长度和结束标记
GPT-2默认遇到 <|endoftext|> 才停止。可以设置 eos_token_id 和 pad_token_id。
model.config.pad_token_id = model.config.eos_token_id
七、GPT-3的突破与InstructGPT
7.1 GPT-3:规模的力量
GPT-3拥有1750亿参数,展现出惊人的少样本学习(few-shot learning)能力。只需在提示中给几个例子,GPT-3就能理解任务并完成,无需微调。
示例(情感分类的few-shot提示):
文本:这部电影很棒!情感:正面文本:太无聊了。情感:负面文本:我喜欢它。情感:
GPT-3会自动输出“正面”。
7.2 InstructGPT & ChatGPT
GPT-3虽然强大,但常常生成与人类意图不符的内容。InstructGPT通过人类反馈强化学习(RLHF)进行微调,让模型更符合指令。
ChatGPT则是基于InstructGPT的对话优化版本,引入了多轮对话的训练,成为现象级产品。
总结:生成式AI的新纪元
GPT从1.0到4.0,证明了规模+自回归+Transformer的威力。它让机器不仅能理解语言,还能创造语言。ChatGPT的出现,让通用人工智能的梦想离现实更近了一步。
今天你学会了:
GPT的架构(单向Transformer解码器)
自回归生成原理
生成策略(Top-k、Top-p、温度)
用GPT-2实战生成文本
GPT-3和InstructGPT的突破