预训练工程模块四 · 综合项目项目约 25 分钟
阶段项目:从零训练一个 mini-GPT
把预训练工程完整走一遍
学完这节你能:
- 从零搭一个小型因果 Transformer 并训练
- 亲手观察损失/困惑度下降
- 把参数量与显存账对上号
Stage 2 收尾:训一个 nanoGPT 级的小模型(几百万~几千万参数),在一小份语料上跑通预训练。让前面所有抽象概念变成屏幕上真实下降的 loss。
- 数据:一份小语料(如莎士比亚/中文小说),tokenize、打包成定长序列。
- 模型:因果解码器(token+位置嵌入 → 若干 Transformer 层 → 输出词表 logits),带因果掩码。
- 目标:交叉熵 = 下一个词预测;优化器 AdamW + warmup/cosine。
- 训练:标准循环 + 梯度裁剪 + 混合精度;记录 loss 与困惑度。
- 验证:算参数量(12·L·d²)、估显存(16 字节/参数),与实际占用对照;让模型生成几句话看看。
mini-GPT 一个 Block(复用 Stage 1 的注意力/FFN)
class Block(nn.Module):
def __init__(self, d, h):
super().__init__()
self.ln1, self.ln2 = nn.RMSNorm(d), nn.RMSNorm(d)
self.attn = CausalSelfAttention(d, h) # 带因果掩码
self.ffn = nn.Sequential(nn.Linear(d, 4*d), nn.GELU(), nn.Linear(4*d, d))
def forward(self, x):
x = x + self.attn(self.ln1(x)) # 残差 + Pre-Norm
x = x + self.ffn(self.ln2(x))
return x💡 验收标准:loss 稳定下降、困惑度明显低于随机、能生成勉强通顺的文本;并能说清「我的模型有多少参数、训练大概要多少 FLOPs、占多少显存」。做到这些,你就真正掌握了预训练工程。
自测训练 mini-GPT 时,判断「训得对不对」最直接的内在指标是:
// 带走一句话
亲手训一个 mini-GPT:因果解码器+下一词预测+AdamW+混合精度;把参数量、FLOPs、显存三笔账与实测对上。
独立练习
做到这些,才算完成本节
- 把任务拆成可运行的最小步骤,每一步都保留输出证据。
- 提交 README、结果、失败分析和下一次改进计划。
学习记录
记录本节阅读进度
建议先独立回答自测。读完记录不等于已经掌握。