跟着GPT5学习预训练

GPT-1的模型主要包含两个阶段:预训练和微调。 1.预训练:在大量无标签数据上训练模型,以学习通用的表示和知识。==》具体如何做呢 有伪代码嘛?
 
 
GPT-5
 

非常棒的问题 👍,你正从“如何用”走向“模型如何被训练出来”这个更深的层面。

我们来看——GPT‑1 的预训练阶段到底是如何实现的,并给出一个接近原论文逻辑的伪代码(pseudo‑code)。


🧠 一、GPT‑1 预训练的目标是什么?

GPT‑1 的预训练目标很简单:

让模型在大规模文本上学会 预测下一个词 ,即做「左到右」单向语言建模。

数学上目标函数是:

L(θ)=−∑ilog⁡P(wi∣w1,w2,…,wi−1;θ)L(θ)=ilogP(wiw1,w2,,wi1;θ)

意思是:
给定前文 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(任务监督) 任务特定能力

 

posted @ 2025-10-21 10:23  bonelee  阅读(0)  评论(0)    收藏  举报