Tanh (Hyperbolic Tangent)
Tanh mappa gli input in valori compresi tra −1 e 1 su una curva a S centrata sullo zero. Include la formula, il gradiente, gli usi in RNN, GAN e sistemi di controllo e il codice PyTorch.
La tangente iperbolica, tanh(x) = (eˣ − e^(−x)) / (eˣ + e^(−x)), è una funzione di attivazione che mappa ogni numero reale in un valore compreso tra −1 e 1 lungo una curva a S centrata sullo zero. È una sigmoide riscalata, tanh(x) = 2σ(2x) − 1, quindi ne condivide la forma, ma restituisce valori negativi per gli input negativi e ha una pendenza pari a 1 nell’origine. Fino agli anni Novanta e Duemila, tanh era la funzione di attivazione standard per i livelli nascosti delle reti neurali. Oggi modella lo stato nascosto delle reti neurali ricorrenti (RNN), limita gli output dei generatori di immagini e delle politiche di controllo e mantiene i valori entro un intervallo definito all’interno di modelli più grandi.
Formula e proprietà#
Tanh è una funzione dispari, tanh(−x) = −tanh(x), con tanh(0) = 0. Vicino allo zero è quasi lineare, tanh(x) ≈ x, mentre oltre circa ±3 si appiattisce avvicinandosi a ±1. La sua derivata, 1 − tanh²(x), è pari a 1 nell’origine, quattro volte il massimo di 0.25 della sigmoide, e si avvicina a zero quando la curva satura. Il frammento di codice PyTorch qui sotto calcola tanh e il suo gradiente, quindi confronta le uscite medie di tanh e sigmoide su input a media zero:
import torch
x = torch.tensor([-3.0, -1.0, 0.0, 1.0, 3.0], requires_grad=True)
y = torch.tanh(x)
# The derivative of tanh is 1 - tanh(x)^2, which peaks at 1 when x = 0
y.sum().backward()
print(f"Tanh: {[round(v, 3) for v in y.tolist()]}")
print(f"Gradient: {[round(v, 3) for v in x.grad.tolist()]}")
# For zero-mean inputs, tanh outputs average near 0 and sigmoid outputs near 0.5
torch.manual_seed(0)
z = torch.randn(100_000)
print(f"Mean output, tanh: {torch.tanh(z).mean():.3f}, sigmoid: {torch.sigmoid(z).mean():.3f}")Stampa i valori tanh di [-0.995, -0.762, 0.0, 0.762, 0.995] e i gradienti di [0.01, 0.42, 1.0, 0.42, 0.01], quindi il gradiente a ±3 è un centesimo del suo valore in corrispondenza dello zero. Per 100.000 input con distribuzione normale standard, le uscite tanh hanno una media di circa 0.0 e quelle della sigmoide di circa 0.5.
Perché sono utili le uscite centrate sullo zero#
I gradienti dei pesi di un neurone sono proporzionali ai suoi input. Quando tutti gli input sono positivi, come accade sempre con le uscite della sigmoide, i gradienti dei pesi di un neurone hanno tutti lo stesso segno a ogni aggiornamento; di conseguenza, i pesi possono solo aumentare o diminuire insieme e raggiungono il loro valore ottimale procedendo a zig-zag. Le uscite tanh sono positive e negative in misura approssimativamente uguale: ciò permette a ciascun peso di variare autonomamente e mantiene gli input del livello successivo vicini alla media zero, dove la discesa del gradiente converge più rapidamente. Per questo motivo, nella guida del 1998 "Efficient BackProp", Yann LeCun e i suoi colleghi raccomandavano per i livelli nascosti le funzioni simmetriche anziché la sigmoide logistica, in particolare la forma scalata 1.7159 · tanh(2x/3). Tanh satura comunque e la successione di molti livelli tanh riduce i gradienti durante la propagazione all’indietro, causando il problema del gradiente evanescente.
Dove si usa tanh#
- Reti ricorrenti: una RNN semplice aggiorna il proprio stato secondo hₜ = tanh(Wxₜ + Uhₜ₋₁ + b), e tanh è la non linearità predefinita di
nn.RNNin PyTorch. Nelle celle LSTM e GRU, tanh produce il contenuto candidato e, nelle LSTM, comprime lo stato della cella prima dell’output, mentre i gate sigmoidi decidono quanto usarne. L’intervallo limitato impedisce che uno stato reinserito a ogni passaggio cresca senza limiti. - Generatori GAN: DCGAN termina il generatore con tanh, così i pixel generati rientrano nell’intervallo tra −1 e 1, quello a cui vengono ridimensionate le immagini di training; molti successivi network generativi avversari (GAN) adottano la stessa scelta.
- Azioni limitate: le politiche per il controllo continuo nell’apprendimento per rinforzo fanno passare le proprie uscite attraverso tanh per mantenere ogni comando entro i limiti degli attuatori. Soft Actor-Critic comprime in questo modo i campioni di una politica gaussiana.
- Limitazione dei logit: i modelli linguistici Gemma 2 di Google calcolano cap · tanh(logits / cap), con un cap pari a 50 per i logit di attenzione e a 30 per i logit finali. I logit piccoli passano quasi invariati, mentre quelli grandi non possono mai superare il cap.
- Approssimazione di GELU: 0.5x(1 + tanh(√(2/π)(x + 0.044715x³))) approssima molto bene GELU; il codice originale di GPT-2 e BERT calcola GELU in questo modo.
- Flussi normalizzanti: i flussi in stile RealNVP spesso terminano ogni rete di scala con tanh, così ogni livello di accoppiamento scala i propri input di un fattore compreso tra e⁻¹ ed e, mantenendo stabile il training dal punto di vista numerico. I modelli di stima della posa YOLO26 vengono addestrati con una funzione di perdita basata sulla stima della log-verosimiglianza residua: il flusso RealNVP a sei livelli, con tanh alla fine di ogni rete di scala, modella la distanza tra i punti chiave previsti e la verità di riferimento.
Tanh a confronto con funzioni correlate#
- Sigmoide: tanh è una sigmoide estesa all’intervallo da −1 a 1 e compressa orizzontalmente di un fattore due; questo porta la pendenza massima da 0.25 a 1. L’intervallo da 0 a 1 della sigmoide la rende la funzione preferita per le probabilità e i gate.
- Hardtanh: una versione lineare a tratti che limita gli input all’intervallo [−1, 1]. È meno costosa da calcolare e il suo gradiente è esattamente 0 al di fuori di questo intervallo.
- ReLU: max(0, x) non satura mai per gli input positivi e richiede un solo confronto, perciò ReLU e le sue successive varianti lisce, come SiLU, hanno sostituito tanh nei livelli nascosti delle reti neurali convoluzionali (CNN) profonde e dei transformer. Nell’articolo su AlexNet, una CNN a quattro livelli con ReLU ha raggiunto un errore di training del 25% su CIFAR-10 sei volte più rapidamente della stessa rete con unità tanh.










