跟着GPT5学习预训练
GPT-1的模型主要包含两个阶段:预训练和微调。 1.预训练:在大量无标签数据上训练模型,以学习通用的表示和知识。==》具体如何做呢 有伪代码嘛?
GPT-5
非常棒的问题 👍,你正从“如何用”走向“模型如何被训练出来”这个更深的层面。
我们来看——GPT‑1 的预训练阶段到底是如何实现的,并给出一个接近原论文逻辑的伪代码(pseudo‑code)。
🧠 一、GPT‑1 预训练的目标是什么?
GPT‑1 的预训练目标很简单:
让模型在大规模文本上学会 预测下一个词 ,即做「左到右」单向语言建模。
数学上目标函数是:
L(θ)=−∑ilogP(wi∣w1,w2,…,wi−1;θ)L(θ)=−i∑logP(wi∣w1,w2,…,wi−1;θ)意思是:
给定前文 token 序列,预测当前 token 的概率。
这和传统的语言模型类似,但 GPT‑1 用 Transformer 解码器结构 来实现。
⚙️ 二、数据准备
- 使用 BooksCorpus(约 7,000 本书,≈8 亿词)。
- 所有文本被分成句子和段落,随机切片成固定长度的序列(比如 512 个 tokens)。
- 构建词表(约 40,000 个 Byte Pair Encoding (BPE) 词元)。
💻 三、GPT‑1 预训练核心循环伪代码
下面这段伪代码并非源代码,而是贴近原文的训练逻辑(用 Python‑风格伪代码表示):
python
# ---------------------------------------- # 1. 初始化模型与优化器 # ---------------------------------------- model = TransformerDecoder( num_layers=12, # GPT-1:12层 hidden_size=768, num_attention_heads=12, vocab_size=40000, max_seq_len=512 ) optimizer = Adam(model.parameters(), lr=2.5e-4, betas=(0.9, 0.999)) # ---------------------------------------- # 2. 加载大规模无标签文本数据 # ---------------------------------------- dataset = load_text_corpus("BooksCorpus") # 无标签 tokenizer = build_BPE_tokenizer(vocab_size=40000) # ---------------------------------------- # 3. 训练循环 # ---------------------------------------- for epoch in range(num_epochs): for text in dataset: # (1) Tokenize 并截断/补齐 tokens = tokenizer.encode(text) inputs, targets = create_language_model_batch(tokens, seq_len=512) # (2) 前向传播 — 只看左侧上下文 logits = model(inputs) # logits.shape = [batch, seq_len, vocab_size] # (3) 计算下一个词的交叉熵损失 loss = cross_entropy(logits[:, :-1, :], targets[:, 1:]) # (4) 反向传播与参数更新 loss.backward() optimizer.step() optimizer.zero_grad() print(f"Epoch {epoch}: loss = {loss.item():.4f}") # ---------------------------------------- # 4. 保存预训练权重 # ---------------------------------------- save_model(model, "gpt1_pretrained.pt")
👉 这段伪代码体现了 GPT‑1 的关键思想:
- 没有人工标签,只做「预测下一个词」的自监督学习。
- 模型结构是 Transformer 的 Decoder 堆叠(带 Masked Self‑Attention)。
- 使用标准交叉熵损失优化语言模型目标。
- 学到的权重随后会被用于微调阶段。
🔍 四、Mask Self‑Attention 的意义(核心逻辑)
在预训练时,每个 token 只允许看到它前面的词:
makefile
Input: The movie was Target: movie was great
这种「单向注意力掩码」保证模型只能从过去预测未来,模仿语言自然生成的方式。
伪代码逻辑示意:
python
def masked_self_attention(Q, K, V): mask = generate_triangular_mask(seq_len) scores = (Q @ K.T) / sqrt(d_k) scores = scores.masked_fill(mask == 0, -inf) return softmax(scores) @ V
🧩 五、预训练结束后
我们得到一个语言生成能力良好的模型权重。这时模型能:
- 连贯生成文本;
- 理解语义模式;
- 学到基本语法与世界常识。
后续的「微调阶段」再加载这些预训练参数,用带标签的任务(如情感分类、问答、推理)继续训练模型顶层。
✳️ 六、核心总结
表格
阶段 | 数据类型 | 目标 | 损失函数 | 学到什么 |
---|---|---|---|---|
预训练 | 海量无标签文本 | 预测下一个词 | Cross‑Entropy | 通用语言表示 |
微调 | 少量带标签数据 | 适应具体任务 | Cross‑Entropy(任务监督) | 任务特定能力 |