Функции активации
Зачем нужны нелинейные функции активации?
Давайте докажем эквивалентность линейного слоя и двухслойной сети без функции активации.
Пусть
\( 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 \). После ее открытия авторы поразмышляли о причине такого сравнительно лучшего поведения и пришли к следующему выводу: преимущества функции в том, что она гладкая и немонотонная. Главное же ее отличие от всех вышеупомянутых функций — “углубление” в зоне отрицательных чисел. При обучении в него попадает очень много значений.