今天,我们发布了 EMO,这是一种全新的混合专家(MoE)模型,采用端到端预训练方式,使得模块化结构直接从数据中涌现,无需依赖人工定义的先验知识。EMO 允许你在执行特定任务时仅使用其全部专家中的一小部分——仅占总量的 12.5%——同时仍能保持接近完整模型的性能;而当所有专家共同使用时,它依然是一个强大的通用模型。
大语言模型通常作为单一整体系统进行训练和部署:一个模型被初始化、预训练、微调,并作为一个统一实体提供服务。然而,实际应用往往只需要其中一部分能力,例如代码生成、数学推理或特定领域知识。随着前沿大语言模型的参数量常规性地达到万亿级别,对大多数用户而言,使用和适配完整模型变得不切实际,并且会带来不必要的计算成本和内存开销,用于承载那些可能根本用不上的参数。
混合专家(MoE)模型似乎是缓解这一约束的自然方式。MoE 并非在每一层使用一个大型前馈网络,而是包含多个较小的网络,称为“专家”,并且对于每个输入 token 仅激活其中一小部分。理论上,一个只需要单一能力的任务可以只加载相关的专家。
然而在实践中,现有的 MoE 模型仍然需要完整模型才能良好运行。即使是在单个输入内部,不同的 token 也常常会激活不同的专家,因此一个任务在生成过程中最终可能会用到所有专家。正如我们在论文中所展示的,这种情况部分是因为标准 MoE 中的专家往往专门处理低层次的词汇模式,例如介词或标点符号,而非更高层次的领域或能力。其结果是,小规模的专家子集无法可靠地独立使用。
我们想要的是这样一种 MoE 模型:其专家能够组织成连贯的群组,这些群组可以被选择性地使用和组合。
在预训练过程中,鼓励这种行为的其中一种方法是根据预定义的语义领域(如数学、生物学或代码)将 token 路由到不同的专家。此前的研究工作,如 BTX 和我们自己的 FlexOlmo 项目,都曾尝试过这种方法。然而,预定义的领域存在重要的局限性。它们需要为整个预训练语料库标注领域标签,这既可能产生歧义,成本也高昂,并且可能会将过多的人类偏见注入到模型自我组织的方式中。更重要的是,预先固定领域也同时固定了模型的模块化结构:如果在推理时出现了新的领域或能力,那么应该使用哪些专家就不明确了。
这正是 EMO 的用武之地。
我们证明,EMO——一个拥有 10 亿活跃参数、140 亿总参数(8 个活跃专家,共 128 个专家),并在 1 万亿个 token 上训练而成的 MoE 模型——支持选择性专家使用:对于给定的任务或领域,我们可以仅使用一小部分专家(仅占总专家数的 12.5%),同时保持接近完整模型的性能。与此同时,当所有专家一起使用时,EMO 仍然是一个强大的通用模型。相比之下,一个架构相同、在相同数据上训练的标准 MoE 模型,在选择性使用其专家子集时,性能会出现严重下降。
EMO 是一个将模块化作为首要目标进行训练的 MoE 模型。对于给定的领域(例如数学、代码、生物医学),用户可以选择任意大小的一个小型专家子集,并保持接近完整模型的性能。这将单个模型转变为一个可组合的架构,从而能够实现灵活的部署,并为大型稀疏 MoE 模型带来更好的内存-精度权衡。
我们如何让模块化特性涌现出来?
在 MoE 模型中,一个被称为路由器的微型网络决定每个 token 激活哪些专家。我们希望路由器能够学习到,来自相似领域的 token 应该激活相似的专家子集。我们的关键观察是,来自同一文档的 token 通常来自同一领域。因此,我们利用文档边界作为弱监督信号:在训练过程中,一个文档内的所有 token 都被限制从共享的专家池中选择它们的活跃专家。
标准 MoE 与 EMO 的训练对比(k = 2,n = 10,为简洁起见省略共享专家)。(左图)在标准 MoE 中,每个 token 独立选择其 top-k 专家。所有 token 会用到全部专家。(右图)在 EMO 中,路由机制首先为每个文档选择一个专家子集,所有 token 都被限制只能在该子集内路由。这保证了文档内专家使用的一致性,促使专家群体形成领域专化。
例如,在一个共有 10 个专家、每个 token 激活 2 个专家的 MoE 中,某个文档的所有 token 都被限制在同一个由 4 个专家组成的池内路由,如上图所示。这个池由路由机制自行选择:我们对文档中所有 token 的路由偏好进行平均,然后选出使用频率最高的专家作为该文档的共享池。不同文档可以使用不同的池,从而允许重复出现的专家群体直接从训练数据中涌现。
实现该系统时需要考虑几个方面:
负载均衡。一个技术挑战是负载均衡。在标准 MoE 训练中,负载均衡目标用于防止模型只依赖少数几个专家。乍看之下,这与 EMO 的训练目标似乎存在冲突:我们明确限制每个文档只能使用一个专家子集。
这种冲突源于负载均衡通常应用的尺度。在许多 MoE 实现中,负载均衡是在局部计算的,通常是在仅包含少量文档的微批次内。这种局部目标会促使同一文档内的 token 分散到多个专家,直接与 EMO 保持文档内专家使用一致性的目标相悖。
为解决此问题,我们在多个文档的全局范围内应用负载均衡。在这个更大的尺度上,两个目标变得互补:EMO 鼓励同一文档内的 token 使用一致的专家池,而全局负载均衡则鼓励不同文档共同覆盖所有专家。在实践中,我们发现全局负载均衡对于稳定训练至关重要。
文档池大小。文档池大小控制模块化约束的严格程度。较小的池会迫使同一文档中的 token 共享更紧密的专家集合,从而鼓励更强的模块化;较大的池则赋予模型更多灵活性,但会削弱约束。
我们并非固定一个池大小,而是在训练过程中随机采样。这可以防止 EMO 过拟合到单一子集大小,并使其在推理时能够支持不同的专家子集大小。
基准测试结果
在通用基准测试上,EMO 的表现与标准 MoE 模型相当,表明模块化目标并未以牺牲整体模型性能为代价。然而,更重要的问题是,当我们只保留部分专家时,模型是否仍能正常工作。在此设置下,我们根据少量任务验证数据上的路由使用情况对专家进行排序,构建任务特定的专家子集,保留使用频率最高的专家,丢弃其余专家。
下图显示,EMO 在选择性使用专家时仍保持稳健。当我们仅保留 25% 的专家(32 个专家子集)时,EMO 在所有基准测试上的绝对性能仅下降约 1%;即使只保留 12.5% 的专家(16 个专家子集),整体下降也仅为约 3%。这一结果在微调前后均成立。相比之下,匹配的标准 MoE 随着专家子集缩小而急剧退化,在最小的专家子集设置下,性能往往接近或低于随机水平。
此外,我们证明为任务选择合适的专家出奇地廉价:仅需一个带有少量示例的样本,就足以识别出一个与使用完整验证集选择的模块性能相当的模块。而且 EMO 并不依赖于任何特定的选择方法:它与现有的专家剪枝方法(如 Easy-EP)配合良好,两者互为补充。
较小的 130B token 设置。在不同内存预算下,16 个 MMLU 类别的平均性能。EMO 专家子集在内存-准确率权衡中推动了帕累托前沿,优于标准 MoE,甚至优于从头训练的固定预算模型。
专家子集专门处理什么?
为了观察 EMO 在训练后实际学到了什么,我们对 1.2 万篇预训练文档中前 100 个 token 的路由器激活值进行了聚类。与标准 MoE 的差异十分显著。
EMO 的 token 聚类对应的是健康、医疗与保健、新闻报道、美国政治与选举、电影与音乐等类别。而标准 MoE 产生的聚类则是介词、专有名词、系动词或定冠词这类。在 EMO 中,同一篇文档的 token 大多落在同一个聚类中;在标准 MoE 中,它们则分散在多个聚类里。
通过一个例子就能最直观地看到这种对比。以一篇健康文章为例:在 EMO 中,几乎每个 token 都会路由到健康、医疗与保健这个聚类。而在标准 MoE 中,排名最高的聚类是“所有格与定冠词”;该模型会将这篇文章与所有恰好使用了“the”或“your”这两个词的文本归为一类,无论这些文本的内容是什么。
在基于 1 万亿 token 训练的 MoE 上,预训练数据的 token 聚类结果。EMO 的聚类对应语义上有意义的领域,同一篇文档的 token 基本被归为一组。标准 MoE 训练产生的则是表层或句法特征的聚类,文档 token 分散在多个聚类中。
由于 EMO 形成的模块对应的是语义领域而非表层特征,因此你可以挑选一个较小的专家子集,模型仍然能够正常运行:这个子集对应的是真实的能力。
你可以在我们的交互式可视化工具中亲自探索这些聚类结果。
我们发布的内容
我们发布了完整的 EMO 训练模型、一个在相同数据上训练的可比标准 MoE 基线模型,以及训练代码。我们希望这些成果能对其他研究 MoE 中涌现模块化特性的团队有所帮助。
还有更多工作要做。EMO 是朝着让大型稀疏模型更加模块化迈出的早期一步,但仍有许多问题有待解决:如何更好地选择和组合专家子集,如何在不破坏完整模型的情况下更新模块,以及如何利用模块化结构实现更好的可解释性和可控性。发布这些模型应有助于社区研究这些问题,并朝着更易于部署、适配、检查和组合的模块化语言模型迈进。