Mistura de Especialistas (Mixture-of-Experts, MoE)

Visão geral

Mistura de Especialistas (Mixture-of-Experts, MoE) é um padrão arquitetural que escala a capacidade (número de parâmetros e poder de representação) de uma rede neural, mantendo o custo computacional por token (token) relativamente baixo. Ele faz isso por meio de ativação esparsa (sparse activation): para cada entrada (muitas vezes cada token em uma sequência), um pequeno roteador (router) seleciona apenas alguns especialistas (experts) (sub-redes) para executar, em vez de ativar o modelo inteiro.

MoE é uma forma de computação condicional (conditional computation): o modelo escolhe quais partes de si mesmo usar dependendo da entrada. Isso torna MoE atraente para modelos em grande escala—especialmente Transformers—onde o escalonamento denso rapidamente se torna caro demais.

Em alto nível:

  • Uma camada densa computa com todos os parâmetros para cada token.
  • Uma camada MoE contém muitos especialistas, mas computa apenas com K deles (por exemplo, top-1 ou top-2) por token.
  • O resultado é muito mais parâmetros com FLOPs (FLOPs) semelhantes aos de uma linha de base densa.

MoE tem sido usado em modelos de linguagem grandes (por exemplo, Switch Transformer / arquiteturas no estilo GShard), modelos multilíngues, configurações multitarefa e grandes sistemas de recomendação, onde diferentes “especialistas” podem se especializar.

Ideia central: especialistas + roteador

Uma camada MoE tem dois componentes principais:

  1. Especialistas: Tipicamente N sub-redes feed-forward, muitas vezes MLPs, isto é, perceptrons multicamadas (MLP, multilayer perceptron) (por exemplo, FFNs de 2 camadas como as usadas em blocos Transformer). Cada especialista pode ser entendido como uma função especializada: [ f_i(x), \quad i \in {1,\dots,N} ]
  2. Roteador / rede de gating (gating network): Uma pequena rede que mapeia a entrada (x) para uma distribuição sobre especialistas: [ g(x) \in \mathbb{R}^N ] Em seguida, ela seleciona um pequeno subconjunto (top-k) de especialistas a aplicar.

MoE denso vs. esparso

  • MoE denso (raro em LLMs modernos): combina todos os especialistas a cada vez [ y = \sum_{i=1}^{N} g_i(x), f_i(x) ] Isso é caro porque avalia todos os especialistas.

  • MoE esparso (padrão moderno): seleciona apenas os especialistas top-k, tipicamente (k \in {1,2}) [ y = \sum_{i \in \text{TopK}(g(x))} \tilde{g}_i(x), f_i(x) ] onde (\tilde{g}) são pesos normalizados sobre os especialistas selecionados.

Essa seleção esparsa é de onde vem a eficiência: a contagem de parâmetros do modelo cresce com o número de especialistas, mas o custo computacional por token cresce principalmente com (k), não com (N).

Formulação matemática (MoE em nível de token)

Para uma representação de token de entrada (x \in \mathbb{R}^d):

  1. Logits do roteador: [ r = W_r x \quad \in \mathbb{R}^N ]
  2. Probabilidades do roteador: [ p = \text{softmax}(r) ]
  3. Escolha os índices top-k (S = \text{TopK}(p))
  4. Computar: [ y = \sum_{i \in S} \alpha_i f_i(x) ] onde (\alpha_i) são:
    • as probabilidades (renormalizadas) sobre (S), ou
    • uma escolha “dura” (top-1) com peso 1.0, às vezes com truques de straight-through.

Ponto-chave de projeto: camadas MoE mais frequentemente substituem a subcamada feed-forward (perceptron multicamadas) do Transformer, não a atenção, porque FFNs dominam o custo computacional em muitas variantes de Transformer e são fáceis de paralelizar como especialistas independentes.

MoE ainda é treinado de ponta a ponta com Retropropagação e tipicamente Descida do Gradiente, mas o roteamento introduz considerações adicionais (decisões discretas, balanceamento de carga, comunicação distribuída).

Mecanismos de roteamento na prática

Roteamento Top-1 e Top-2

Os roteadores mais comuns escolhem:

  • Top-1: escolhe exatamente um especialista por token (mais rápido, mas com maior risco de desequilíbrio)
  • Top-2: escolhe dois especialistas por token (mais robusto, ligeiramente mais custo computacional)

Em um Transformer, o roteamento acontece para cada token em cada camada MoE, então mesmo pequenas decisões do roteador afetam a eficiência do sistema e a qualidade do modelo.

Roteamento ruidoso (para incentivar exploração)

Um problema comum é o colapso de especialistas (expert collapse): o roteador envia a maioria dos tokens para poucos especialistas, deixando outros subtreinados. Uma mitigação é adicionar ruído aos logits do roteador durante o treinamento (por exemplo, ruído Gaussiano), incentivando exploração no início para que os especialistas possam se especializar.

Objetivos de balanceamento de carga

Mesmo com roteamento ruidoso, o roteador pode desenvolver atribuições desequilibradas. Muitas implementações de MoE adicionam uma perda auxiliar de balanceamento de carga (auxiliary load-balancing loss) para incentivar uma utilização aproximadamente uniforme dos especialistas.

Uma forma popular (usada em projetos no estilo Switch Transformer) mede:

  • a fração de tokens roteados para cada especialista (carga real)
  • a massa média de probabilidade do roteador para cada especialista (carga pretendida)

E então incentiva alinhamento e equilíbrio. Um esboço simplificado:

[ L_{\text{balance}} = N \cdot \sum_{i=1}^{N} \text{Load}_i \cdot \text{ProbMass}_i ]

Essa perda tipicamente é ponderada por um coeficiente pequeno e adicionada à perda principal da tarefa.

Restrições de capacidade e descarte de tokens

No treinamento distribuído, cada especialista só pode processar um número limitado de tokens por lote para eficiência. As implementações usam um fator de capacidade (capacity factor):

[ \text{capacity} = \left\lceil \text{capacity_factor} \cdot \frac{\text{tokens}}{N} \right\rceil ]

Se muitos tokens forem roteados para um especialista, os tokens excedentes podem ser:

  • descartados (pulados ou roteados para um fallback), ou
  • re-roteados para outro especialista (mais complexo)

O descarte de tokens prejudica a qualidade se for frequente, então um bom roteamento e balanceamento de carga são cruciais.

Roteamento por escolha do especialista (o roteador escolhe tokens)

Uma perspectiva alternativa é a escolha pelo especialista (expert-choice): em vez de cada token escolher especialistas, cada especialista escolhe quais tokens atender (sujeito à capacidade). Isso pode melhorar o balanceamento de carga e reduzir o descarte de tokens, mas altera a dinâmica de roteamento e os detalhes de implementação.

MoE hierárquico

Implantações em grande escala às vezes usam roteamento hierárquico (hierarchical routing):

  • primeiro roteia para um grupo (por exemplo, um nó ou shard)
  • depois roteia para um especialista dentro desse grupo

Isso reduz a sobrecarga de comunicação em grandes sistemas distribuídos ao manter a maior parte do tráfego local.

MoE em arquiteturas Transformer

Onde o MoE se encaixa

Um bloco Transformer padrão contém:

  • subcamada de atenção
  • subcamada feed-forward (MLP/FFN)

MoE mais comumente substitui a FFN:

  • FFN densa: [ \text{FFN}(x) = W_2 \sigma(W_1 x) ]
  • FFN MoE: [ \text{MoE}(x) = \sum_{i \in \text{TopK}} \alpha_i \text{FFN}_i(x) ]

Isso é atraente porque FFNs são:

  • independentes por token
  • fáceis de fragmentar (shard) entre dispositivos
  • frequentemente a maior parte do custo computacional do Transformer

Camadas MoE podem ser inseridas:

  • em cada bloco Transformer (comunicação cara, máxima capacidade)
  • a cada m blocos (compromisso comum)
  • apenas nos blocos finais (às vezes usado para especialização)

Cenário de exemplo prático: especialização multilíngue

Imagine treinar um modelo multilíngue em inglês, espanhol e japonês. Com camadas densas, os mesmos parâmetros precisam atender a todos os idiomas. Com MoE:

  • alguns especialistas podem se especializar em padrões de tokens em escrita latina
  • outros em morfologia japonesa
  • outros em contextos de alternância de código (code-switching)

É importante notar que essa especialização emerge da otimização e do roteamento—não de rotulagem manual—embora o roteamento condicionado por tarefa/idioma também seja possível.

Considerações de sistemas e escalabilidade

MoE é tanto uma técnica de sistemas (systems) quanto uma técnica de modelagem.

Paralelismo de especialistas

Os especialistas tipicamente são distribuídos entre dispositivos (“paralelismo de especialistas (expert parallel)”):

  • Cada GPU/TPU hospeda um subconjunto de especialistas.
  • Tokens são roteados para os dispositivos que contêm seus especialistas escolhidos (um padrão de comunicação todos-para-todos).
  • Especialistas processam seus tokens atribuídos; os resultados são enviados de volta.

Isso torna MoE altamente sensível a:

  • largura de banda/latência de rede
  • tamanho do lote (lotes maiores amortizam a sobrecarga de roteamento)
  • balanceamento de roteamento (evita stragglers)

Trade-off entre computação e memória

A principal promessa do MoE é:

  • Parâmetros escalam com o número de especialistas (N)
  • FLOPs escalam com top-k (k)

Assim, você pode construir modelos com dramaticamente mais parâmetros sem um aumento proporcional no custo computacional de treinamento por token—embora a sobrecarga de comunicação e a memória ainda importem.

Considerações de inferência

No tempo de inferência, MoE pode ser:

  • mais rápido do que um modelo denso igualmente grande (porque apenas alguns especialistas rodam)
  • mas às vezes mais lento do que um modelo denso menor devido à sobrecarga de roteamento e a um agrupamento em lotes ruim

Principais desafios de inferência:

  • Agrupamento em lotes (batching): requisições precisam ser agrupadas para manter especialistas ocupados
  • Cache (caching): na decodificação autorregressiva, tokens chegam um a um, reduzindo a eficiência do roteamento
  • Determinismo (determinism): roteadores devem ser estáveis; roteamento ruidoso geralmente é desativado na inferência
  • Complexidade de serviço (serving complexity): você precisa implantar muitos especialistas entre máquinas e lidar com o despacho token→especialista de forma eficiente

Uma camada MoE mínima (código ilustrativo)

Abaixo está um exemplo simplificado no estilo PyTorch de uma camada feed-forward MoE top-1. Isto não está pronto para produção (sem todos-para-todos distribuído, sem gerenciamento de capacidade), mas mostra a lógica central.

import torch
import torch.nn as nn
import torch.nn.functional as F

class Expert(nn.Module):
    def __init__(self, d_model, d_hidden):
        super().__init__()
        self.w1 = nn.Linear(d_model, d_hidden)
        self.w2 = nn.Linear(d_hidden, d_model)

    def forward(self, x):
        return self.w2(F.gelu(self.w1(x)))

class Top1MoE(nn.Module):
    def __init__(self, d_model, d_hidden, n_experts):
        super().__init__()
        self.n_experts = n_experts
        self.router = nn.Linear(d_model, n_experts, bias=False)
        self.experts = nn.ModuleList([Expert(d_model, d_hidden) for _ in range(n_experts)])

    def forward(self, x):
        """
        x: (batch, tokens, d_model)
        """
        b, t, d = x.shape
        x_flat = x.reshape(b * t, d)

        # Router: (bt, n_experts)
        logits = self.router(x_flat)
        probs = F.softmax(logits, dim=-1)

        # Top-1 expert per token
        expert_id = torch.argmax(probs, dim=-1)  # (bt,)

        # Dispatch: run each expert on its assigned tokens
        y_flat = torch.zeros_like(x_flat)
        for i in range(self.n_experts):
            mask = (expert_id == i)
            if mask.any():
                y_flat[mask] = self.experts[i](/x_flat[mask])

        return y_flat.reshape(b, t, d)

Implementações reais de MoE adicionam:

  • roteamento top-2 e combinação ponderada
  • limites de capacidade e re-roteamento/descarte de tokens
  • perdas de balanceamento de carga
  • despacho distribuído (todos-para-todos)
  • kernels fundidos para velocidade

Aplicações práticas

Modelos de linguagem grandes (LLMs)

MoE é comumente usado para aumentar a capacidade do modelo mantendo o custo de treinamento gerenciável. Em cenários de LLM, MoE pode:

  • melhorar a qualidade a FLOPs fixos ao adicionar mais parâmetros de especialistas
  • incentivar especialização (por exemplo, código vs. padrões de linguagem natural)
  • fornecer melhor comportamento de escalonamento quando modelos densos atingem limites de computação

Camadas MoE tipicamente são inseridas em Transformers substituindo algumas FFNs.

Aprendizado multitarefa e especialização

Em cenários multitarefa (por exemplo, sumarização + QA + tradução), diferentes especialistas podem se especializar em diferentes tarefas. O roteamento pode ser:

  • puramente guiado pela entrada (aprendido a partir dos tokens)
  • condicionado a uma incorporação (embedding) de tarefa (roteamento explicitamente ciente da tarefa)

Isso é útil quando as tarefas competem por capacidade em modelos densos.

Sistemas de recomendação

Recomendadores em grande escala frequentemente têm distribuições heterogêneas de usuário/itens. MoE pode:

  • especializar especialistas para diferentes coortes de usuários ou categorias de itens
  • melhorar desempenho na cauda (tail) ao alocar capacidade para padrões raros
  • reduzir computação ao ativar apenas alguns especialistas por exemplo

Modelos de visão e multimodais

MoE também tem sido aplicado a Transformers de visão e codificadores multimodais para:

  • escalar a capacidade de representação
  • lidar com entradas heterogêneas (texto/imagem/áudio) com especialização parcial

No entanto, os benefícios de sistema dependem fortemente do agrupamento em lotes e da sobrecarga de roteamento.

Benefícios e limitações

Benefícios

  • Escalonamento eficiente de capacidade: muito mais parâmetros por um custo computacional extra modesto
  • Especialização: especialistas podem aprender sub-habilidades distintas
  • Melhores trade-offs entre computação e qualidade em alguns regimes do que o escalonamento denso
  • Modularidade: especialistas às vezes podem ser adicionados, substituídos ou ajustados finamente (fine-tuned) de forma seletiva

Limitações e armadilhas

  • Desequilíbrio de roteamento: poucos especialistas recebem a maioria dos tokens → especialistas subtreinados, gargalos
  • Instabilidade de treinamento: colapso de especialistas, gradientes ruidosos através das decisões do roteador
  • Complexidade distribuída: comunicação todos-para-todos e tratamento de capacidade não são triviais
  • Complexidade de serviço: mais difícil de implantar do que modelos densos; eficiência depende de agrupamento em lotes
  • Riscos do descarte de tokens: se a capacidade for excedida, a qualidade pode degradar

MoE não é uma vitória “gratuita”: ele troca simplicidade algorítmica por computação condicional e engenharia de sistemas.

Variantes comuns de MoE e escolhas de projeto

Escolha da arquitetura do especialista

A maioria dos MoEs modernos usa especialistas FFN/MLP, isto é, o mesmo tipo de subcamada usada em Transformers. Isso conecta MoE de perto a MLPs e às FFNs de Transformers.

Parâmetros de projeto:

  • número de especialistas (N)
  • tamanho oculto do especialista
  • se os especialistas são idênticos na arquitetura
  • se alguma FFN densa “compartilhada” roda para todos os tokens além dos especialistas esparsos

Especialistas compartilhados + esparsos

Um padrão comum é:

  • um pequeno caminho feed-forward compartilhado para todos os tokens
  • mais um caminho MoE esparso

Isso pode estabilizar o treinamento e garantir um nível base de computação mesmo se o roteamento for imperfeito.

Melhorias no roteador

Melhorias de pesquisa e engenharia frequentemente se concentram nos roteadores:

  • melhores perdas de balanceamento de carga
  • decisões de roteamento mais estáveis
  • roteamento com menores custos de comunicação
  • roteamento informado por contexto mais longo (não apenas pelo embedding do token)

Upcycling / converter denso para MoE

Alguns fluxos de trabalho pegam um modelo denso treinado e fazem “upcycling” de partes dele em um MoE (por exemplo, clonando e diversificando pesos de FFN), e então continuam o treinamento. Isso pode acelerar o treinamento do MoE e aproveitar uma inicialização densa forte.

Quando usar MoE (regra prática)

MoE é uma boa escolha quando:

  • Você quer mais capacidade de modelo mas não pode arcar com o custo computacional do escalonamento denso
  • Você consegue treinar e servir com lotes grandes (para manter especialistas bem utilizados)
  • Você tem um ambiente distribuído onde paralelismo de especialistas é viável
  • Sua distribuição de dados é heterogênea o suficiente para se beneficiar de especialização

Um modelo denso frequentemente é preferível quando:

  • Você precisa de implantação simples e previsível
  • Você espera inferência com lotes pequenos / baixa latência dominando o custo
  • Você não tem infraestrutura para roteamento todos-para-todos eficiente

Relação com outros conceitos

  • MoE frequentemente é implementado dentro de Transformers e geralmente substitui MLPs densos na subcamada feed-forward.
  • O treinamento ainda depende de Retropropagação e Descida do Gradiente, mas o roteamento introduz perdas auxiliares adicionais e restrições de sistema.
  • Conceitualmente, MoE está relacionado à computação condicional e (de forma frouxa) a ideias de modelagem por mistura, mas camadas MoE modernas são principalmente roteamento neural + redes especialistas em vez de modelos clássicos de mistura probabilística.

Resumo

Camadas Mixture-of-Experts (MoE) escalam redes neurais combinando:

  • muitos especialistas (grande capacidade de parâmetros)
  • ativação esparsa por token via um roteador aprendido (computação eficiente)

Em sistemas modernos de aprendizado profundo—especialmente modelos grandes baseados em Transformer—MoE é uma forma prática de aumentar a capacidade sem elevar os FLOPs de modo linear. Os principais desafios não são apenas arquiteturais, mas também operacionais: roteamento balanceado, gerenciamento de capacidade e comunicação distribuída eficiente frequentemente determinam se o MoE entrega os ganhos prometidos.