Tanh (Hyperbolic Tangent)
Tanh отображает входные значения в диапазон от −1 до 1 с помощью S-образной кривой с центром в нуле. Рассматриваются формула, градиент, применение в RNN, GAN и системах управления, а также код на PyTorch.
Гиперболический тангенс, tanh(x) = (eˣ − e^(−x)) / (eˣ + e^(−x)), — это функция активации, которая отображает любое действительное число в значение от −1 до 1 по S-образной кривой с центром в нуле. Это масштабированная сигмоида: tanh(x) = 2σ(2x) − 1. Форма кривой такая же, как у сигмоиды, но для отрицательных входных значений результат тоже отрицательный, а наклон в начале координат равен 1. До конца 1990-х и в 2000-х годах tanh была стандартной функцией активации скрытых слоёв нейросетей. Сегодня она формирует скрытое состояние рекуррентных нейросетей (RNNs), ограничивает выходные значения генераторов изображений и управляющих политик, а также удерживает значения в заданном диапазоне внутри более крупных моделей.
Формула и свойства#
Tanh — нечётная функция: tanh(−x) = −tanh(x), а tanh(0) = 0. Вблизи нуля она почти линейна: tanh(x) ≈ x, а при значениях примерно за пределами ±3 выравнивается, приближаясь к ±1. Производная функции, 1 − tanh²(x), в начале координат равна 1 — это в четыре раза больше максимального значения производной сигмоиды, равного 0.25; по мере насыщения кривой производная стремится к нулю. Приведённый ниже фрагмент кода для PyTorch вычисляет tanh и её градиент, а затем сравнивает средние выходные значения tanh и сигмоиды для входных данных с нулевым средним:
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}")Код выводит значения tanh для [-0.995, -0.762, 0.0, 0.762, 0.995] и градиенты для [0.01, 0.42, 1.0, 0.42, 0.01], поэтому градиент при ±3 в сто раз меньше, чем при нуле. Для 100,000 входных значений со стандартным нормальным распределением среднее выходное значение tanh составляет примерно 0.0, а сигмоиды — примерно 0.5.
Чем полезны выходные значения с центром в нуле#
Градиенты весов нейрона пропорциональны его входным значениям. Если все входные значения положительны, как всегда бывает с выходами сигмоиды, то при каждом обновлении градиенты всех весов нейрона имеют одинаковый знак. Поэтому веса могут только одновременно увеличиваться или уменьшаться и достигают оптимума зигзагообразно. Выходные значения tanh примерно поровну положительны и отрицательны, поэтому каждый вес может изменяться независимо, а входные значения следующего слоя остаются близкими к нулевому среднему, где градиентный спуск сходится быстрее. По этой причине в руководстве Yann LeCun и коллег «Efficient BackProp» за 1998 год для скрытых слоёв рекомендовались симметричные функции вместо логистической сигмоиды, в частности масштабированная функция 1.7159 · tanh(2x/3). Однако tanh всё равно насыщается, а при последовательном объединении множества слоёв tanh градиенты уменьшаются во время обратного распространения ошибки — это проблема затухающего градиента.
Где используется tanh#
- Рекуррентные сети: простая RNN обновляет состояние по формуле hₜ = tanh(Wxₜ + Uhₜ₋₁ + b), а tanh — нелинейная функция по умолчанию в
nn.RNNPyTorch. В ячейках LSTM и GRU tanh формирует содержимое-кандидат, а в LSTM также сжимает состояние ячейки перед выводом. Сигмоидальные вентили определяют, какую его часть использовать. Ограниченный диапазон не позволяет состоянию, которое передаётся обратно на каждом шаге, неограниченно расти. - Генераторы GAN: DCGAN завершает генератор функцией tanh, чтобы значения пикселей сгенерированных изображений находились в диапазоне от −1 до 1, к которому масштабированы обучающие изображения. Этому примеру следуют многие более поздние генеративно-состязательные сети (GANs).
- Ограниченные действия: политики непрерывного управления в обучении с подкреплением пропускают выходные значения через tanh, чтобы удерживать каждую команду в пределах возможностей исполнительных механизмов. Soft Actor-Critic таким способом сжимает выборки из гауссовской политики.
- Ограничение логитов: языковые модели Google Gemma 2 вычисляют cap · tanh(logits / cap), где cap равен 50 для логитов внимания и 30 для итоговых логитов. Небольшие логиты проходят почти без изменений, а большие не могут превысить cap.
- Аппроксимация GELU: выражение 0.5x(1 + tanh(√(2/π)(x + 0.044715x³))) даёт точную аппроксимацию GELU. В исходном коде GPT-2 и BERT GELU вычисляется именно так.
- Нормализующие потоки: потоки в стиле RealNVP часто завершают каждую сеть масштабирования функцией tanh, поэтому каждый слой связки масштабирует входные значения коэффициентом от e⁻¹ до e, что обеспечивает численную стабильность обучения. Модели оценки позы YOLO26 обучаются с функцией потерь оценки остаточного логарифмического правдоподобия. Используемый в ней шестислойный поток RealNVP, где каждая сеть масштабирования завершается tanh, моделирует отклонение предсказанных ключевых точек от эталонных.
Tanh и родственные функции#
- Сигмоида: Tanh — это сигмоида, растянутая до диапазона от −1 до 1 и сжатая по горизонтали вдвое, что увеличивает максимальный наклон с 0.25 до 1. Диапазон сигмоиды от 0 до 1 делает её подходящей функцией для вероятностей и вентилей.
- Hardtanh: кусочно-линейная функция, ограничивающая входные значения диапазоном [−1, 1]. Она вычисляется быстрее, а её градиент точно равен 0 за пределами этого диапазона.
- ReLU: max(0, x) не насыщается при положительных входных значениях и требует всего одного сравнения. Поэтому ReLU и её гладкие последующие варианты, например SiLU, заменили tanh в скрытых слоях глубоких свёрточных нейросетей (CNNs) и трансформеров. В статье об AlexNet четырёхслойная CNN с ReLU достигла ошибки обучения 25% на CIFAR-10 в шесть раз быстрее той же сети с блоками tanh.










