SwiGLU
SwiGLU multiplica uma projeção ativada por SiLU por uma segunda projeção linear, formando a camada feed-forward com portas presente em Llama, PaLM e Qwen. Inclui código.
SwiGLU (unidade linear com porta Swish) é uma variante com porta da camada feed-forward em transformers. Ela projeta cada vetor de token duas vezes, aplica a função de ativação SiLU (Swish) a uma projeção, multiplica as duas elemento a elemento e projeta o produto de volta para a largura do modelo: FFN(x) = (SiLU(xW) ⊙ xV)W₂. Noam Shazeer a apresentou no artigo de 2020 GLU Variants Improve Transformer, e desde então ela se tornou o bloco feed-forward de modelos de linguagem grandes (LLMs), como PaLM, Llama, Mistral e Qwen. Ao contrário de ReLU ou GELU, que atuam de forma independente sobre cada número, SwiGLU contém pesos aprendidos, o que a torna uma pequena camada por si só.
Como funciona o SwiGLU#
Uma rede feed-forward padrão de transformer expande cada vetor de token com uma matriz de pesos, aplica uma ativação e o comprime novamente com uma segunda matriz. SwiGLU substitui a primeira matriz e a ativação por uma unidade linear com porta (GLU), que tem duas projeções paralelas da mesma entrada:
- Projeção da porta: xW passa pela SiLU, x · σ(x), produzindo valores próximos de zero para entradas muito negativas e próximos da própria entrada para valores positivos.
- Projeção do valor: xV permanece linear e transporta o conteúdo.
- Produto elemento a elemento: multiplicar os dois permite que a porta aumente, diminua ou reduza quase a zero cada característica oculta, dependendo da entrada; a projeção de saída W₂ mapeia o resultado de volta para a largura do modelo.
A ideia da porta vem da GLU de Dauphin e colegas, que usaram uma porta sigmoide em modelos de linguagem convolucionais com porta em 2016. O artigo de Shazeer testou a mesma estrutura com diferentes funções de porta e deu a cada variante o nome da sua ativação: GLU usa sigmoide, ReGLU usa ReLU, GEGLU usa GELU, SwiGLU usa Swish, e uma camada bilinear não usa nenhuma ativação. Seguindo a base de código do T5, essas camadas não incluem termos de bias.
Por que SwiGLU substituiu ReLU e GELU nos LLMs#
As camadas feed-forward com porta têm três matrizes de pesos em vez de duas; por isso, Shazeer reduziu a largura oculta por um fator de 2/3 para manter o mesmo número de parâmetros e o mesmo custo computacional, passando de 3.072 para 2.048 unidades em um modelo T5-base. Com o mesmo tamanho, SwiGLU alcançou uma log-perplexidade de 1,636 após 524.288 etapas de treinamento, contra 1,677 para ReLU e 1,679 para GELU, além de obter pontuações médias mais altas nos benchmarks de compreensão de linguagem GLUE e SuperGLUE. O artigo não oferece uma teoria para esse ganho; sua conclusão atribui o sucesso dessas arquiteturas, «como todo o resto, à benevolência divina».
O resultado também se confirmou em modelos grandes. O PaLM do Google adotou SwiGLU em 2022, e o LLaMA da Meta substituiu ReLU por SwiGLU em 2023, usando uma largura oculta de 2/3 × 4d, arredondada para cima até um múltiplo de 256, o que resulta em 11.008 unidades ocultas para o modelo 7B de 4.096 dimensões. Llama 2, Llama 3, Mistral e Qwen mantiveram esse design; em modelos de mistura de especialistas (MoE), como o Mixtral, cada especialista é um bloco feed-forward SwiGLU.
Implementação de SwiGLU em PyTorch#
O trecho de código PyTorch abaixo cria uma camada feed-forward padrão com ReLU e uma camada SwiGLU para um modelo de 512 dimensões e compara os tamanhos:
import torch
import torch.nn.functional as F
from torch import nn
d_model = 512
x = torch.randn(4, d_model) # four token vectors
# Standard transformer FFN: two matrices around a 4x wider ReLU hidden layer
relu_ffn = nn.Sequential(nn.Linear(d_model, 2048, bias=False), nn.ReLU(), nn.Linear(2048, d_model, bias=False))
# SwiGLU FFN: three matrices, hidden width cut to about 2/3 of 2048
w_gate = nn.Linear(d_model, 1365, bias=False)
w_value = nn.Linear(d_model, 1365, bias=False)
w_out = nn.Linear(1365, d_model, bias=False)
y = w_out(F.silu(w_gate(x)) * w_value(x)) # (SiLU(xW) * xV) W2
relu_params = sum(p.numel() for p in relu_ffn.parameters())
swiglu_params = sum(m.weight.numel() for m in (w_gate, w_value, w_out))
print(f"ReLU FFN: output {tuple(relu_ffn(x).shape)}, {relu_params:,} parameters")
print(f"SwiGLU FFN: output {tuple(y.shape)}, {swiglu_params:,} parameters")Ele imprime ReLU FFN: output (4, 512), 2,097,152 parameters e SwiGLU FFN: output (4, 512), 2,096,640 parameters. Com 1.365 unidades ocultas, cerca de 2/3 de 2.048, as três matrizes da SwiGLU contêm praticamente o mesmo número de pesos que as duas matrizes da ReLU; assim, qualquer diferença de qualidade decorre da porta. Muitas implementações fundem as matrizes da porta e do valor em uma única projeção e dividem a saída ao meio, executando uma multiplicação de matrizes maior em vez de duas menores.
SwiGLU vs. termos relacionados#
- SiLU (Swish): SiLU é a função elemento a elemento usada dentro da porta. SwiGLU é a camada completa com porta e suas três projeções.
- GLU e GEGLU: variantes semelhantes que usam uma porta sigmoide ou GELU. Nos testes de Shazeer, GEGLU igualou SwiGLU, com uma log-perplexidade de 1,633, e os modelos Gemma do Google a utilizam.
- Atenção: a atenção também produz pesos dependentes dos dados, mas combina informações entre tokens. SwiGLU aplica a porta às características de cada token de forma independente.
- Modelos de visão: as camadas feed-forward com porta também aparecem em modelos de visão e multimodais. O YOLOE, detector de vocabulário aberto desenvolvido por pesquisadores da Universidade Tsinghua e executado no pacote Ultralytics, refina os embeddings de texto das instruções de classe com um bloco SwiGLU residual que é executado uma vez por chamada
set_classes()e removido na exportação, sem acrescentar custo por quadro.










