Всем привет! Меня зовут Радмир, я — начинающий исследователь в области NLP. В этой статье я расскажу о своей идее — LTanh: функция активации, стабилизирующая градиент Tanh.
Итак, наш план:
Разберем основную идею LTanh.
Разберем производную Tanh.
Разберем производную LTanh.
Посмотрим на отличия LTanh от Tanh.
Сравним лоб в лоб две производные.
Что ж, приступим.
Идея LTanh — зачем он нужен
Недавно я разбирал производные функций, в том числе и функции Tanh. Я заметил, что производная Tanh падает довольно быстро — уже примерно в точке x = ±2 градиент Tanh довольно мелкий, а точка x = ±2 является частой в нейросетях. И тогда я задумался — как же можно исправить это, повысив градиент, при этом сильно не увеличивая диапазон выходов функции?
Сначала мне в голову пришла формула:

Но, взяв производную по ней, я увидел, что она неопределенна в нуле. Тогда я решил добавить Sigmoid в формулу. Теперь формула стала такая:

Теперь производная определена в нуле и равна 0,25. Но теперь функция сильно отличается от обычного Tanh. Для исправления я добавил умножение на Tanh(x), и формула стала такая:

Теперь функция ещё больше похожа на Tanh — на графике S‑образная (видно на фото выше). Но у нас немного несимметрично на графике: при больших положительных значениях x функция насыщается и выдаёт число, близкое к 2, а при больших отрицательных — близкое к -1. Так как производная по константе равна 0 и не помешает градиенту — мы добавим вычитание из результата функции 0,5 и получим симметричный интервал выходов — (−1,5; 1,5). Итак, формула:

Функция стала больше похожа на Tanh: S‑образна, интервал выходных значений LTanh не сильно отличается от Tanh — разница всего в (−0,5; 0,5).
Формула готова. Давайте теперь пойдём далее — сравним её производную с производной Tanh. Для этого разберём две производные двух функций: Tanh и LTanh.
Производная Tanh
Давайте вспомним формулу производной Tanh:
Будем находить производную по этой формуле. Сначала вычислим производную в точках 0, 1, 2, 3, 4, 5, а потом посмотрим на поведение производной. Давайте начнём:
x | formula | tanh(x)' |
0 | 1-0² | 1 |
1 | 1–0,761² | 0,42 |
2 | 1–0,9640² | 0,07 |
3 | 1–0,995² | 0,0099 |
4 | 1–0,9993² | 0,0013 |
5 | 1–0,9999² | 0,00019 |
Исходя из таблицы выше, мы видим, как быстро тухнет градиент с приращением x. Для нейросетей это не есть хорошо — обучение может остановиться. Пойдем дальше — вычислим такую же таблицу производных для LTanh.
Производная LTanh
Давайте выведем формулу производной LTanh:
Будем находить производную по этой формуле. Сначала вычислим производную в точках 0, 1, 2, 3, 4, 5, а потом посмотрим на поведение производной. Давайте начнём:
x | formula | LTanh(x)' |
0 | 0+0,5+0,25 | 0,75 |
1 | 0,0846+0,279+0,196 | 0,5596 |
2 | 0,0603+0,0530+0,1050 | 0,2182 |
3 | 0,0398+0,0079+0,0452 | 0,0929 |
4 | 0,0278+0,0011+0,0177 | 0,0466 |
5 | 0,0204+0,0002+0,0066 | 0,0272 |
Можно сразу заметить, что производная LTanh ползёт вниз не так быстро, как у Tanh. Чем больше |x|, тем градиент становится всё больше и больше по сравнению с Tanh. Можно сказать, что производная более плавная.
Отличия LTanh от Tanh
На самом деле отличий мало. Первое и самое главное — градиенты. Градиенты у LTanh затухают медленнее, чем у Tanh. Это даёт хороший буст в глубоких сетях. Также выходные значения функции находятся в интервале (−1,5; 1,5), в отличие от Tanh (−1; 1).
Сравнение производных
По таблицам выше видно, что градиенты у LTanh тухнут более медленно, чем у Tanh. Это связано с тем, что в производной есть множитель, который вносит стабильность градиенту:
Как итог
Сегодня мы разобрали функцию LTanh и посмотрели на её производные. Сразу видно, что для глубоких сетей LTanh подходит больше, чем Tanh, за счёт стабильности градиентов и меньшего затухания.
Также я построил для вас график производных для наглядности — тут. Примечание:
Буква | Цвет | Функция |
T | Красный | Tanh(x)' |
L | Синий | LTanh(x)' |
S | Зеленый | Softsign(x)' |
D | Черный | Sigmoid(x)' |