专家混合模型,简单讲清
专家混合让一个模型既能巨大、又能廉价地运行,办法是每次输入只用上自身的一小片。本文把这个想法讲清,以及它为何重要。
你或许见过某个模型被描述成参数量惊人,却又不知怎地运行起来相对廉价又快。乍一看这似乎自相矛盾——参数越多通常意味着算力越多。化解之道是一种叫专家混合(mixture-of-experts,简称 MoE)的架构,它已成为大模型构建方式中最重要的想法之一。这个概念比它的名字所暗示的要简单,而理解它能解开一个真实的谜题:一个模型怎么能同时"巨大"又"高效"。本文用大白话把它讲清。
MoE 解决的问题
先从一个基本的张力说起。让一个模型更有能力,通常意味着把它做得更大——更多参数、更多可供学习的容量。但模型每用到一个参数,每次运行都要消耗算力和内存。在一个普通模型里,每一个参数都为每一个输入而调动。于是把能力规模化,就把每一次请求的成本同步地规模化了。过了某个点,这就变得贵到无法承受。
MoE 问的问题是:我们真的需要整个模型对每一个输入都活跃吗?多数输入只调用了模型所知的一部分。一个关于诗歌的问题和一个关于化学的问题,显然不需要一模一样的那套机器。要是模型在总量上可以巨大、容纳大量专门化的容量,但每次只开启与某个特定输入相关的那部分,会怎样?
这就是全部的想法。MoE 把模型的总规模,与每次请求实际用上的量解耦了。
核心想法:很多专家,每次只用几个
在专家混合模型里,某些层被拆成许多并行的子网络,称为专家。不再是一个处理每个输入的大块,而是一组并排坐着的较小的块。对任意一段给定的输入,只有其中几个专家被激活;其余的对这段输入保持休眠。
于是模型总共包含,比方说,大量的专家——巨大的总参数量就是从这儿来的——但只有一小撮会为任何一个特定的 token 干活。总容量是巨大的;每次输入的活跃容量则不大。这正是为什么这样一个模型能标榜一个非常大的参数量,运行成本却更接近一个小得多的稠密模型。
关于"专家"这个词的一点提醒:人们很容易把每个专家想象成一个整洁的专才——这个管数学,那个管法语。现实更乱。这些专家以训练中涌现出来的方式专门化,很少能映射到干净的人类类别上。把它们想成模型可以路由通过的不同已学路径,而非贴了标签的部门,会更恰当。
路由器:决定谁来处理什么
如果每次输入只跑几个专家,就得有东西来决定是哪几个。那个东西是一个小组件,通常称为路由器或门控网络。对每一段输入,路由器审视它,挑出最适合处理它的那些专家,把输入送往它们、跳过其余。
路由器本身是在训练中、与其余一切一道学到的。没有人手工把输入指派给专家。模型在训练过程中发现一种有用的分工方式——哪些专家该处理哪类输入——而路由器编码了那个学到的路由决策。当你发出一个请求时,路由器就在悄悄地一个 token 一个 token 地做这些选择,把每个引导往它选中的那些专家。
这种路由是这套设计的核心,也是最难做对的部分,这就引出了下面那些取舍。
为什么这值得费这份事
MoE 的回报,是在模型构建那个核心取舍上拿到了更划算的买卖:能力对成本。
由于总容量与每次输入的算力解耦了,一个 MoE 模型能容纳的知识和技能,远多于一个运行成本相当的稠密模型。你得到的能力接近一个非常大的模型,运行成本却更接近一个小得多的模型。在一个"大规模运行模型的开销是真实约束"的世界里,这是一根有力的杠杆。这在很大程度上正是 MoE 设计在能力强、又高效的模型中变得普遍的原因——它们提供了一条路子,让容量持续规模化、而不必把每次请求的成本同步抬高。
取舍与难处
MoE 不是免费的效率。它引入了自己的麻烦,理解它们能让你的心智模型保持诚实。
- 路由必须均衡。 如果路由器学会过度偏爱少数几个热门专家,其余的就被冷落——浪费的容量——而忙碌的那些则成了瓶颈。训练必须主动鼓励工作量在专家间健康地分散,而把这种均衡调对是真的难。
- 即便算力下降,内存成本依旧高。 每次输入只跑几个专家,所以每次请求的算力不大。但所有那些专家仍得被加载、随时可用,所以内存占用反映的是那个完整的大模型。MoE 在计算上的节省,多于它在托管模型所需资源上的节省。
- 训练更复杂。 协调众多专家和一个路由器、保持路由均衡、让各部件顺畅协同,比训练单个稠密模型更难。运行时的效率,是用构建时增添的复杂度买来的。
所以 MoE 是一笔精巧的交易,而非一次纯粹的升级。它用更棘手的训练和一份庞大的内存需求作代价,换来更廉价的推理和更大的容量。
这对作为用户的你有何影响
当你真正使用一个模型时,这一切大多是看不见的——你发文本、收文本,路由在底下悄无声息地发生。但这套架构解释了几件值得认识的事。它正是一个模型能标出一个吓人的总参数量、运行起来却出奇实惠的原因,而当你按规模和成本比较模型时,这件事很要紧。它正是同一个模型的"总参数"数字和"每次输入的活跃参数"数字会相差悬殊的原因——也是活跃数字往往是运行成本更诚实的向导的原因。它还提醒你,标题里的规模数字需要语境:有了 MoE 在场,两个总参数量相同的模型,实际世界里的经济性可能截然不同。
总结
专家混合是对一个简单问题的回答:整个模型必须为每一个输入都运行吗?通过把模型的部分层拆成许多并行的专家、并用一个已学的路由器对每次输入只激活几个,MoE 把模型的总规模与使用它的成本解耦了。这让一个模型在容量上巨大、运行起来却相对廉价,而这正是如此多能力强、又高效的模型都按这种方式构建的原因。代价在于:专家必须被均匀使用,完整的模型仍得装进内存,而训练更费事。你很少会直接接触到这其中的任何一项,但它解释了"庞大"与"实惠"那个原本费解的组合,也是单凭总参数量会产生误导的原因。
