SwiGLU
SwiGLU moltiplica una proiezione attivata da SiLU per una seconda proiezione lineare, formando il layer feed-forward con gate presente in Llama, PaLM e Qwen. Include il codice.
SwiGLU (unità lineare con gating Swish) è una variante con gating dello strato feed-forward nei transformer. Proietta due volte ogni vettore di token, fa passare una proiezione attraverso la SiLU (Swish), la funzione di attivazione, moltiplica le due proiezioni elemento per elemento e proietta il prodotto di nuovo alla larghezza del modello: FFN(x) = (SiLU(xW) ⊙ xV)W₂. Noam Shazeer l'ha introdotta nel documento del 2020 GLU Variants Improve Transformer e da allora è diventata il blocco feed-forward di modelli linguistici di grandi dimensioni (LLM) come PaLM, Llama, Mistral e Qwen. A differenza di ReLU o GELU, che agiscono su ciascun numero in modo indipendente, SwiGLU contiene pesi appresi, che la rendono un piccolo strato a sé.
Come funziona SwiGLU#
Una rete feed-forward standard (FFN) del transformer espande ogni vettore di token con una matrice di pesi, applica un'attivazione e lo comprime di nuovo con una seconda matrice. SwiGLU sostituisce la prima matrice e l'attivazione con un'unità lineare con gating (GLU), composta da due proiezioni parallele dello stesso input:
- Proiezione del gate: xW attraversa SiLU, x · σ(x), producendo valori vicini a zero per input fortemente negativi e prossimi all'input per quelli positivi.
- Proiezione del valore: xV rimane lineare e trasporta il contenuto.
- Prodotto elemento per elemento: Moltiplicando le due proiezioni, il gate può aumentare, ridurre o portare quasi a zero ogni caratteristica nascosta in base all'input; la proiezione di output W₂ riporta il risultato alla larghezza del modello.
L'idea del gating deriva dalla GLU di Dauphin e colleghi, che nel 2016 hanno usato un gate sigmoide nei modelli linguistici convoluzionali con gating. L'articolo di Shazeer ha testato la stessa struttura con diverse funzioni di gate e ha denominato ogni variante in base alla sua funzione di attivazione: GLU usa la sigmoide, ReGLU usa ReLU, GEGLU usa GELU, SwiGLU usa Swish e uno strato bilineare non applica alcuna funzione di attivazione. Seguendo il codebase T5, questi strati omettono i termini di bias.
Perché SwiGLU ha sostituito ReLU e GELU negli LLM#
Gli strati feed-forward con gating hanno tre matrici di pesi anziché due, perciò Shazeer ha ridotto la larghezza nascosta di un fattore pari a 2/3, mantenendo invariati parametri e calcoli: da 3.072 a 2.048 unità in un modello T5-base. A parità di dimensioni, dopo 524.288 passaggi di addestramento SwiGLU ha raggiunto una log-perplessità di 1,636 sul set di valutazione, contro 1,677 per ReLU e 1,679 per GELU; ha inoltre ottenuto punteggi medi più alti nei benchmark di comprensione del linguaggio GLUE e SuperGLUE. Il documento non offre una teoria per spiegare il vantaggio; nelle conclusioni attribuisce il successo di queste architetture «come ogni altra cosa, alla benevolenza divina».
Il risultato si è confermato anche con i modelli di grandi dimensioni. Google ha adottato SwiGLU in PaLM nel 2022 e Meta ha sostituito ReLU con SwiGLU in LLaMA nel 2023, usando una larghezza nascosta pari a 2/3 × 4d, arrotondata per eccesso a un multiplo di 256. Questo dà 11.008 unità nascoste nel modello 7B con dimensioni 4.096. Llama 2, Llama 3, Mistral e Qwen hanno mantenuto questa architettura; nei modelli mixture-of-experts (MoE) come Mixtral, ogni esperto è un blocco feed-forward SwiGLU.
Implementare SwiGLU in PyTorch#
Il frammento di codice PyTorch qui sotto crea uno strato feed-forward ReLU standard e uno SwiGLU per un modello a 512 dimensioni e ne confronta le dimensioni:
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")Stampa ReLU FFN: output (4, 512), 2,097,152 parameters e SwiGLU FFN: output (4, 512), 2,096,640 parameters. Con 1.365 unità nascoste, circa 2/3 di 2.048, le tre matrici SwiGLU contengono quasi esattamente lo stesso numero di pesi delle due matrici ReLU, quindi qualsiasi differenza di qualità dipende dal gating. Molte implementazioni fondono le matrici del gate e del valore in un'unica proiezione e dividono a metà l'output, eseguendo una moltiplicazione di matrici più grande anziché due più piccole.
SwiGLU a confronto con termini correlati#
- SiLU (Swish): SiLU è la funzione elemento per elemento all'interno del gate. SwiGLU è l'intero strato con gating e le sue tre proiezioni.
- GLU e GEGLU: Varianti correlate che usano rispettivamente un gate sigmoide o GELU. Nei test di Shazeer, GEGLU ha eguagliato SwiGLU con una log-perplessità di 1,633, ed è usata nei modelli Gemma di Google.
- Attenzione: Anche l'attenzione produce pesi dipendenti dai dati, ma mescola informazioni tra i token. SwiGLU applica il gating alle caratteristiche all'interno di ogni token in modo indipendente.
- Modelli di visione: Gli strati feed-forward con gating sono presenti anche nei modelli di visione e multimodali. YOLOE, il rilevatore a vocabolario aperto dei ricercatori della Tsinghua University disponibile nel pacchetto Ultralytics, affina gli embedding testuali dei prompt di classe con un blocco SwiGLU residuo eseguito una volta per chiamata
set_classes()e rimosso in fase di esportazione, senza quindi aggiungere costi per fotogramma.










