Tanh (Hyperbolic Tangent)
Tanh mapeia entradas para valores entre −1 e 1 em uma curva S centrada em zero. Aborda a fórmula, o gradiente, o uso em RNNs, GANs e controle, além do código PyTorch.
A tangente hiperbólica, tanh(x) = (eˣ − e^(−x)) / (eˣ + e^(−x)), é uma função de ativação que mapeia qualquer número real para um valor entre −1 e 1 ao longo de uma curva em forma de S centrada em zero. É uma sigmoide reescalada, tanh(x) = 2σ(2x) − 1, portanto tem o mesmo formato da sigmoide, mas retorna valores negativos para entradas negativas e tem inclinação igual a 1 na origem. A tanh foi a função de ativação padrão das camadas ocultas de redes neurais durante as décadas de 1990 e 2000. Hoje, ela molda o estado oculto das redes neurais recorrentes (RNNs), limita as saídas de geradores de imagens e políticas de controle e mantém os valores dentro de uma faixa em modelos maiores.
Fórmula e propriedades#
A tanh é uma função ímpar, tanh(−x) = −tanh(x), com tanh(0) = 0. Perto de zero, é quase linear, tanh(x) ≈ x, e, além de aproximadamente ±3, se achata em direção a ±1. Sua derivada, 1 − tanh²(x), é igual a 1 na origem, quatro vezes o máximo de 0,25 da sigmoide, e se aproxima de zero conforme a curva satura. O trecho de código PyTorch abaixo calcula a tanh e seu gradiente e, em seguida, compara as saídas médias da tanh e da sigmoide para entradas com média 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}")Ele exibe valores de tanh de [-0.995, -0.762, 0.0, 0.762, 0.995] e gradientes de [0.01, 0.42, 1.0, 0.42, 0.01], portanto o gradiente em ±3 é um centésimo do seu valor em zero. Para 100.000 entradas com distribuição normal padrão, as saídas da tanh têm média de aproximadamente 0,0, e as saídas da sigmoide, de aproximadamente 0,5.
Por que saídas centradas em zero ajudam#
Os gradientes dos pesos de um neurônio são proporcionais às suas entradas. Quando todas as entradas são positivas, como sempre ocorre com as saídas da sigmoide, todos os gradientes dos pesos de um neurônio têm o mesmo sinal em cada atualização, então os pesos só podem subir ou descer juntos e chegam ao valor ideal em zigue-zague. As saídas da tanh são positivas e negativas em proporções aproximadamente iguais, o que permite que cada peso se mova por conta própria e mantém as entradas da camada seguinte próximas de uma média zero, condição em que o gradiente descendente converge mais rapidamente. Por isso, o guia "Efficient BackProp", de Yann LeCun e colegas, publicado em 1998, recomendava funções simétricas em vez da sigmoide logística para camadas ocultas, especificamente a forma escalada 1.7159 · tanh(2x/3). A tanh ainda satura, e o empilhamento de muitas camadas tanh reduz os gradientes durante a retropropagação, causando o problema do gradiente evanescente.
Onde a tanh é usada#
- Redes recorrentes: Uma RNN simples atualiza seu estado como hₜ = tanh(Wxₜ + Uhₜ₋₁ + b), e a tanh é a não linearidade padrão de
nn.RNNdo PyTorch. Nas células LSTM e GRU, a tanh produz o conteúdo candidato e, na LSTM, comprime o estado da célula antes da saída, enquanto as portas sigmoides decidem quanto desse conteúdo usar. O intervalo limitado impede que um estado realimentado passo após passo cresça sem limite. - Geradores de GAN: A DCGAN termina seu gerador com tanh para que os pixels gerados fiquem entre −1 e 1, intervalo para o qual as imagens de treinamento são redimensionadas — uma escolha seguida por muitas redes adversariais generativas (GANs) posteriores.
- Ações limitadas: As políticas de controle contínuo em aprendizado por reforço passam suas saídas pela tanh para manter cada comando dentro dos limites dos atuadores. O Soft Actor-Critic comprime amostras de uma política gaussiana dessa maneira.
- Limitação suave de logits: Os modelos de linguagem Gemma 2 do Google calculam cap · tanh(logits / cap), com um limite de 50 para os logits de atenção e de 30 para os logits finais. Logits pequenos passam quase sem alteração, e os grandes nunca podem ultrapassar o limite.
- Aproximação de GELU: 0.5x(1 + tanh(√(2/π)(x + 0.044715x³))) aproxima GELU com precisão, e o código original de GPT-2 e BERT calcula GELU dessa maneira.
- Fluxos normalizantes: Fluxos no estilo RealNVP geralmente terminam cada rede de escala com tanh, de modo que cada camada de acoplamento escala suas entradas por um fator entre e⁻¹ e e, o que mantém o treinamento numericamente estável. Os modelos de estimativa de pose YOLO26 treinam com uma perda de estimativa de log-verossimilhança residual, cujo fluxo RealNVP de seis camadas, com tanh no fim de cada rede de escala, modela o quanto os pontos-chave previstos se afastam da verdade fundamental.
Tanh vs. funções relacionadas#
- Sigmoide: A tanh é uma sigmoide ampliada para o intervalo de −1 a 1 e comprimida horizontalmente por um fator de dois, o que aumenta a inclinação máxima de 0,25 para 1. O intervalo de 0 a 1 da sigmoide faz dela a função preferida para probabilidades e portas.
- Hardtanh: Uma versão linear por partes que limita as entradas a [−1, 1]. É mais barata de calcular, e seu gradiente é exatamente 0 fora desse intervalo.
- ReLU: max(0, x) nunca satura para entradas positivas e exige apenas uma comparação, por isso a ReLU e suas sucessoras suaves, como a SiLU, substituíram a tanh nas camadas ocultas de redes neurais convolucionais profundas (CNNs) e transformers. No artigo sobre AlexNet, uma CNN de quatro camadas com ReLUs atingiu erro de treinamento de 25% no CIFAR-10 seis vezes mais rápido do que a mesma rede com unidades tanh.










