内容纲要
						
						🌐 本阶段目录
- GPT 架构简介(vs BERT)
- 自回归语言建模原理(核心公式 + 图解)
- GPT-2 模型结构详解(Block-by-Block 拆解)
- 最小 GPT 模型实现(PyTorch)
- 训练一个玩具 GPT 模型(如:莎士比亚文本)
- 实时生成文本(逐词预测演示)
1️⃣ GPT 架构简介(vs BERT)
GPT:Generative Pretrained Transformer
本质:Decoder-only Transformer + 自回归训练
🧠 GPT 和 BERT 的结构对比
| 方面 | BERT | GPT | 
|---|---|---|
| 模型结构 | Transformer Encoder | Transformer Decoder | 
| 输入方式 | 双向(上下文都看) | 单向(只能看前文) | 
| 训练目标 | 猜被 mask 的词(MLM) | 猜下一个词(自回归) | 
| 应用领域 | 理解类任务 | 生成类任务(对话、写作) | 
2️⃣ 自回归语言模型原理
GPT 是一个典型的 自回归语言模型,也就是:
给定前 ( t ) 个词,预测第 ( t+1 ) 个词。
公式如下:
P(w_1, w_2, ..., w_n) = \prod_{t=1}^{n} P(w_t | w_1, ..., w_{t-1})
📊 示例:
输入句子片段:
The cat sat模型预测下一个词概率分布:
on: 0.32
in: 0.12
with: 0.07
...最终采样出概率最大的词:on
3️⃣ GPT-2 模型结构图解
GPT 的基础构件就是 Transformer Decoder Block:
[输入tokens]
    ↓
[词嵌入] + [位置编码]
    ↓
[多头 masked 自注意力]
    ↓
[前馈网络 FFN]
    ↓
[N 层堆叠]
    ↓
[输出 logits(词概率分布)]🔒 Masked Self-Attention 关键:
- 自注意力里不允许“看见未来”:
 [
 Attention(Q, K, V) \to 使用 mask 隐藏后续词
 ]
4️⃣ 最小 GPT 模型实现(纯 PyTorch,无依赖)
我们来实现一个超精简版 GPT:
✅ 结构参数
- 词表大小:1000
- 隐藏层维度:128
- 层数:4
- 注意力头数:4
📦 核心代码
import torch
import torch.nn as nn
import math
class GPTBlock(nn.Module):
    def __init__(self, dim, heads, ff_dim):
        super().__init__()
        self.attn = nn.MultiheadAttention(embed_dim=dim, num_heads=heads, batch_first=True)
        self.ff = nn.Sequential(
            nn.Linear(dim, ff_dim),
            nn.ReLU(),
            nn.Linear(ff_dim, dim)
        )
        self.norm1 = nn.LayerNorm(dim)
        self.norm2 = nn.LayerNorm(dim)
    def forward(self, x, attn_mask=None):
        x = x + self.attn(self.norm1(x), self.norm1(x), self.norm1(x), attn_mask=attn_mask)[0]
        x = x + self.ff(self.norm2(x))
        return x
class MiniGPT(nn.Module):
    def __init__(self, vocab_size, dim=128, depth=4, heads=4, ff_dim=256, max_len=64):
        super().__init__()
        self.token_emb = nn.Embedding(vocab_size, dim)
        self.pos_emb = nn.Parameter(torch.randn(1, max_len, dim))
        self.blocks = nn.Sequential(*[GPTBlock(dim, heads, ff_dim) for _ in range(depth)])
        self.ln_f = nn.LayerNorm(dim)
        self.head = nn.Linear(dim, vocab_size)
    def forward(self, idx):
        B, T = idx.shape
        x = self.token_emb(idx) + self.pos_emb[:, :T]
        attn_mask = torch.tril(torch.ones(T, T)).to(idx.device)
        attn_mask = attn_mask == 0  # 为 MultiheadAttention 生成 bool mask
        x = self.blocks(x, attn_mask=attn_mask)
        x = self.ln_f(x)
        return self.head(x)  # (B, T, vocab_size)5️⃣ 训练玩具模型(例如:莎士比亚文本)
你可以直接喂入几十KB的小语料:
# 用字符串构建 vocab 和 dataset
text = "to be or not to be that is the question ..."
chars = sorted(list(set(text)))
stoi = {ch:i for i,ch in enumerate(chars)}
itos = {i:ch for ch,i in stoi.items()}
vocab_size = len(chars)
def encode(s): return [stoi[c] for c in s]
def decode(l): return ''.join([itos[i] for i in l])
data = torch.tensor(encode(text), dtype=torch.long)用前 64 个字符预测下一个字符,训练方式和语言建模一致。
6️⃣ 实时生成演示(逐词生成)
def generate(model, idx, max_new_tokens):
    model.eval()
    for _ in range(max_new_tokens):
        logits = model(idx)[:, -1, :]  # 最后一个位置
        probs = torch.softmax(logits, dim=-1)
        next_token = torch.multinomial(probs, num_samples=1)
        idx = torch.cat([idx, next_token], dim=1)
    return idx
# 示例:输入 "to be", 生成 20 个字符
start = torch.tensor([[stoi[c] for c in "to be"]])
output = generate(model, start, max_new_tokens=20)
print(decode(output[0].tolist()))✅ 总结一波
| 你掌握了 | ✅ | 
|---|---|
| GPT 架构和 BERT 区别 | ✅ | 
| 自回归语言建模原理 | ✅ | 
| GPT-2 Block-by-Block 结构 | ✅ | 
| 从零搭建最小 GPT 模型 | ✅ | 
| 文本生成与采样 | ✅ | 
🔜 接下来干嘛?
进入最终 Boss 战——ChatGPT 背后的全流程机制拆解!
✅ 阶段四:ChatGPT = GPT + 微调 + RLHF + 多模态 + Agent + RAG
✅ 结构图 + 模块关系图
✅ PPO 训练代码讲解
✅ 如何接入 RAG 构建你自己的 ChatGPT
✅ Agent 多轮规划任务示例
后续路线:
3 Comments