Activation

Описание

Info

Родительский класс: Module

Производные классы: -

Общая информация

Этот модуль реализует операцию активации слоя.

Функция активации - это заданная математическая операция над данными, которая добавляет нелинейность в преобразования нейронной сети.

Реализованные функции активации


Sigmoid

Принимает на вход произвольное вещественное число, а на выходе дает вещественное число в интервале от 0 до 1.

Вычисляется по формуле:

\begin{equation}\label{eq:sigmoid} σ(x) = \frac{1}{(1 + e^{-x})} \end{equation}

График функции:

сигмоида

Плюсы:

  • бесконечно дифференцируемая гладкая функция

Минусы:

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

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


Tanh

Принимает на вход произвольное вещественное число, а на выходе дает вещественное число в интервале от –1 до 1.

Вычисляется по формуле:

\begin{equation}\label{eq:hyptan} th(x) =\frac{e^x-e^{-x}}{e^x+e^{-x}} \end{equation}

График функции:

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

Плюсы:

  • бесконечно дифференцируемая гладкая функция
  • центрирована относительно нуля

Минусы:

  • проблема насыщения

ReLU

Реализует пороговый переход в нуле. Принимает значения на интервале [0, +∞). В данный момент ReLU является одной из самых популярных функций активации, а вокруг нее образовалось множество модификаций.

Вычисляется по формуле:

\begin{equation}\label{eq:relu} f(x) = \operatorname{max} (0, x) \end{equation}

Графики этой функции и двух ее нижеописанных модификаций:

все виды relu

Плюсы:

  • вычислительная простота
  • быстрота сходимости стохастического градиента

Минусы:

  • затухающий градиент (устраняется выбором соответствующей скорости обучения)
  • не гладкая функция

LeakyReLU

Модификация ReLU с добавлением малой константы α, при этом получаем, что при отрицательных значениях аргумента значение функции находится достаточно близко к нулю, но не равно ему. Принимает значения на интервале (-∞, +∞).

Вычисляется по формуле:

\begin{equation} \begin{matrix} \ f(x) & = & \left\{ \begin{matrix} \alpha x & \mbox{if } x < 0 \\ x & \mbox{иначе} \end{matrix} \right. \end{matrix} \end{equation}

График приведен на изображении выше.

Плюсы:

  • вычислительная простота
  • быстрота сходимости стохастического градиента

Минусы:

  • затухающий градиент
  • не гладкая функция

ELU

Гладкая модификация ReLU и LeakyReLU. Принимает значения на интервале [-α, +∞).

Вычисляется по формуле:

\begin{equation} \begin{matrix} \ f(x) & = & \left\{ \begin{matrix} x & \mbox{if } x > 0 \\ \alpha (e^x - 1) & \mbox{иначе} \end{matrix} \right. \end{matrix} \end{equation}

График приведен выше.

Плюсы:

  • вычислительная простота
  • быстрота сходимости стохастического градиента
  • гладкая функция

Минусы:

  • затухающий градиент

SoftPlus

Гладкая функция активации. Принимает значения на интервале [0, +∞).

Вычисляемая по формуле:

\begin{equation}\label{eq:softplus} f(x) = ln(1+e^x) \end{equation}

График выглядит так:

софтплюс

Плюсы:

  • гладкая бесконечно дифференцируемая функция

Минусы:

  • не центрирована относительно нуля
  • затухающий градиент

Дополнительные источники

  • Статья на Википедии с большой сравнительной характеристической таблицей всех популярных функций активации.

Инициализация

def __init__(self, activation, slc=None, inplace=False, name=None, args=()):

Параметры

Параметр Возможные типы Описание По умолчанию
activation str Вид активации. -
slc slice Срез, по которому будет вычислена функция активации. None
inplace bool Если True, то выходной тензор будет записан в памяти на место входного. False
name str Имя слоя. None

Пояснения

activation - определяет выбранную функцию активации. Реализованные функции активации на данный момент: "sigmoid", "tanh", "relu", "leakyRelu", "elu", "softPlus", "clip".


inplace - флаг, показывающий, нужно ли выделять дополнительные ресурсы памяти для результата. Если True, то выходной тензор будет записан в памяти на место входного, что может негативно отразиться на работе сети, если входной тензор должен принимать участие в расчётах на других ветках графа.

Примеры

Необходимые импорты.

>>> import numpy as np
>>> from PuzzleLib.Backend import gpuarray
>>> from PuzzleLib.Modules import Activation

Info

gpuarray необходим для правильного размещения тензора на GPU

Сформируем наглядные данные.

>>> h, w = 3, 3
>>> data = gpuarray.to_gpu(np.random.randint(-10, 10, (h, w)).astype(np.float32))
>>> data
[[ 5.  9. -4.]
 [ 2.  5.  7.]
 [-1.  1.  2.]]

Допустим, нам интересен сигмоид в качестве функции активации. Инициализируем объект и отправим в него данные.

>>> act = Activation('sigmoid')
>>> act(data)
[[0.9933071  0.9998766  0.01798621]
 [0.8807971  0.9933071  0.999089  ]
 [0.26894143 0.7310586  0.8807971 ]]

ReLU:

>>> act = Activation("relu")
>>> act(data)
[[5. 9. 0.]
 [2. 5. 7.]
 [0. 1. 2.]]