GELU (Gaussian Error Linear Unit)
GELU (unità lineare dell'errore gaussiano) ridimensiona ogni input in base alla CDF normale: è un'attivazione uniforme usata in BERT, GPT-2 e nei transformer per la visione. Include codice.
L'unità lineare gaussiana dell'errore (GELU) è una funzione di attivazione definita come GELU(x) = x · Φ(x), dove Φ è la funzione di distribuzione cumulativa della distribuzione normale standard. Pondera ogni input in base alla probabilità che una variabile normale standard assuma un valore inferiore, quindi gli input positivi grandi passano quasi invariati, quelli negativi grandi tendono a zero e quelli vicini a zero vengono scalati di circa la metà. Dan Hendrycks e Kevin Gimpel l'hanno introdotta nell'articolo del 2016 Gaussian Error Linear Units (GELUs). GELU è diventata la funzione di attivazione standard nei modelli transformer come BERT, GPT-2, GPT-3 e il vision transformer (ViT), dove si trova tra i due livelli lineari di ogni blocco feed-forward.
Come funziona GELU#
Hendrycks e Gimpel hanno derivato GELU dalla regolarizzazione stocastica. Immagina di moltiplicare ogni input x per una maschera casuale che lo mantiene con probabilità Φ(x) e lo azzera altrimenti, come il dropout con una probabilità di mantenimento che cresce con l'input. GELU è il valore atteso di questa operazione, Φ(x) · x, quindi regola gli input gradualmente in base al loro valore, mentre ReLU li regola bruscamente in base al segno.
La curva risultante ha tre proprietà importanti per l'addestramento:
- Liscia ovunque: GELU e la sua derivata sono continue, senza spigoli in corrispondenza dello zero; perciò piccole variazioni dei pesi producono piccole variazioni dell'output durante la retropropagazione.
- Non monotona: Per gli input negativi, l'output prima diminuisce e poi risale verso zero, raggiungendo un minimo di circa −0,17 in x ≈ −0,75.
- Gradiente per gli input negativi: Le unità con input moderatamente negativi continuano a ricevere un gradiente e quindi ad apprendere, mentre le unità ReLU smetterebbero di farlo.
Poiché Φ coinvolge la funzione errore, sono comuni due approssimazioni. La forma tanh, 0.5x(1 + tanh(√(2/π)(x + 0.044715x³))), si discosta dalla GELU esatta di circa 0,0005 al massimo ed è stata usata in GPT-2. La forma sigmoide, x · σ(1.702x), si discosta di circa 0,02 al massimo ed è la QuickGELU usata in CLIP di OpenAI. nn.GELU di PyTorch calcola per impostazione predefinita la forma esatta e la forma tanh con approximate="tanh":
import torch
from torch import nn
x = torch.tensor([-3.0, -1.0, -0.75, 0.0, 1.0, 3.0])
# Exact GELU: x * Phi(x), where Phi is the standard normal CDF
exact = nn.GELU()(x)
# Tanh approximation, as used in GPT-2
approx = nn.GELU(approximate="tanh")(x)
print(f"GELU exact: {[round(v, 4) for v in exact.tolist()]}")
print(f"GELU tanh: {[round(v, 4) for v in approx.tolist()]}")
print(f"ReLU: {nn.ReLU()(x).tolist()}")La GELU esatta stampa [-0.004, -0.1587, -0.17, 0.0, 0.8413, 2.996], la forma tanh [-0.0036, -0.1588, -0.17, 0.0, 0.8412, 2.9964] e ReLU [0.0, 0.0, 0.0, 0.0, 1.0, 3.0]. GELU produce −0,17 al minimo vicino a −0,75, mappa 1 in 0,8413 perché Φ(1) = 0,8413 e quasi coincide con ReLU in ±3. Le due forme di GELU differiscono solo alla quarta cifra decimale.
Dove si usa GELU#
- Modelli GPT: Il primo GPT di OpenAI usava GELU nel 2018, e GPT-2 e GPT-3 l'hanno mantenuta.
- BERT: Seguendo GPT, BERT di Google ha scelto GELU al posto di ReLU e la maggior parte degli encoder in stile BERT la usa ancora.
- Vision transformer: ViT applica GELU nell'MLP di ogni blocco encoder; molti backbone per la visione l'hanno seguito, tra cui ConvNeXt, che ha sostituito ReLU con GELU modernizzando ResNet.
- Transformer per il rilevamento: Nel pacchetto Ultralytics, l'encoder transformer AIFI di RT-DETR, il transformer di Baidu per il rilevamento in tempo reale, applica GELU tra i due livelli feed-forward.
Molti modelli linguistici di grandi dimensioni (LLMs) recenti sono passati dalla GELU semplice ai livelli feed-forward con gating. Gemma di Google usa GEGLU, che moltiplica una proiezione attivata da GELU per una seconda proiezione lineare; Llama, PaLM e Qwen usano SwiGLU, basata su SiLU.
GELU e funzioni di attivazione correlate#
- ReLU: max(0, x) è meno costosa, produce zeri esatti e presenta uno spigolo in corrispondenza dello zero. L'articolo su GELU ha riportato miglioramenti rispetto a ReLU ed ELU in ogni attività di visione artificiale, elaborazione del linguaggio naturale e riconoscimento vocale testata.
- SiLU (Swish): x · σ(x) ha una forma generale simile, con un minimo più profondo di circa −0,28. GELU è la scelta abituale nei transformer, mentre SiLU è più comune nei rilevatori convoluzionali.
- Leaky ReLU: Mantiene una pendenza lineare fissa per gli input negativi, mentre il lato negativo di GELU è una curva che torna verso zero.
- GEGLU: La variante con gating aggiunge una seconda proiezione appresa. Nel confronto di Noam Shazeer del 2020 su T5, i livelli feed-forward GEGLU hanno raggiunto una log-perplessità di 1,633 sul set di validazione, contro 1,679 per GELU e 1,677 per ReLU, a parità di numero di parametri.










