Шпаргалка формул нейросетей · Функции активации

Tanh: гиперболический тангенс

S-образная функция, центрированная в нуле. Разбираем её по косточкам: из каких экспонент она собрана, почему это «растянутая сигмоида», откуда производная 1 − tanh², зачем нейрону центрированные выходы и что tanh делает с градиентом в глубоких и рекуррентных сетях.

Javharbek Abdulatipov · 35 мин чтения
$$\tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}$$

Зачем он нужен

Сигмоида превращает число в долю от 0 до 1. Но внутри сети нам часто нужна не доля, а сигнал со знаком: «больше обычного» или «меньше обычного», «усилить» или «ослабить». Гиперболический тангенс (hyperbolic tangent) — это та же плавная S-кривая, но с выходом в интервале $(-1;\,1)$ и центром в нуле.

Где он встречается:

  • рекуррентные сети — в простой RNN $h_t=\tanh(Wh_{t-1}+Ux_t+b)$, в LSTM и GRU tanh формирует кандидата в память, а в LSTM ещё и ограничивает выход ячейки;
  • скрытые слои классических сетей — до эпохи ReLU tanh был стандартом и до сих пор хорош в маленьких сетях и физически информированных моделях (PINN), где нужна гладкость;
  • выход генератора — если картинки нормированы в $[-1;\,1]$, последний слой генератора GAN (например, DCGAN) берёт tanh;
  • ограничение действий и логитов — в обучении с подкреплением (SAC) действие сжимают в $(-1;\,1)$ через tanh, а в Gemma 2 логиты «мягко обрезают»: $c\cdot\tanh(z/c)$;
  • внутри других активаций — популярное приближение GELU записано через tanh.
Главное за минуту

$\tanh$ сжимает всю числовую прямую в $(-1;\,1)$, проходит через начало координат и нечётна: $\tanh(-x)=-\tanh x$. Это растянутая сигмоида: $\tanh x=2\sigma(2x)-1$. Производная $1-\tanh^2x$ не больше 1 — в 4 раза больше максимума сигмоиды, — но на хвостах tanh так же насыщается, и градиент гаснет.

Интуиция: сигмоида, поставленная на ноль

Представьте регулятор громкости со знаком: ноль — тишина, вправо — громче, влево — громче в противофазе. Пока вы крутите возле нуля, выход послушно следует за входом: $\tanh x\approx x$. Чем дальше, тем туже ход: выход упирается в $\pm1$ и больше не растёт. Это насыщение (saturation).

Потяните точку. Оранжевая прямая — касательная, её наклон и есть производная. Серый пунктир — сигмоида: та же форма, но сдвинута вверх, вдвое ниже и вчетверо положе.

Рисунок 1. tanh, его касательная и производная (снизу). Тяните синюю точку или нажимайте стрелки, когда она в фокусе. Максимум производной — $1$ при $x=0$, у сигмоиды он равен $0{,}25$. При $x=1$: $\tanh 1=0{,}7616$, $\tanh' 1=0{,}4200$.
Что заметить

При $x=2$ tanh уже $0{,}964$, а производная — $0{,}071$, в 14 раз меньше, чем в центре. При $|x|>2{,}99$ производная падает ниже $0{,}01$: дальше вход растёт, а выход почти стоит на месте.

Формула по косточкам

В формуле две экспоненты: растущая $e^{x}$ и убывающая $e^{-x}$. Числитель — их разность, знаменатель — сумма. Половины этих выражений имеют собственные имена — гиперболический синус и косинус:

$$\begin{aligned}\sinh x&=\frac{e^{x}-e^{-x}}{2}\\[4pt]\cosh x&=\frac{e^{x}+e^{-x}}{2}\\[4pt]\tanh x&=\frac{\sinh x}{\cosh x}\end{aligned}$$
$e^{x}-e^{-x}$
разность нечётна: при замене $x\to-x$ меняет знак; при $x>0$ положительна;
$e^{x}+e^{-x}$
сумма всегда положительна и не меньше 2 — знаменатель никогда не обращается в ноль;
$|\sinh x|<\cosh x$
разность по модулю всегда меньше суммы, поэтому $|\tanh x|<1$;
$x\to\pm\infty$
одна из экспонент становится пренебрежимо малой, и дробь стремится к $\pm1$.

Умножив числитель и знаменатель на $e^{x}$ или на $e^{-x}$, получим формы, удобные для вычислений, а последняя форма связывает tanh с сигмоидой:

$$\begin{aligned}\tanh x&=\frac{e^{2x}-1}{e^{2x}+1}=\frac{1-e^{-2x}}{1+e^{-2x}}\\[4pt]&=2\sigma(2x)-1\end{aligned}$$
Рисунок 2. Слева: $\sinh$ и $\cosh$ — полусумма и полуразность экспонент; tanh — их отношение. При $x_0=1$: $\sinh 1=1{,}175$, $\cosh 1=1{,}543$, отношение $0{,}7616=\tanh 1$. Справа: нажмите «Пуск» — сигмоида за три шага превращается в tanh: сжимаем по горизонтали в 2 раза, растягиваем по вертикали в 2 раза, опускаем на 1.
$x$$\tanh x$$\tanh' x$$\sigma(x)$
−3−0,99510,00990,0474
−2−0,96400,07070,1192
−1−0,76160,42000,2689
−0,5−0,46210,78640,3775
00,00001,00000,5000
0,50,46210,78640,6225
10,76160,42000,7311
20,96400,07070,8808
30,99510,00990,9526

Таблица показывает нечётность: $\tanh(-x)=-\tanh x$, а производная — чётная функция. Рядом для сравнения сигмоида: её значения симметричны не относительно нуля, а относительно $0{,}5$.

Свойства и форма

  • Область определения — все действительные числа; область значений — открытый интервал $(-1;\,1)$: значения $\pm1$ не достигаются.
  • Нечётность: $\tanh(-x)=-\tanh x$, график симметричен относительно начала координат, $\tanh 0=0$.
  • Монотонность: строго возрастает, потому что $\tanh' x=1-\tanh^2x>0$ при любом $x$.
  • Асимптоты: $\lim_{x\to\pm\infty}\tanh x=\pm1$.
  • Точка перегиба — единственная, $x=0$: при $x<0$ функция выпукла вниз, при $x>0$ — вверх.
  • Липшицевость с константой 1: $|\tanh a-\tanh b|\le|a-b|$; в частности, $|\tanh x|\le|x|$, равенство только при $x=0$.
  • Почти тождество около нуля: $\tanh x=x-\tfrac{x^3}{3}+\dots$ — при малых весах сеть из tanh ведёт себя почти как линейная.
Почему tanh x = 2σ(2x) − 1

Подставим определение сигмоиды $\sigma(u)=1/(1+e^{-u})$ при $u=2x$:

$$2\sigma(2x)-1=\frac{2}{1+e^{-2x}}-\frac{1+e^{-2x}}{1+e^{-2x}}=\frac{1-e^{-2x}}{1+e^{-2x}}=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}=\tanh x$$

В предпоследнем шаге числитель и знаменатель умножены на $e^{x}$. Обратно: $\sigma(x)=\tfrac12\bigl(1+\tanh\tfrac x2\bigr)$. Значит, сеть со скрытыми tanh можно переписать в сеть со скрытыми сигмоидами той же выразительности — меняются только масштабы весов и сдвиги. Разница — в том, как идёт обучение (раздел о центрированности).

Обратная функция и формула сложения

Решим $y=\tanh x$ относительно $x$: из $y=\frac{e^{2x}-1}{e^{2x}+1}$ получаем $e^{2x}=\frac{1+y}{1-y}$, откуда

$$\operatorname{artanh}y=\frac12\ln\frac{1+y}{1-y},\qquad -1<y<1$$

Например, $\operatorname{artanh}0{,}5\approx0{,}549$. Ещё одно полезное тождество — формула сложения:

$$\tanh(a+b)=\frac{\tanh a+\tanh b}{1+\tanh a\,\tanh b}$$

Это ровно релятивистское сложение скоростей (в долях скорости света): $0{,}5c$ и $0{,}5c$ дают не $c$, а $\frac{0{,}5+0{,}5}{1+0{,}25}c=0{,}8c$. Сумма двух чисел из $(-1;\,1)$ «в мире tanh» никогда не выходит за его пределы.

Мягкий ограничитель: c · tanh(x / c)

Функция $c\tanh(x/c)$ около нуля почти не меняет вход ($\approx x$), а большие значения плавно прижимает к $\pm c$. В отличие от жёсткой обрезки $\operatorname{clip}(x,-c,c)$, у неё нет изломов и производная нигде не обнуляется скачком. Так в Gemma 2 ограничивают логиты внимания ($c=50$) и итоговые логиты ($c=30$), чтобы они не разрастались во время обучения.

Производная: tanh′ = 1 − tanh²

Главная формула страницы. Выведем её тремя способами — каждый пригодится в другом месте.

Способ 1. Производная частного

Пусть $u=e^{x}-e^{-x}$, $v=e^{x}+e^{-x}$. Тогда $u'=v$ и $v'=u$, и по правилу дифференцирования дроби:

$$\tanh' x=\frac{u'v-uv'}{v^{2}}=\frac{v^{2}-u^{2}}{v^{2}}=1-\Bigl(\frac{u}{v}\Bigr)^{2}=1-\tanh^{2}x$$
Способ 2. Через основное гиперболическое тождество

Для гиперболических функций $\cosh^2x-\sinh^2x=1$ (проверьте подстановкой экспонент), $\sinh' x=\cosh x$ и $\cosh' x=\sinh x$. Тогда

$$\tanh' x=\frac{\cosh x\cdot\cosh x-\sinh x\cdot\sinh x}{\cosh^{2}x}=\frac{1}{\cosh^{2}x}=\operatorname{sech}^{2}x$$

Деля тождество на $\cosh^2x$, получаем $1-\tanh^2x=\operatorname{sech}^2x$ — та же формула в другой записи. Форма через $\operatorname{sech}^2$ полезна в коде при больших $|x|$.

Способ 3. Через сигмоиду

Из $\tanh x=2\sigma(2x)-1$ по правилу цепочки:

$$\tanh' x=2\cdot\sigma'(2x)\cdot2=4\sigma(2x)\bigl(1-\sigma(2x)\bigr)$$

Отсюда сразу видно, почему максимум производной равен $4\cdot\tfrac14=1$, а не $\tfrac14$, как у сигмоиды: вдвое больший размах выхода и вдвое более сжатая шкала входа дают множитель 4.

$$\tanh' x=1-\tanh^{2}x$$

На практике: на прямом проходе сеть уже посчитала $t=\tanh z$. На обратном проходе производная обходится одним умножением $1-t^2$ — без новых экспонент. Именно поэтому фреймворки хранят для обратного прохода выход tanh, а не его вход.

Вторая производная и самые крутые изгибы

Дифференцируя ещё раз: $\tanh'' x=-2\tanh x\,(1-\tanh^2x)$. Она равна нулю только при $x=0$ (точка перегиба), а экстремумы достигаются при $\tanh^2x=\tfrac13$, то есть $x=\pm\operatorname{artanh}\tfrac{1}{\sqrt3}\approx\pm0{,}658$; значения там $\mp\tfrac{4}{3\sqrt3}\approx\mp0{,}770$. В этих точках наклон уже $1-\tfrac13=\tfrac23$ и убывает быстрее всего: здесь прямая $y\approx x$ сменяется изгибом к насыщению.

Ряд Тейлора около нуля

$$\tanh x=x-\frac{x^{3}}{3}+\frac{2x^{5}}{15}-\frac{17x^{7}}{315}+\frac{62x^{9}}{2835}-\dots,\qquad |x|<\frac{\pi}{2}$$

Ряд сходится только при $|x|<\pi/2\approx1{,}571$: знаменатель $\cosh x$ обращается в ноль в комплексных точках $x=\pm i\pi/2$, и радиус сходимости равен расстоянию до ближайшей из них. Это в два раза меньше, чем у сигмоиды ($\pi$), — ведь tanh «сжат» по горизонтали в 2 раза.

Рисунок 3. Многочлены Тейлора порядков 1–9 и полоса сходимости $|x|<\pi/2$. При $x=1$ приближение 3-го порядка даёт $0{,}6667$ вместо $0{,}7616$, а 9-го — $0{,}7679$. При $x=2$, за пределами полосы, многочлены расходятся: 3-й порядок даёт $-0{,}667$, 9-й — уже $7{,}889$.

Центрированность: почему tanh учится лучше сигмоиды

Рассмотрим нейрон следующего слоя: $z=\sum_i w_ia_i+b$, где $a_i$ — выходы предыдущего слоя. Градиент потери по весу равен

$$\frac{\partial L}{\partial w_i}=\delta\cdot a_i,\qquad \delta=\frac{\partial L}{\partial z}$$

Если все $a_i>0$ (выходы сигмоиды), то на одном примере все компоненты градиента имеют один знак — знак $\delta$. Шаг SGD двигает все веса нейрона либо вверх, либо вниз. А если к оптимуму нужно одни веса увеличить, а другие уменьшить, остаётся идти зигзагом.

Второй взгляд — через форму поверхности потерь. Для линейного нейрона с квадратичной потерей $\tfrac12(w^\top a-y)^2$ матрица Гессе равна $\mathbb E[aa^\top]=\operatorname{Cov}(a)+\mu\mu^\top$, где $\mu$ — среднее входов. Ненулевое среднее добавляет одно большое собственное значение вдоль $\mu$, и «долина» вытягивается. Для входов $\sigma(z)$ ниже собственные значения $0{,}034$ и $0{,}530$ (число обусловленности 15,5), для $\tanh(z)$ — $0{,}340$ и $0{,}415$ (1,22).

Рисунок 4. Обучаем два веса $w=(w_1;\,w_2)$ линейного нейрона по 100 примерам; входы — $\sigma(z)$ слева и $\tanh(z)$ справа от одних и тех же случайных $z$. SGD с шагом $0{,}5$ стартует из $(-1;\,1)$ к $w^*=(1;\,-1)$. Слева каждый шаг направлен «вправо-вверх» или «влево-вниз» (бирюзовые квадранты), путь пилит вытянутую долину; справа путь тоже шумит (SGD берёт по одному примеру), но идёт к оптимуму без систематической «пилы». Через 50 шагов расстояние до оптимума $1{,}252$ против $0{,}000$; точность $0{,}1$ достигается за 194 шага против 21.
Вывод

Центрированные активации делают поверхность потерь следующего слоя «круглее», и градиентный спуск идёт к минимуму прямее. Это одна из причин, по которым tanh в скрытых слоях обучается быстрее сигмоиды (ЛеКун и др., «Efficient BackProp», 1998). Та же идея лежит в основе нормализации входов и BatchNorm.

Tanh на плоскости: складки, гребни и холмы

Нейрон с двумя входами считает $\tanh(w_1x_1+w_2x_2+b)$. На плоскости это складка: поверхность переходит от $-1$ к $+1$ поперёк прямой $w^\top x+b=0$ и не меняется вдоль неё. Сумма двух противоположных складок даёт гребень, а четыре складки и ещё один tanh на выходе — холм, отличный от $-1$ только в квадрате.

Рисунок 5. Маленькая сеть из tanh. «1 нейрон» — $\tanh(k(0{,}8x_1+0{,}6x_2))$; «2 нейрона» — $\tanh(k(x_1+1))-\tanh(k(x_1-1))-1$; «4 + выход» — сумма $s$ четырёх таких складок по $x_1$ и $x_2$, затем $\tanh(2(s-3))$. При $k=2$ на вершине холма $f(0;\,0)=0{,}937$, а вдали $f=-1{,}000$. Пунктир — прямые, на которых вход каждого скрытого нейрона равен нулю.

Так работает теорема об универсальной аппроксимации (Цыбенко, 1989; Хорник, 1991): сеть с одним скрытым слоем из достаточно большого числа нейронов с tanh приближает любую непрерывную функцию на ограниченном замкнутом множестве с любой точностью. Холмы складываются из складок, а из холмов можно собрать любой рельеф. Наш холм использует второй tanh на выходе ради наглядности, но теореме хватает и одного скрытого слоя с линейным выходом. Она говорит, что такие веса существуют, но не говорит, сколько нужно нейронов и найдёт ли их обучение.

Tanh в обучении: активации по слоям и подгонка кривой

Что происходит с сигналом в глубокой сети

Пусть веса слоя выбраны случайно с дисперсией $g^2/n$, где $n$ — число входов нейрона. Если $g$ мал, сигнал затухает от слоя к слою и tanh работает как почти линейная функция. Если $g$ велик, входы нейронов большие, и tanh уходит в насыщение: выходы прилипают к $\pm1$, производные почти нулевые.

Рисунок 6. Случайная сеть из 10 слоёв по 100 нейронов, входы $N(0,1)$; на каждом слое — гистограмма 2000 активаций (20 примеров × 100 нейронов), оранжевая точка — среднее. tanh при $g=1$: среднее последнего слоя $0{,}013$, а разброс постепенно сжимается до $0{,}225$; при $g=0{,}5$ сигнал гаснет: разброс падает до $0{,}001$, при $g=3$ насыщена почти половина нейронов ($48\%$ значений с $|a|>0{,}95$). При $g=5/3$ разброс держится около $0{,}65$, насыщено $10\%$. У сигмоиды среднее на каждом слое около $0{,}5$ ($0{,}516$ на последнем) — выходы не центрированы.

Поэтому для tanh берут инициализацию Глоро (Xavier), $\operatorname{Var}w=\frac{2}{n_\text{in}+n_\text{out}}$, а PyTorch советует умножать её на усиление $g=5/3$ (calculate_gain('tanh')): множитель компенсирует то, что tanh сжимает сигнал. Для квадратного слоя это ровно случай $g=5/3$ на рисунке 6.

Сеть из tanh подгоняет кривую

Скрытый слой из $H$ нейронов и линейный выход: $\hat y(x)=\sum_{k=1}^{H}v_k\tanh(w_kx+b_k)+c$. Каждое слагаемое — «ступенька» с плавными краями; обучение двигает, растягивает и масштабирует ступеньки так, чтобы их сумма легла на данные.

Рисунок 7. 40 точек $y=0{,}8\sin(2{,}2x)+0{,}3x$ с шумом ($\sigma=0{,}08$), полный градиент и Adam с шагом $0{,}05$. Бирюзовые кривые — вклады отдельных нейронов, синяя — их сумма. С 5 нейронами MSE падает с $1{,}059$ до плато около $0{,}05$ (шаги 200–380), затем один из нейронов «находит свою роль»: к шагу 500 ошибка $0{,}006$, к шагу 800 — $0{,}0041$, на уровне шума ($0{,}08^2=0{,}0064$). С 3 нейронами сеть застревает около $0{,}11$ ($0{,}106$ к шагу 2000), с 8 — уже к шагу 400 достигает $0{,}0039$.
Плато — это насыщение

Длинные плато на кривой потерь часто означают, что часть нейронов работает на плоских хвостах tanh: их производная мала, и градиент почти не сдвигает их параметры. Помогают нормализация входов, аккуратная инициализация и адаптивные оптимизаторы вроде Adam.

Tanh в рекуррентных сетях и LSTM

Простая рекуррентная сеть обновляет состояние по одной и той же формуле на каждом шаге: $h_t=\tanh(Wh_{t-1}+Ux_t+b)$. Tanh здесь работает как предохранитель: каким бы длинным ни был текст, состояние остаётся в $(-1;\,1)$ и не «взрывается». Но за ограниченность приходится платить градиентом (множители перемножаются от $s=T$ слева до $s=t+1$ справа):

$$\frac{\partial h_T}{\partial h_t}=\prod_{s=t+1}^{T}\operatorname{diag}\bigl(1-h_s^{2}\bigr)\,W$$

Каждый множитель содержит $1-h_s^2\le1$. Если веса малы, произведение затухает экспоненциально. Если веса велики, состояния прижимаются к $\pm1$, $1-h_s^2\to0$ — и градиент тоже гаснет. Выживает он только в узком окне между этими режимами. В многомерной RNN у границы этого окна градиент может и взрываться (Паскану и др., 2013), поэтому вместе с tanh применяют обрезку нормы градиента.

Рисунок 8. Скалярная RNN $h_t=\tanh(wh_{t-1}+x_t)$, 30 шагов, входы $x_t\sim N(0;\,0{,}2^2)$ (серые столбики). Снизу — $|\partial h_{30}/\partial h_t|$ в логарифмической шкале. При $w=1$ градиент от первого шага до последнего уменьшается до $3{,}1\cdot10^{-4}$; при $w=0{,}5$ — до $5{,}7\cdot10^{-11}$; при $w=1{,}2$ — $1{,}3\cdot10^{-3}$; а при $w=2$ и $w=3$, когда состояние насыщено, — до $7{,}2\cdot10^{-18}$ и $1{,}6\cdot10^{-38}$.

LSTM решает эту проблему отдельной «магистралью» — состоянием ячейки $c_t$, которое обновляется сложением, а не через tanh:

$$\begin{aligned}g_t&=\tanh\bigl(W_g[h_{t-1},x_t]+b_g\bigr)\\c_t&=f_t\odot c_{t-1}+i_t\odot g_t\\h_t&=o_t\odot\tanh(c_t)\end{aligned}$$

Здесь $f_t,i_t,o_t\in(0;\,1)$ — вентили на сигмоидах, а tanh выполняет две роли: кандидат $g_t\in(-1;\,1)$ может и увеличить, и уменьшить память (сигмоида умела бы только добавлять), а $\tanh(c_t)$ ограничивает выход. Вдоль цепочки $c_{t-1}\to c_t$ градиент умножается на $f_t$ (если не учитывать зависимость вентилей от $h_{t-1}$), без множителя $\tanh'$, поэтому при $f_t\approx1$ он доходит до далёких шагов.

Немного истории

Ян ЛеКун в 1998 году советовал масштабированный тангенс $1{,}7159\tanh(2x/3)$: он даёт $f(\pm1)=\pm1$ и почти единичную дисперсию выхода. LSTM (Хохрайтер и Шмидхубер, 1997) сделала tanh стандартом рекуррентных сетей на два десятилетия. В свёрточных сетях его вытеснил ReLU: в статье об AlexNet (2012) четырёхслойная свёрточная сеть с ReLU достигла ошибки 25% на обучающей выборке CIFAR-10 в 6 раз быстрее такой же сети с tanh.

В коде: устойчиво и без сюрпризов

Наивная формула через экспоненты при $x=1000$ вычисляет $e^{1000}=\infty$, и получается $\infty/\infty=\text{nan}$. Встроенные np.tanh и torch.tanh устойчивы: при $x\gtrsim19$ они возвращают ровно $1{,}0$ в float64. Но тогда $1-\tanh^2 x$ даёт ровно 0, хотя истинное значение при $x=20$ — около $1{,}7\cdot10^{-17}$. Если нужна производная на далёких хвостах, считайте её через $\operatorname{sech}^2$ в устойчивой форме.

pythonimport numpy as np

def tanh_grad_from_output(t):
    """Производная через уже посчитанный выход t = tanh(x): одно умножение."""
    return 1.0 - t * t

def tanh_grad(x):
    """sech²x = 4e^(−2|x|) / (1 + e^(−2|x|))²:
    без переполнения и без потери точности."""
    e = np.exp(-2.0 * np.abs(x))
    return 4.0 * e / (1.0 + e) ** 2

def naive_tanh(x):
    return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))

print(naive_tanh(1000.0))       # nan: inf / inf (и предупреждение о переполнении)
print(np.tanh(1000.0))          # 1.0 — встроенная функция устойчива
print(1 - np.tanh(20.0) ** 2)   # 0.0: tanh(20) в float64 округляется до 1
print(tanh_grad(20.0))          # 1.6993417021166355e-17 — верное значение
pythonimport torch
import torch.nn as nn

x = torch.tensor([-2.0, 0.0, 2.0], requires_grad=True)
y = torch.tanh(x)               # tensor([-0.9640,  0.0000,  0.9640])
y.sum().backward()
print(x.grad)                   # tensor([0.0707, 1.0000, 0.0707]) = 1 − tanh²

# Инициализация под tanh: усиление 5/3
layer = nn.Linear(256, 256)
nn.init.xavier_uniform_(layer.weight, gain=nn.init.calculate_gain("tanh"))

# Рекуррентная сеть с tanh и обрезка градиента от взрыва
rnn = nn.RNN(input_size=32, hidden_size=64, nonlinearity="tanh", batch_first=True)
out, h = rnn(torch.randn(8, 100, 32))   # 8 последовательностей длины 100
out.pow(2).mean().backward()
nn.utils.clip_grad_norm_(rnn.parameters(), max_norm=1.0)
Правило

Используйте встроенный tanh и автоматическое дифференцирование; на обратном проходе — формулу $1-t^2$ от сохранённого выхода. Для tanh-сетей — инициализация Глоро (Xavier) с усилением $5/3$, для RNN — обрезка нормы градиента.

Частые ошибки

  1. tanh на выходе вместо сигмоиды для вероятности. Выход tanh лежит в $(-1;\,1)$ и не является вероятностью. Для бинарной классификации нужна сигмоида и BCE; tanh на выходе уместен, если цели нормированы в $[-1;\,1]$.
  2. Производная по входу вместо выхода. Формула $1-t^2$ применяется к выходу $t=\tanh x$. Частая опечатка — $1-x^2$ от входа: при $x=2$ она даёт $-3$ вместо $0{,}071$.
  3. Ненормированные входы и крупные веса. Если признаки порядка сотен или веса слишком велики, tanh с первых шагов насыщен и почти не учится. Стандартизируйте данные и берите инициализацию под tanh.
  4. «tanh решает проблему затухания». Он лучше сигмоиды (производная до 1 и центрированность), но тоже насыщается. Для глубоких сетей — ReLU-семейство, нормализация и остаточные связи; для последовательностей — LSTM/GRU.
  5. Самописный tanh через exp. Даёт nan при больших $|x|$. Пользуйтесь np.tanh, torch.tanh.
  • Сигмоида: $\tanh x=2\sigma(2x)-1$ и $\sigma(x)=\tfrac12(1+\tanh\tfrac x2)$; производные связаны как $\tanh' x=4\sigma'(2x)$.
  • ReLU: не насыщается при $x>0$ и вытеснил tanh из глубоких свёрточных сетей.
  • GELU: популярное приближение $0{,}5x\bigl(1+\tanh\bigl(\sqrt{2/\pi}\,(x+0{,}044715x^3)\bigr)\bigr)$.
  • SiLU: $x\sigma(x)=\tfrac x2\bigl(1+\tanh\tfrac x2\bigr)$ — та же S-кривая в роли «мягкого вентиля».
  • MSE: естественная пара для выхода tanh при целях в $[-1;\,1]$.
  • Adam: оптимизатор из рисунка 7; адаптивный шаг помогает проходить плато, созданные насыщением.

Итоги

1) $\tanh x=\frac{e^x-e^{-x}}{e^x+e^{-x}}=\frac{\sinh x}{\cosh x}=2\sigma(2x)-1$ отображает $\mathbb R$ в $(-1;\,1)$, нечётен и проходит через ноль. 2) $\tanh'=1-\tanh^2\le1$, максимум в нуле, на хвостах — насыщение. 3) Ряд Тейлора $x-\frac{x^3}{3}+\dots$ сходится при $|x|<\pi/2$. 4) Центрированные выходы делают обучение следующего слоя быстрее, чем у сигмоиды. 5) Суммы tanh-складок приближают любую непрерывную функцию на компакте; инициализация — Глоро (Xavier) с усилением $5/3$. 6) В RNN tanh держит состояние ограниченным, но градиент через время гаснет — отсюда LSTM.

Проверь себя

1. Известно, что $\tanh 0{,}5\approx0{,}462$. Чему равен $\tanh(-0{,}5)$?
2. Нейрон выдал $t=\tanh z=0{,}8$. Чему равна производная $\tanh' z$?
3. Какое тождество верно?
4. Почему tanh в скрытых слоях обычно обучается быстрее сигмоиды?
5. В RNN с tanh рекуррентный вес сделали очень большим. Что будет с градиентом через много шагов?