@HarshalsinghCN:哟,各位,博客上线了。我试着用简单的语言拆解 BarunLM(35M) 的设计,同时尽可能保持技术深度,又不会让人难以理解。

X AI KOLs Timeline 模型

摘要

一篇博客文章的公告,解释了 BarunLM(一个 35M 参数的语言模型)的设计,涵盖其架构、训练方案和数据集准备,重点介绍了相对于其他 sub-100M 模型的效率和性能提升。

哟,各位,博客上线了。 我试着用简单的语言拆解 BarunLM(35M) 的设计,同时尽可能保持技术深度,又不会让人难以理解。 我讲了架构、训练方案和数据集准备。 阅读大约需要 6 到 7 分钟。 下周会有更多关于训练、开发以及其他 postrained 工作的文章。 https://harrrshall.github.io/barunlm-35m/blog/…
查看原文
查看缓存全文

缓存时间: 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 v220%合成教材式文本修复网页碎片化;连贯的阐述
FineMath-4+20%带推理链的高质量数学教授长程、逐步的演绎
Documented Python (CodeSearchNet)10%带文档字符串的代码形式化结构;意图与实现匹配

数据合成:既然能直接抓取,为什么还要生成文本?

网页文本是碎片化的。散文与样板文字、导航和未完的想法交织在一起。在这种数据上训练的小模型会学会复现碎片化:它会开始一个句子却不写完。

**Cosmopedia v2

相似文章