Назад
173

Функции активации

173

Зачем нужны нелинейные функции активации?

Давайте докажем эквивалентность линейного слоя и двухслойной сети без функции активации.

Пусть \( A_1, B_1 \) — веса первого линейного слоя, \( A_2, B_2 \) — веса второго. Тогда:

\( y_1 =A_1x+B_1 \) — выход после первого слоя.

\( y_2 =A_2(A_1x+B_1)+B_2 \) — выход после двух слоев. Раскрываем скобки и получаем:

\( y_2 =A_2A_1x+A_2B_1+B_2 \) Делаем замену:

\( A_3=A_2A_1 \), \( B_3=A_2B_1+B_2 \)

И приводим нашу двухслойную нейросеть к однослойной:

\( y_2=A_3x+B_3 \)

Соответственно, двухслойная сеть без функции активации эквивалентна однослойной.

Как нам известно, однослойная нейросеть не способна аппроксимировать любую функцию. Например, мы не можем решить проблему XOR.

В то же время, Теорема Цыбенко гласит: двухслойная нейросеть с непрерывной сигмоидной функцией активации может аппроксимировать любую непрерывную функцию. Но здесь стоит отметить, что для выполнения условий теоремы данными не напасешься 🙂

Сигмоида и гиперболический тангенс

Сигмоида: \( sigmoid(x)=\frac{1}{1+e^{-x}} \)

Гиперболический тангенс: \( tanh(x)=\frac{e^{x}-e^{-x}}{e^x+e^{-x}} \) Данные функции активации ведут себя очень похоже, так как \( tanh(x)=2sigmoid(2x)-1 \). Обе функции активации нелинейны по своей природе. Это значит, что нам можно строить многослойную нейросеть.

А еще их производные — гладкие функции. Кроме того, они обе ограничены с двух сторон: область значений для \( sigmoid \) — \( (0,1) \), а для \( tanh \) — \( (-1,1) \).

В то же время, можно заметить следующее: у обеих функций есть области, на которых они сильно изменяются, при этом, на краях их производная почти равна нулю. Это плохо: когда производная слишком мала, нейросеть начинает обучаться медленнее 🙁

Мы обучаем нейросети с помощью алгоритма обратного распространения ошибок: перемножаем частные производные. А это приводит к тому, что градиент не доходит до первых слоев — проблема затухающего градиента (Vanishing gradient problem).

Трудности вызывает и скорость: сами функции и их производные содержат вычисление экспоненты, а это не самая быстрая операция.

ReLU

К активации, которая лечила бы проблему затухания, можно отнести, например,

\( ReLU(x)= \begin{cases} x &\text{if x>0} \\ 0 &\text{if x<=0} \end{cases} \)

\( Relu \) нелинейна. Значение этой функции, как и значение ее производной, легко вычислить.

Градиент при использовании \( ReLU \) почти не затухает, так как в положительной области он постоянен.

Кроме того, \( ReLU \) и ее производная очень быстро считаются! Однако при большом шаге градиентного спуска может произойти такая ситуация, когда мы шагнули слишком далеко и предыдущий нейрон начал выдавать только отрицательные значения. И если у \( sigmoid \) и \( tanh \) есть шанс выровнять это в область нормальных значений за счет постоянного ненулевого градиента, то у \( ReLU \) такой возможности нет, нейрон “умрет“ до конца обучения.

Несмотря на это, глубокие нейросети с \( ReLU \) достаточно хорошо и быстро обучаются на практике.

Leaky ReLU и PReLU

Если мы не хотим, чтобы нейроны “умирали” — мы всегда можем воспользоваться \( Leaky ReLU \).

\( Leaky ReLU(x)= \begin{cases} x &\text{if x>0} \\ cx &\text{if x<=0} \end{cases} \)

Эта функция линейна в отрицательной области. Она также имеет гиперпараметр \( c \), показывающий угол ее наклона.

Обычно \( с \) берут маленьким, например, 0.01. Это помогает избавиться от градиента, равного нулю.

Логичным улучшением \( Leaky ReLU \) является \( PReLU \) с обучаемым параметром \( c \). Обычно эти две функции несильно улучшают процесс обучения нейросетей, но иногда ими можно воспользоваться.

Swish

\( Swish(x)=xSigmoid(\beta x) \)

Эта функция имеет параметр \( \beta \). Его можно зафиксировать, а можно обучить, как в \( PReLU \).

Функция стала популярна после статьи, в которой авторы решили найти лучшую функцию активации. Они перебрали комбинации простых функций и обнаружили, что эта функция в большинстве случаев ведет себя лучше, чем \( PReLU \). После ее открытия авторы поразмышляли о причине такого сравнительно лучшего поведения и пришли к следующему выводу: преимущества функции в том, что она гладкая и немонотонная. Главное же ее отличие от всех вышеупомянутых функций — “углубление” в зоне отрицательных чисел. При обучении в него попадает очень много значений.

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!