Mixture of Depths (MoD)
Explore como a Mistura de Profundidades (MoD) otimiza a eficiência da IA através do encaminhamento dinâmico de tokens. Saiba como esta técnica reduz os FLOPs no Ultralytics YOLO26 e nos LLMs.
Nas arquiteturas de deep learning, a eficiência computacional é fundamental, especialmente ao processar sequências longas ou entradas de alta resolução. Uma abordagem inovadora aloca dinamicamente os recursos computacionais, permitindo que a rede decida quais partes da entrada exigem processamento completo e quais podem ignorar determinadas camadas com segurança. Essa estratégia de roteamento dinâmico reduz a complexidade computacional geral sem sacrificar o poder preditivo ou a precisão do modelo.
Compreendendo o conceito#
A Mistura de Profundidades (MoD) é uma técnica arquitetural aplicada principalmente a arquiteturas Transformer, nas quais o modelo aprende a ignorar dinamicamente o processamento de tokens específicos em várias camadas. Os transformers tradicionais processam cada token em todas as camadas, independentemente de ser uma informação crucial ou conteúdo de preenchimento. Em contraste, um modelo MoD utiliza um mecanismo de roteamento para avaliar os tokens e atribuir-lhes uma pontuação. Apenas os tokens com as pontuações mais altas — até um limite de capacidade predefinido — são encaminhados pelos blocos de computação pesada, como mecanismos de atenção ou camadas densas de alimentação direta. Os tokens restantes ignoram o bloco por meio de conexões residuais, criando efetivamente uma "mistura de profundidades", na qual diferentes tokens passam por níveis variados de profundidade de processamento.
Esse método, popularizado por pesquisas recentes da DeepMind e amplamente documentado no repositório arXiv, reduz drasticamente o número total de operações de ponto flutuante (FLOPs) necessárias durante o treinamento e a inferência.
Diferenças em relação à Mistura de Especialistas (MoE)#
É fácil confundir esse conceito com uma Mistura de Especialistas (MoE). Embora ambas utilizem mecanismos de roteamento, elas resolvem problemas diferentes:
- MoE encaminha tokens para diferentes sub-redes (especialistas) dentro de uma camada. A profundidade computacional permanece a mesma para todos os tokens, mas o número de parâmetros do modelo aumenta.
- MoD encaminha tokens para o bloco de computação ou para uma conexão de salto. O número de parâmetros permanece estritamente constante, mas a profundidade computacional diminui para os tokens menos importantes, melhorando diretamente a latência de inferência.
Aplicações no mundo real#
A capacidade de definir dinamicamente o orçamento computacional torna essa técnica altamente valiosa em vários domínios de visão computacional e processamento de linguagem natural.
-
Otimização de contexto em modelos de linguagem: os modelos de linguagem de grande escala (LLMs) modernos de organizações como a OpenAI e a Anthropic processam janelas de contexto enormes. Ao utilizar o roteamento dinâmico de profundidade, esses modelos podem ignorar palavras estruturais ou repetitivas de preenchimento, reservando a computação profunda para etapas complexas de raciocínio e extração de fatos.
-
IA de visão em alta resolução: em sistemas avançados de visão, como o modelo Ultralytics YOLO26, processar imagens grandes para detecção de objetos e segmentação de imagens exige uma quantidade enorme de memória. O roteamento de profundidade permite que a rede ignore a extração de características em fundos uniformes, como céus vazios ou paredes lisas, concentrando o poder computacional em objetos complexos do primeiro plano. Isso é essencial para implementar modelos em hardware de IA de borda com recursos limitados, otimizado por bibliotecas de otimização CUDA.
Exemplo de Implementação#
Abaixo, há um trecho conceitual de PyTorch que demonstra como um mecanismo básico de roteamento pode ignorar a computação para uma parte dos tokens de entrada, simulando um comportamento de roteamento de profundidade.
import torch
import torch.nn as nn
class MixtureOfDepthsBlock(nn.Module):
def __init__(self, d_model, capacity_factor=0.5):
super().__init__()
self.capacity_factor = capacity_factor
self.router = nn.Linear(d_model, 1)
self.heavy_compute = nn.Sequential(nn.Linear(d_model, d_model * 4), nn.GELU(), nn.Linear(d_model * 4, d_model))
def forward(self, x):
# x shape: (batch_size, seq_len, d_model)
seq_len = x.size(1)
capacity = int(seq_len * self.capacity_factor)
# 1. Compute routing scores
scores = self.router(x).squeeze(-1) # Shape: (batch_size, seq_len)
# 2. Identify top-k tokens to process
topk_indices = torch.topk(scores, capacity, dim=1).indices
# 3. Create an output tensor mirroring the input (residual baseline)
output = x.clone()
# 4. Apply heavy computation only to the selected tokens
for b in range(x.size(0)):
selected_tokens = x[b, topk_indices[b]]
processed_tokens = self.heavy_compute(selected_tokens)
output[b, topk_indices[b]] += processed_tokens
return output
# Example usage
dummy_input = torch.randn(2, 64, 128) # Batch=2, Seq=64, Dim=128
mod_block = MixtureOfDepthsBlock(d_model=128, capacity_factor=0.5)
output = mod_block(dummy_input)
print(f"Output shape: {output.shape}") # Expect (2, 64, 128)Ao utilizar frameworks como o framework PyTorch ou o TensorFlow, os desenvolvedores podem integrar esses blocos personalizados de otimização de modelos. Além disso, ferramentas como a Plataforma Ultralytics ajudam as equipes a gerenciar os dados de treinamento necessários para treinar esses roteadores com precisão, integrando-se perfeitamente a ecossistemas empresariais como o Google Cloud AI.






