@HarshalsinghCN:哟,各位,博客上线了。我试着用简单的语言拆解 BarunLM(35M) 的设计,同时尽可能保持技术深度,又不会让人难以理解。
摘要
一篇博客文章的公告,解释了 BarunLM(一个 35M 参数的语言模型)的设计,涵盖其架构、训练方案和数据集准备,重点介绍了相对于其他 sub-100M 模型的效率和性能提升。
查看缓存全文
缓存时间: 2026/08/03 09:38
哟,各位,博客上线了。
我尝试用通俗的语言拆解 BarunLM(35M) 的设计,同时尽可能保持技术深度,又不至于让人难以跟上。
我讲了架构、训练方案和数据准备。
阅读大约需要 6 到 7 分钟。
下周会有更多关于训练、开发以及其他后训练(post-trained)工作的文章。
https://harrrshall.github.io/barunlm-35m/blog/…
BarunLM 的设计
来源:https://harrrshall.github.io/barunlm-35m/blog/
为什么要构建一个 35M 的模型?
BarunLM 拥有 35,072,768 个参数。它设计用于在单张 24 GB GPU 上训练,上下文窗口为 2,048 个 token。在一个冻结的九任务零样本评估套件上,它达到了 41.01% 的准确率,超过了我们在相同协议下评估的所有其他低于 100M 的基座模型。该领先优势的配对 bootstrap 置信区间完全位于零之上,为 +0.92 到 +2.71 个百分点,表明改进具有统计显著性。
这些结果引出了 BarunLM 背后的核心问题:一个仅有 3500 万参数的模型能榨出多少能力?
在这个规模下,每个参数都至关重要。没有空间容纳不必要的复杂性或架构上的铺张。每一个设计决策都必须通过可衡量的收益来证明其成本,而不是仅凭直觉。
本文的其余部分将探讨使 BarunLM 成为可能的工程决策:让它脱颖而出的架构思路、支撑这些思路的数据与训练方案,以及我们有意做出的取舍,还有我们选择避免的取舍。
架构概览
barunlm 架构图
BarunLM 由 12 个 transformer 层组成,隐藏维度为 448,组织为 三个块,每块四层。每个块都遵循一致的 3:1 注意力模式:三个局部注意力层后接一个全注意力锚定层。在每个块之后,一个 残差选择器 自适应地决定该块的输出应有多少被向前传递。
从核心来看,该架构仍然是一个标准的自回归 transformer。输入 token 被嵌入,经过交替的注意力和前馈层处理,最后投影为下一个 token 的概率。
让 BarunLM 与众不同的不是整体框架,而是其中的精妙改进。创新之处在于注意力的组织方式、块之间的信息流动方式,以及在严格的 3500 万参数预算下最大化能力的设计选择。
关键架构创新
1. 注意力系统:3:1 的局部/全局节奏
注意力是 token 决定哪些其他 token 对它有意义的机制。barunlm 的核心思想是一个固定的 3:1 节奏:三个局部注意力层,每层看到一个 256 token 的窗口,然后是一个全注意力层,看到整个序列。
预测下一个 token 所需的大多数信息都在附近:语法、词法、相邻的代码行。局部注意力以有限的缓存大小廉价地处理这些。
但有些东西并不在附近。一个代词指向开头段落中的名字。一个 API 定义位于文件中更早的位置。如果只有局部注意力,这些信息会在反复的局部压缩中退化。周期性的全注意力层是保证的“拉远镜头查看整张地图”的时刻,一种按计划进行的全局信息交换,从结构上防止仅靠局部带来的信息损失。
三个辅助决策让这种节奏保持廉价。分组查询注意力(GQA) 让七个查询头共用一个键/值头,将 KV 缓存削减了 7 倍。部分 RoPE 只旋转每个头一半的通道,以零参数成本将位置和内容保持在不同子空间中。两个稳定器保护 BF16 训练。QK-norm 固定查询和键的尺度,使注意力不会饱和。输出门 是一个 sigmoid 投影,逐通道缩放注意力结果,让层可以拒绝不相关的更新。
输出门是我们测试过移除的唯一个辅助决策。移除后速度提升了 2.3%,但困惑度变差了 17.6%,所以它保留了下来。
2. 有界 SwiGLU,以及为什么不用专家
前馈层是 transformer 大部分计算发生的地方。barunlm 使用 SwiGLU 而不是普通的 MLP:一种乘法门控,在宽度 1,228 下,每个参数都能买到更多表达力。
其独特之处在于边界。门控值上限为 10,线性分支被限制在 [-10, 10]。极端离群激活值会毁掉 BF16 训练,因此加边界既保留了 SwiGLU 的表达力,又保持训练稳定。
我们还跳过了混合专家(MoE)。MoE 将 token 路由到专家子集,而在 35M 参数规模下,这意味着大多数权重闲置在从未获得足够训练的路由后面。小模型承担不起未被充分利用的权重。稠密层意味着每个参数每次都会看到每个 token。
3. 残差选择器:学习到的“如果没用就跳过”路径
在每一个四层块之后,模型对块的输入和输出进行 RMS 归一化,用一个小型线性层对两者打分,对两个分数做 softmax,然后返回它们的凸组合。模型真的在学每个块要保留多少。它可以绕过没有帮助的块,让块前的表示直接流过。
这是一个廉价的深度安全阀:一个四层块被允许失败而不会破坏整个堆栈。它只花费 1,344 个参数。移除它后,在 Muon 下训练速度提升了 5.3%,但困惑度恶化了 1.2%,因此它在质量参考模型中保留,并在快速、质量略低的变体中禁用。
4. 分词器
选择分词器竟然出人意料地重要。我们在精确的预训练混合数据上训练了一个 16,384 token 的字节级 BPE。字节级意味着代码、Unicode 和公式永远不会遇到未知 token。小词汇量很重要,因为在宽度 448 下,大词汇表会让网络显得臃肿。输入和输出嵌入是绑定的,共享一张表,这节省了 730 万参数,并对稀有 token 起到正则化作用。
数据与训练理念
一个 35M 的模型无法靠宽度来硬堆知识。它必须高效地学习模式,这使得数据质量成为项目中杠杆率最高的决策。
与容量对齐的预训练
训练使用了 5,699,985,408 个 token,大约每个参数 162 个 token。这个比例是刻意设计的。小模型对数据如饥似渴:它们缺乏压缩广泛知识的能力,因此需要大量干净信号来学习结构。token 预算与模型容量相匹配。不能更多,那是浪费算力;也不能更少,那会导致欠拟合。
数据混合
| 来源 | 占比 | 内容 | 收录原因 |
|---|---|---|---|
| FineWeb-Edu(去重) | 50% | 高质量教育网页 | 广泛的事实基础 |
| Cosmopedia v2 | 20% | 合成教材式文本 | 修复网页碎片化;连贯的阐述 |
| FineMath-4+ | 20% | 带推理链的高质量数学 | 教授长程、逐步的演绎 |
| Documented Python (CodeSearchNet) | 10% | 带文档字符串的代码 | 形式化结构;意图与实现匹配 |
数据合成:既然能直接抓取,为什么还要生成文本?
网页文本是碎片化的。散文与样板文字、导航和未完的想法交织在一起。在这种数据上训练的小模型会学会复现碎片化:它会开始一个句子却不写完。
**Cosmopedia v2
相似文章
@harshbhatt7585: https://x.com/harshbhatt7585/status/2063593933314113587
作者分享了从头训练一个160M参数大语言模型的经验,尝试了多种架构,如多Token预测和分层推理模型。他强调快速迭代、简化思路以及理解架构有效原因的重要性。
@pmddomingos: 你可以阅读数百篇充满炒作的大语言模型文章,却仍然不知道它们是如何工作的。或者,你可以阅读这篇,然后...
一条推文推荐了一篇全面的博客文章,该文章从注意力机制和分布式表示开始,解释了大语言模型的历史,旨在帮助读者揭开LLMs的神秘面纱。
@ChinmayKak: 新博客!这篇博客是关于我们能否通过RL训练一个小模型来捕捉LLMs的写作风格,并了解哪个模型……
这篇博客文章探讨了使用强化学习训练一个小模型来检测不同LLMs的写作风格,并提供了代码和追踪信息。
@pallavishekhar_: https://x.com/pallavishekhar_/status/2058460434035060758
解释大型语言模型实际所做的工作(下一个Token预测),以及为什么即使出错时它们听起来也很有信心。提供了一种心智模型和验证检查清单,用于安全使用LLM。
@_rohit_tiwari_: 这本115页的书揭示了LLM微调的秘密。https://drive.google.com/file/d/1cS5sWZw9XUDRI4uRh02-28Xq4-P…
一本全面介绍大语言模型微调的115页指南,涵盖理论与实践。