专家混合(mixture-of-experts)
/ MIKS-cher uv EK-sperts /
专家混合,是一种办法,能在让一个模型的总知识量大得多的同时,把使用它的代价大致维持平稳。它不是让每个词元都穿过一个大前馈网络,而是在该层并排放许多更小的「专家」网络,外加一个小小的「路由器」,为每个词元只挑出两三个专家真正去运行。可以想象一家有几十名专科医生的医院:一名分诊护士瞄一眼每位病人,把他送往最相关的那两位医生,而不是让所有人看遍所有医生。
妙处在于「总规模」与「激活规模」的分离。一个专家混合模型,参数量可能比一个相当的稠密模型多上八倍,但因为每个词元只点燃八个专家中的两个,每词元的计算量几乎不长。你以一个小得多的模型的运行代价,得到了一个巨大模型的存储容量。这正是若干最大、最强的模型都这样搭建的原因——它是少数几根「加容量却不让算力成比例爆炸」的杠杆之一。
症结在于:节省对计算是真的,对内存却不然——所有那些专家仍必须被加载、被端着,所以一个专家混合模型即便每词元运行便宜,部署起来也庞大而吃力。路由器还很娇气——若它偷懒地把大多数词元都送往同样那几个专家,其余的就闲置,容量便被浪费,所以训练需要额外的技巧来保持负载均衡。而这些专家也极少变成干净、可被人解读的专科;路由是学出来的,常常不透明,所以「专家」更多是个有用的比喻,而非字面的描述。
一个模型每层有 8 个专家,却只把每个词元路由给其中 2 个。它的总参数量足以与一个大上四倍的模型相比,而每个词元的计算量却与一个小得多的稠密模型相当——巨人的容量,矮人的运行代价。
账面上专家众多,每个词元真正上班的只有几个。
专家混合省的是计算,而非内存——每个专家仍必须被存储与加载,所以这类模型庞大、托管起来吃力。而那些「专家」也极少与对人有意义的主题对得上号;路由是学出来的,基本不透明,所以别想象成一组各有名牌的整齐专科组。