我构建了一个微型 LLM 来揭开语言模型的神秘面纱

查看原文 HN 讨论

文章摘要

GuppyLM 是一个约 900 万参数的紧凑型语言模型,旨在通过扮演一条小鱼的角色来展示构建功能性 LLM 并不需要庞大的资源或高深的专业知识。项目的核心理念是:训练你自己的语言模型不是魔法。

在架构方面,GuppyLM 采用了一个直白的 Transformer 设计:870 万参数、6 层 Transformer、384 维隐藏层、6 个注意力头、768 维前馈网络(ReLU 激活)、4096 个 token 的词汇表(字节对编码)、128 token 的最大序列长度以及学习得到的位置嵌入。值得注意的是,该架构刻意避免了分组查询注意力、旋转位置嵌入或 SwiGLU 激活等现代优化技术,优先考虑简洁性和可理解性。

在角色设计上,Guppy 以小写字母和短句进行交流,专注于水生感受——水温、光线、食物和鱼缸环境。这个角色特征的一致性是通过训练数据设计实现的,而非通过条件指令。这里有个有趣的设计决策:这个 900 万参数的模型无法有条件地遵循系统提示,因此个性直接编码到了模型权重中。省略系统提示每次推理可以节省约 60 个 token。

训练数据方面,模型使用了 60,000 个合成对话样本,涵盖 60 个主题(包括问候、情感、环境感受、食物偏好、水生活动以及鱼级别的哲学概念),其中 57,000 个用于训练,3,000 个用于测试。数据通过模板组合和随机元素(30 种鱼缸物品、17 种食物种类、25 种活动)生成。完整的训练仅需在单个 GPU(Google Colab 的 T4)上运行约 5 分钟。

模型选择了单轮交互模式,因为在 128 token 的上下文窗口下,多轮对话在 3-4 轮后会退化。项目提供了多种使用方式:基于 WebAssembly 的浏览器演示(约 10MB 量化 ONNX 模型完全在客户端运行)、Google Colab 训练笔记本、本地命令行聊天界面,以及通过 Hugging Face 提供的预训练权重。核心代码约 130 行 PyTorch,采用 MIT 许可证。

作者在 HN 帖子中总结道:”这条鱼认为生命的意义就是食物。Fork 它,把角色换成你自己的。”这个项目为理解语言模型的工作原理提供了一个极好的入门路径——从数据合成、分词到模型训练和推理,每个组件都被拆解到了任何能运行 notebook 的人都能理解的程度。

HN 评论精华

  1. 与 Karpathy 项目的比较:最热门的评论将 GuppyLM 与 Andrej Karpathy 的 microGPT 和 minGPT 进行了比较。这引发了关于教育性 LLM 实现的更广泛讨论,评论者们比较了不同项目在简化语言模型概念方面的方法。

  2. 与 Minix 的类比——教育工具的价值:一位评论者将 GuppyLM 比作 Minix 操作系统(Linus Torvalds 正是通过学习 Minix 学会了设计单体内核操作系统),认为让学生在 GuppyLM 上添加功能是学习 LLM 设计的好方法。不过他也指出,对于不熟悉多头注意力、ReLU FFN、LayerNorm 和学习位置嵌入的开发者来说,即使是最简单的 LLM 实现也不易理解。

  3. 3D 可视化推荐:一位评论者推荐了 bbycroft.net/llm 上的 3D 可视化工具,它通过交互式 3D 视图展示了微型 LLM 各层的工作原理,对理解 Transformer 内部机制非常有帮助。

  4. 大小写敏感的有趣发现:一位评论者分享了一个有趣的观察——由于训练数据完全是小写的,当用小写 “hello” 输入时,Guppy 正常回答 “hi. did you bring micro pellets.”,但当用大写 “HELLO” 输入时,回答变成了 “i don’t know what it means but it’s mine.”——这生动地展示了训练数据如何影响模型行为。

  5. 个人实践分享:一位评论者认为这确实是 LLM 的绝佳入门项目,并分享了自己基于弥尔顿《失乐园》构建类似模型的经验,展示了这类项目如何激发个人创造力。