返回 2026-04-22
🤖 AI / ML

Writing an LLM from scratch, part 32m -- Interventions: conclusionWriting an LLM from scratch, part 32m -- Interventions: conclusion

gilesthomas.com·2026-04-21

<p>Last November, when I finished the main body of "<a href="https://www.manning.com/books/build-a-large-language-model-from-scratch">Build a Large Language Model (from Scratch)</a>", I <a href="/2025

Giles Thomas

归档

分类目录

友情链接

去年11月,在完成《从零开始构建大型语言模型》一书的正文部分后,我给自己设定了一系列后续目标。其中之一就是“亲自训练完整的 GPT-2 基础模型”。

如今,我已完成这段旅程,训练出一个在性能上几乎(如果不是完全)媲美 GPT-2 small 的模型——仅用我自己的机器耗时 44 小时就完成了训练。因此,我认为有必要总结一下整个过程。

12 月份时,我首次尝试训练模型,耗时两天,但结果令人失望:无论是在损失值方面,还是在微调后遵循指令的能力上,都明显不如原始的 GPT-2 模型。

我当时猜测,这种差距很可能是因为原始模型训练时间更长所致。不过我也注意到,在模型和训练流程中可以进行一些干预调整,于是我想这些改动或许会有帮助。

1 月份,我搭建了一套 DDP(分布式数据并行)训练系统,让我无需再等待两天就能快速迭代测试这些干预措施。

2 月份,我从在云端训练一个基准模型开始,随后逐一验证了所有干预方案,最终找到一组能有效降低损失的方法,无论是在云端还是本地环境中都取得了良好效果。

在此过程中,我还深入学习了或巩固了不少机器学习相关概念。按对损失改善程度由低到高排序如下(其中前两项实际上略微恶化了损失):

  • 权重绑定(Weight tying),我发现它反而让损失变差了,不过实现起来非常简单,这一点很有意思。
  • PyTorch 的自动混合精度(Automated Mixed Precision),虽然也轻微增加了损失,但好处是使训练速度提升一倍,在云端成本降低 66%——这点损失换来的效率提升非常值得。
  • 梯度裁剪(Gradient clipping),这是一项成本低廉的干预手段,但(让我有些意外的是)对这个模型来说效果并不显著。
  • QKV 偏置,即在注意力权重矩阵中加入偏置项,虽然只带来微小改善,但后来我觉得这可能是噪声所致。
  • 权重衰减(Weight decay),效果更明显,而且理解起来也足够简单,就像基础的梯度下降一样。不过关于它在优化器(尤其是 AdamW)上下文中的深层原理,我仍需进一步学习。
  • Dropout,对于单轮训练似乎用处不大;移除它反而显著提升了模型表现。
  • 学习率,这方面我积累了大量新知识,通过适当提高并合理安排其调度策略,最终获得了最大的回报。
  • 此外,我还学会了如何将自定义模型上传到 Hugging Face,了解到随机噪声对训练的影响,并对使用 LLM 作为指令微调模型评估者的设置进行了优化改进。

    不过在测试指令微调效果时出现了一个小谜团:尽管我的两个模型在损失值上都非常接近 GPT-2 small,其中一个的微调结果也与之相当,另一个却差得很多!这留待日后深入探究吧。

    尽管如此,能够用本地机器运行 44 小时就训练出接近 GPT-2 small 性能的模型,依然让我感到非常满足——哪怕仍有差距。基于此积极成果,我将结束这个“干预措施”系列专题,转向此前计划好的另外两项任务,为整个“从零构建 LLM”系列画上句号:

  • 翻看书中的附录,看看有没有什么特别想强调的内容。
  • 最终检验我是否真正理解一切的标志:不参考这本书,从零开始构建自己的 LLM。我想用不同的框架来实现,而不是 PyTorch,这样可以尽量减少只是重复代码的风险——我在 X/Twitter 上问大家该用什么,得票最高的是 JAX,所以看看用 JAX 实现会是什么效果应该会很有趣!
  • 我觉得应该先写附录部分——很快就会发布相关内容。不过我认为重点会是 JAX 的实现,真的很期待!

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