返回 2026-04-21
🤖 AI / ML

从零开始构建 LLM(第 32m 部分):干预措施总结Writing an LLM from scratch, part 32m -- Interventions: conclusion

gilesthomas.com·2026-04-21

作者完成了其著作《Build a Large Language Model (from Scratch)》后续目标之一:在个人设备上完整训练一个接近 GPT-2 Small 性能的模型。训练耗时 44 小时,最终模型在多项基准测试中表现与官方 GPT-2 Small 相当。该项目验证了现代开源工具链(如 PyTorch、Hugging Face)已使个人复现经典模型成为可能。

Giles Thomas

档案

分类

友情链接

去年十一月,当我完成《Build a Large Language Model (from Scratch)》的主体部分后,我给自己设定了一些后续目标。其中之一是“亲自训练完整的 GPT-2 base 模型”。

如今我已走完这段旅程,在本地机器上耗时 44 小时,训练出了一个几乎(即使不算完全)与 GPT-2 small 性能相当的模型。因此,我觉得有必要总结一下整个过程。

去年十二月,我训练了第一个模型,耗时两天,但结果令人失望:无论是损失值,还是指令微调的能力,都不如原始的 GPT-2 模型。

我推测,这种差距在很大程度上可能是因为原始模型训练时间更长,但我也注意到,在模型和训练流程方面,我可以实施若干改进措施,并认为这些措施或许能有所帮助。

今年一月,我搭建了一套 DDP 训练系统,这样就能快速迭代这些改进措施,而无需每次等待两天才能看到结果。

二月,我开始在云端训练一个基线模型,随后逐一尝试了所有改进措施,最终找到一组能显著降低损失值的方案——无论是在云端还是本地训练都有效。

在这个过程中,我学习或深化了对一系列机器学习概念的理解。按它们对降低损失值的帮助程度排序(前两项实际上略微增加了损失):

  • 权重绑定(Weight tying):我发现它反而让损失值变差,但实现起来非常简单,这一点很有趣。
  • PyTorch 的自动混合精度(Automated Mixed Precision):虽然也让损失值略有上升,但好处是训练速度提升一倍,云端成本降低 66%——这点损失代价完全值得。
  • 梯度裁剪(Gradient clipping):成本低廉,但(让我有些意外)对这个模型效果并不显著。
  • QKV 偏置(QKV bias):即在注意力权重矩阵中加入偏置项——虽然帮助很小,但后来我怀疑这可能只是噪声中的波动。
  • 权重衰减(Weight decay):效果更明显,而且用简单的梯度下降就很容易理解。不过,我仍需进一步学习它在优化器(尤其是 AdamW)上下文中的具体作用。
  • Dropout:在单轮训练(single-epoch training)中似乎作用不大,移除它反而显著提升了模型性能。
  • 学习率(The learning rate):我对它有了更深入的理解,通过提高学习率并合理调度,获得了最显著的收益。
  • 我还学会了如何将自定义模型上传至 Hugging Face,发现了随机噪声对训练的一些有趣影响,并改进了使用 LLM 作为指令微调模型评判者的设置方案。

    不过在尝试指令微调测试时,出现了一个谜团:尽管我的两个模型在损失值上都非常接近 GPT-2 small,但其中一个模型的指令微调结果同样接近 GPT-2 small,另一个却差得多!这值得日后深入探究。

    但即便如此,我仍感到十分满足——我最好的模型(在本地训练 44 小时)几乎达到了 GPT-2 small 的水平,即使略有不足。带着这份积极的心情,我将结束这个“改进措施”子系列,转向“LLM from scratch”整体系列收尾前还想完成的两件事:

  • 正在翻阅书中的附录,看看有没有什么值得重点标注的内容。
  • 检验自己是否真正理解所有内容的最关键测试:在不参考本书的情况下,从头开始构建一个属于自己的 LLM。我打算换一个框架来实现,不用 PyTorch,以尽量避免只是照搬代码——我在 X/Twitter 上问大家该用哪个框架,最终 JAX 胜出——所以看看用 JAX 实现会是什么样子,应该会很有趣!
  • 我想先处理附录部分——稍后会发布相关内容。但我觉得最重要的还是 JAX 的实现——对此我非常期待。

    需要完整排版与评论请前往来源站点阅读。