GPT 模型介绍
1 课程概览
本课介绍 GPT 模型。GPT 是 OpenAI 于 2018 年上半年提出的预训练模型,只用 Transformer 的解码器。GPT 是单向的,只能用上文预测下文,主生成。BERT 主理解,GPT 主生成。GPT 采用带掩码的自注意力,防止偷看未来的词。
2 核心概念与定义
- GPT:Generative Pre-trained Transformer,生成式预训练 Transformer。
- OpenAI:GPT 的提出者。
- 单向 Transformer:只用上文预测下文。
- 带掩码的自注意力:Masked Self-Attention,防止偷看未来的词。
- NLG:Natural Language Generation,自然语言生成。
- NLU:Natural Language Understanding,自然语言理解。
3 模型与算法详解
GPT 简介
OpenAI 于 2018 年上半年提出。
- 全称:Generative Pre-trained Transformer
- 提出时间:2018 年上半年
- 提出者:OpenAI
- 特点:只用解码器,单向,主生成
GPT 系列发展
| 版本 | 说明 |
|---|---|
| GPT-1 | 2018 年提出 |
| GPT-2 | 架构变化不大,数据量更大 |
| GPT-3 | 架构变化大 |
| ChatGPT | 基于 GPT-3.5/4 |
GPT vs BERT
两大模型对比。
| 特性 | BERT | GPT |
|---|---|---|
| 使用的部分 | 编码器 | 解码器 |
| 方向 | 双向 | 单向 |
| 注意力 | 自注意力 | 带掩码的自注意力 |
| 主任务 | 理解(NLU) | 生成(NLG) |
| 预测方式 | 双向上下文 | 上文预测下文 |
GPT 的架构
只用 Transformer 的解码器。
Transformer 解码器 = 带掩码的自注意力 + 编码器-解码器注意力 + 前馈全连接层
GPT = 带掩码的自注意力 + 前馈全连接层(去掉编码器-解码器注意力)
为什么去掉编码器-解码器注意力
因为 GPT 没有编码器。
- 编码器-解码器注意力是从编码器来的
- GPT 只用解码器,不用编码器
- 所以这层没用,去掉
带掩码的自注意力
防止偷看未来的词。
- 普通自注意力:允许看到所有位置
- 带掩码的自注意力:只能看到前面的词
- 生成第 5 个词时,只看到前 4 个词
- 防止偷看未来的词
GPT 的参数
与 BERT 类似。
| 参数 | BERT | GPT |
|---|---|---|
| 层数 | 12 | 12 |
| 隐藏层维度 | 768 | 768 |
| 注意力头数 | 12 | 12 |
| 每头维度 | 64 | 64 |
4 数学原理与推导
带掩码的自注意力
$$\text{MaskedAttention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + M\right)V$$
其中:
- $M$ 是掩码矩阵(上三角为 $-\infty$)
- 其他位置为 0
GPT 生成
$$P(x_1, ..., x_n) = \prod_{i=1}^{n} P(x_i | x_1, ..., x_{i-1})$$
其中:
- $x_i$ 是第 $i$ 个词
- 生成第 $i$ 个词时,只看前面的词
BERT vs GPT
$$\text{BERT}: P(x_i | x_1, ..., x_{i-1}, x_{i+1}, ..., x_n)$$
$$\text{GPT}: P(x_i | x_1, ..., x_{i-1})$$
5 代码示例
from transformers import GPT2Model, GPT2Tokenizer
import torch
# 加载 GPT 预训练模型
model_name = "gpt2"
my_tokenizer = GPT2Tokenizer.from_pretrained(model_name)
my_gpt_model = GPT2Model.from_pretrained(model_name)
print(f"模型名: {model_name}")
print(f"GPT 架构: {my_gpt_model.config.architectures}")
print(f"隐藏层维度: {my_gpt_model.config.hidden_size}")
print(f"层数: {my_gpt_model.config.num_hidden_layers}")
print(f"注意力头数: {my_gpt_model.config.num_attention_heads}")
# 输入文本
text = "Hello, my name is"
inputs = my_tokenizer(text, return_tensors='pt')
# 前向传播
with torch.no_grad():
outputs = my_gpt_model(**inputs)
print(f"last_hidden_state: {outputs.last_hidden_state.shape}")
# === BERT vs GPT 对比 ===
print("\n=== BERT vs GPT ===")
print("BERT:")
print(" - 使用编码器")
print(" - 双向")
print(" - 主理解(NLU)")
print()
print("GPT:")
print(" - 使用解码器")
print(" - 单向")
print(" - 主生成(NLG)")
6 重难点与易错提醒
- ❗重点:GPT 是 OpenAI 于 2018 年上半年提出的。
- ❗重点:GPT 只用 Transformer 的解码器。
- ❗重点:GPT 是单向的,主生成(NLG)。
- ❗重点:BERT 主理解(NLU),GPT 主生成(NLG)。
- ❗重点:GPT 采用带掩码的自注意力,防止偷看未来的词。
- ⚠️易错:GPT 去掉了编码器-解码器注意力,因为没有编码器。
7 课堂问答精选
Q1:GPT 是什么?
A:GPT(Generative Pre-trained Transformer)是 OpenAI 于 2018 年上半年提出的预训练模型,只用 Transformer 的解码器,是单向的,主生成。
Q2:GPT 和 BERT 的区别是什么?
A:BERT 使用编码器,双向,主理解(NLU);GPT 使用解码器,单向,主生成(NLG)。
Q3:GPT 为什么去掉编码器-解码器注意力?
A:因为编码器-解码器注意力是从编码器来的,GPT 只用解码器,不用编码器,所以这层没用,去掉。
Q4:什么是带掩码的自注意力?
A:带掩码的自注意力(Masked Self-Attention)只能看到前面的词,不能看到当前和后面的词,防止偷看未来的词。生成第 5 个词时,只看到前 4 个词。
8 本课小结
- GPT 是 OpenAI 于 2018 年上半年提出的预训练模型。
- 只用 Transformer 的解码器。
- 单向,主生成(NLG)。
- BERT 主理解(NLU),GPT 主生成(NLG)。
- 采用带掩码的自注意力,防止偷看未来的词。
9 延伸思考
- BERT、ELMo、GPT 三大模型的优缺点是什么?
- 如何选择合适的预训练模型?