Activation Function
Una funzione di attivazione è la funzione non lineare che un neurone applica al proprio input ponderato, consentendo alle reti di apprendere pattern curvi. Confronta le scelte più comuni.
Una funzione di attivazione è la funzione che un neurone di una rete neurale (NN) applica alla somma ponderata dei suoi input per produrre il proprio output. Il suo compito essenziale è introdurre la non linearità: senza di essa, qualsiasi sequenza di strati si riduce a un'unica trasformazione lineare e la profondità non serve a nulla. Con essa, una rete può rappresentare confini decisionali curvi, dai tratti delle cifre scritte a mano al contorno di un pedone in un fotogramma della telecamera. Le funzioni di attivazione svolgono due ruoli. Negli strati nascosti, funzioni come ReLU, SiLU e GELU consentono alla rete di costruire caratteristiche. Nello strato di output, funzioni come sigmoid e softmax trasformano i punteggi grezzi in probabilità.
Perché le reti hanno bisogno della non linearità#
Uno strato senza funzione di attivazione calcola Wx + b. Due strati di questo tipo danno W₂(W₁x + b₁) + b₂, equivalente a (W₂W₁)x + (W₂b₁ + b₂), un'altra singola trasformazione lineare. Una funzione di attivazione tra gli strati impedisce questa riduzione e il teorema di approssimazione universale dimostra che uno strato nascosto con un numero sufficiente di unità non lineari può approssimare qualsiasi funzione continua in un dominio limitato.
La derivata della funzione di attivazione è importante quanto la sua forma, perché la backpropagation moltiplica queste derivate strato per strato. La derivata di sigmoid non supera mai 0.25 e quella di tanh tende a zero per input di grandi dimensioni, perciò i gradienti si riducono attraversando numerosi strati saturanti: è il problema dei gradienti evanescenti. La derivata di ReLU è esattamente 1 per ogni input positivo, motivo principale per cui è diventato pratico addestrare reti molto profonde.
Funzioni di attivazione comuni#
- ReLU: max(0, x). È economica, con gradiente pari a 1 per gli input positivi e zeri esatti per quelli negativi. Dal 2012, con AlexNet, è stata la funzione di attivazione predefinita degli strati nascosti delle CNN, ma le unità che ricevono sempre e solo input negativi smettono di apprendere.
- Leaky ReLU: Moltiplica gli input negativi per una piccola pendenza, come 0.01 o 0.1, così ogni unità mantiene un gradiente.
- SiLU (Swish): x · σ(x), una curva morbida che scende leggermente sotto zero per gli input negativi. È comune nelle CNN efficienti e nei rilevatori in tempo reale.
- GELU: x · Φ(x), dove Φ è la funzione di distribuzione cumulativa normale standard. È la funzione di attivazione standard in BERT, GPT-2 e nei Transformer per la visione.
- Tanh: Comprimi gli input tra −1 e 1, con centro in zero. Modella lo stato nascosto delle reti ricorrenti come GRU.
- Sigmoid: Comprimi gli input tra 0 e 1, caratteristica adatta agli output binari e multietichetta e ai gate delle celle ricorrenti.
- Softmax: Trasforma un intero vettore di punteggi in una distribuzione di probabilità la cui somma è 1, utile per la classificazione a etichetta singola e i pesi di attenzione.
- SwiGLU: Strato con gate che moltiplica una proiezione attivata con SiLU per una seconda proiezione appresa. Ha sostituito la semplice funzione di attivazione negli strati feed-forward di molti modelli linguistici di grandi dimensioni (LLM) recenti.
PyTorch mette a disposizione ogni funzione elemento per elemento come modulo in torch.nn, così puoi confrontarle facilmente usando gli stessi input:
import torch
from torch import nn
x = torch.tensor([-3.0, -1.0, 0.0, 1.0, 3.0])
# Common activations, each applied element-wise to the same inputs
activations = {
"ReLU": nn.ReLU(),
"Leaky ReLU": nn.LeakyReLU(0.1),
"SiLU": nn.SiLU(),
"GELU": nn.GELU(),
"Tanh": nn.Tanh(),
"Sigmoid": nn.Sigmoid(),
}
for name, act in activations.items():
print(f"{name:>10}: {[round(v, 3) for v in act(x).tolist()]}")Per gli input −3, −1, 0, 1 e 3, ReLU stampa [0.0, 0.0, 0.0, 1.0, 3.0] e Leaky ReLU [-0.3, -0.1, 0.0, 1.0, 3.0]. SiLU restituisce [-0.142, -0.269, 0.0, 0.731, 2.858] e GELU [-0.004, -0.159, 0.0, 0.841, 2.996]: entrambe lasciano passare piccoli valori negativi e si avvicinano a ReLU per input grandi. Tanh restituisce [-0.995, -0.762, 0.0, 0.762, 0.995] e sigmoid [0.047, 0.269, 0.5, 0.731, 0.953]; entrambe si appiattiscono a ±3, dove i gradienti sono già ridotti.
Scegliere una funzione di attivazione#
Gli strati nascosti seguono di solito le convenzioni proprie della famiglia di architetture, mentre lo strato di output dipende dal compito. Softmax è adatta ai compiti in cui ogni input appartiene a un'unica classe, la sigmoide è adatta alle etichette che possono coesistere e gli output di regressione non usano alcuna funzione di attivazione, quindi possono assumere qualsiasi valore. Anche l'hardware può limitare la scelta: alcuni acceleratori edge eseguono nativamente solo funzioni semplici come ReLU, Leaky ReLU e Hard-Swish. YOLO26 applica SiLU dopo la convoluzione e la normalizzazione batch in ogni blocco Conv, assegna a ogni classe di rilevamento un punteggio tramite una funzione sigmoide indipendente — perciò i punteggi di classe di ciascun riquadro non devono necessariamente sommare a 1 — e applica softmax alle 1.000 classi ImageNet nei suoi modelli di classificazione.
Funzioni di attivazione e termini correlati#
- Funzione di loss: La funzione di attivazione modella l'output di ogni neurone durante la propagazione in avanti, mentre la loss valuta la predizione finale della rete rispetto all'etichetta. Le librerie spesso integrano l'ultima funzione di attivazione nella loss, come fa
CrossEntropyLosscon softmax, per garantire la stabilità numerica. - Normalizzazione del batch: La normalizzazione del batch o dello strato ridimensiona le attivazioni a un intervallo stabile usando statistiche e parametri appresi. Si trova accanto alla funzione di attivazione, di solito subito prima, e non introduce di per sé alcuna non linearità.
- Attivazioni: Come sostantivo plurale, indica i valori di output prodotti da uno strato. "Non linearità" e il termine più datato "funzione di trasferimento" sono sinonimi di funzione di attivazione. Durante l'addestramento, i framework conservano in memoria le attivazioni di ogni strato per il passaggio all'indietro; per questo il checkpointing dei gradienti risparmia memoria scartando alcune attivazioni e ricalcolandole durante la backpropagation.










