Зачем нужны функции активации и что делает их такими особенными

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

Функции активации добавляют нейронным сетям обучаемость. Многие задачи, которые решаются с помощью нейронных сетей, содержат нелинейности, такие как изображения, тексты, звуковые волны. Таким образом, нам нужна нелинейность для решения наиболее распространенных задач в области глубокого обучения, таких как распознавание изображений и голоса, обработка естественного языка и так далее.

Нейрон без функции активации - это просто линейная комбинация входов и смещения.

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

Доступно множество различных функций активации. У каждого есть свои плюсы и минусы, а также свои особенности. Нас интересует не только сама функция активации, но и ее производная. Причина в том, как нейронные сети на самом деле «учатся».

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

Доступно множество функций активации. Мы рассмотрим наиболее часто используемые нелинейные функции активации в нейронных сетях.

сигмовидная

Мы знакомы с сигмовидной функцией из логистической регрессии. Это знаменитая функция в форме буквы S, которая преобразует входные значения в диапазон от 0 до 1.

Давайте построим это. Сначала мы создаем массив numpy и применяем к нему сигмовидную функцию.

import numpy as np
import pandas as pd
x = np.linspace(-10,10,50)
y = 1 / (1 + np.exp(-x))

Затем постройте его с помощью matplotlib.

import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(8,5))
plt.title("Sigmoid Function", fontsize=15)
plt.grid()
plt.plot(x, y)

Выход каждого нейрона нормализован между 0 и 1. Средняя область на графике выше показывает, что небольшие изменения в x (вход) вызывают относительно большие изменения в y (выход). Сигмовидная функция хороша для обнаружения различий в этих областях, что делает ее хорошим классификатором. Таким образом, он обычно используется в задачах двоичной классификации.

К сожалению, нет ничего идеального. Есть обратная сторона сигмовидной функции. По мере удаления от центра изменения значения x практически не изменяют значение y. Давайте посмотрим на производную сигмовидной функции. Мы можем использовать функцию градиента numpy для вычисления производной:

x = np.linspace(-10,10,50)
dx = x[1]-x[0]
y = 1 / (1 + np.exp(-x))
dydx = np.gradient(y, dx)

Затем мы строим y и dydx на одном графике:

plt.figure(figsize=(8,5))
plt.title("Sigmoid Function and Its Derivative", fontsize=15)
plt.grid()
plt.plot(x, y)
plt.plot(x, dydx)

Как мы видим, производная стремится к нулю по мере удаления от центра. Прежде чем комментировать этот график, давайте вспомним, как обучаются нейронные сети. Обучение нейронной сети означает обновление весов для минимизации потерь (разницы между фактическими и прогнозируемыми значениями). Веса обновляются на основе градиента, который в основном является производной функции. Если градиент очень близок к нулю, веса обновляются с очень маленькими приращениями. Это приводит к тому, что нейронная сеть обучается так медленно, и требуется вечность, чтобы сойтись. Это также известно как проблема исчезающего градиента.

Тангенс (гиперболический тангенс)

Тань очень похож на сигмовидную функцию, за исключением того, что она симметрична относительно начала координат. Выходные значения ограничены диапазоном (-1, + 1).

x = np.linspace(-5,5,80)
y_tanh =2*(1 / (1 + np.exp(-2*x)))-1
plt.figure(figsize=(8,5))
plt.title("Tanh Function", fontsize=15)
plt.grid()
plt.plot(x, y_tanh)

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

Производное tanh похоже на производное сигмовидной кишки, но круче.

Как видно из производной линии, tanh также страдает от проблемы исчезающего градиента.

ReLU (выпрямленная линейная единица)

Выходной сигнал функции relu равен входному значению для входов, превышающих 0. Для всех остальных входных значений выход равен 0.

x = np.linspace(-10,10,50)
y_relu = np.where(x < 0, 0, x)
plt.figure(figsize=(8,5))
plt.title("ReLU Function", fontsize=15)
plt.grid()
plt.plot(x, y_relu)

Relu позволяет активировать только некоторые нейроны в сети, что делает более эффективными вычисления, чем tanh и сигмоид. Все нейроны активируются с помощью tanh и sigmoid, что приводит к интенсивным вычислениям. Таким образом, relu сходится быстрее, чем tanh и сигмовидная.

Производная relu равна 1 для входных значений больше 0. Для всех других входных значений производная равна 0, что приводит к тому, что некоторые веса никогда не обновляются во время обратного распространения. Таким образом, нейронная сеть не может обучаться при отрицательных входных значениях. Эта проблема известна как проблема dying relu. Одно из решений для использования функции утечки relu.

Утечка ReLU

То же, что и relu, за исключением положительных входных значений. Для отрицательных значений утечка relu выводит очень маленькое число, тогда как relu просто дает 0.

Софтмакс

Softmax принимает входные значения действительных чисел и нормализует их в распределение вероятностей. Вероятности пропорциональны экспонентам входных значений. Предположим, выходной слой нейронных сетей состоит из 10 нейронов. Функция Softmax принимает эти 10 выходных данных и создает распределение вероятностей. Вероятности 10 значений в сумме дают 1.

Активация Softmax используется в задачах классификации с несколькими классами.

Swish

Swish - это функция активации с автоматическим входом, относительно новая по сравнению с теми, которые мы обсуждали до сих пор. Это обнаружено исследователями Google. С точки зрения вычислительной эффективности он похож на relu, но работает лучше, чем relu на более глубоких моделях. Как утверждают исследователи, swish имеет тенденцию работать лучше, чем полагаться на более глубокие модели в ряде сложных наборов данных.

Построим график взмаха.

x = np.linspace(-5,5,50)
y_swish = x*(1 / (1 + np.exp(-x)))
plt.figure(figsize=(8,5))
plt.title("Swish Function", fontsize=15)
plt.grid()
plt.plot(x, y_swish)

Swish не имеет острого края на 0, в отличие от relu, который упрощает схождение во время тренировки.

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

  • Недорогой в вычислительном отношении
  • С нулевым центрированием
  • Отлично. Производная функции активации должна нести информацию о входных значениях, потому что веса обновляются на основе градиентов.
  • Не вызывает проблемы с исчезающим градиентом

Спасибо за чтение. Пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.