返回 2026-04-21
🤖 AI / ML

从零开始编写 LLM,第 32m 部分——干预措施:结论Writing an LLM from scratch, part 32m -- Interventions: conclusion

gilesthomas.com·2026-04-21

作者完成了《从零构建大型语言模型》一书的主要部分后,设定了训练完整 GPT-2 基础模型的后续目标。经过努力,他成功训练出一个在 44 小时内完成的模型,其性能几乎(如果不是完全)达到了 GPT-2 small 的水平。

Giles Thomas

归档

分类

友情链接

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

如今,我已完成这段旅程,在个人电脑上经过44小时训练得到的模型性能几乎——如果不是完全——达到了 GPT-2 small 的水平。因此,我认为有必要总结一下整个过程。

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 的实现,非常期待看到成果。

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