Activation¶
Описание¶
Общая информация¶
Этот модуль реализует операцию активации слоя.
Функция активации - это заданная математическая операция над данными, которая добавляет нелинейность в преобразования нейронной сети.
Реализованные функции активации¶
Sigmoid¶
Принимает на вход произвольное вещественное число, а на выходе дает вещественное число в интервале от 0 до 1.
Вычисляется по формуле:
График функции:
Плюсы:
- бесконечно дифференцируемая гладкая функция
Минусы:
-
насыщение сигмоиды приводит к затуханию градиента: в процессе обратного распространения ошибки локальный градиент, который может быть очень малым, умножается на общий - и в таком случае обнуляет его. Из-за этого сигнал почти не проходит через нейрон к его весам и рекурсивно к его данным;
-
выход сигмоиды не центрирован относительно нуля: нейроны в последующих слоях будут получать значения, которые также не центрированы относительно нуля, что оказывает влияние на динамику градиентного спуска.
Tanh¶
Принимает на вход произвольное вещественное число, а на выходе дает вещественное число в интервале от –1 до 1.
Вычисляется по формуле:
График функции:
Плюсы:
- бесконечно дифференцируемая гладкая функция
- центрирована относительно нуля
Минусы:
- проблема насыщения
ReLU¶
Реализует пороговый переход в нуле. Принимает значения на интервале [0, +∞). В данный момент ReLU является одной из самых популярных функций активации, а вокруг нее образовалось множество модификаций.
Вычисляется по формуле:
Графики этой функции и двух ее нижеописанных модификаций:
Плюсы:
- вычислительная простота
- быстрота сходимости стохастического градиента
Минусы:
- затухающий градиент (устраняется выбором соответствующей скорости обучения)
- не гладкая функция
LeakyReLU¶
Модификация ReLU с добавлением малой константы α, при этом получаем, что при отрицательных значениях аргумента значение функции находится достаточно близко к нулю, но не равно ему. Принимает значения на интервале (-∞, +∞).
Вычисляется по формуле:
График приведен на изображении выше.
Плюсы:
- вычислительная простота
- быстрота сходимости стохастического градиента
Минусы:
- затухающий градиент
- не гладкая функция
ELU¶
Гладкая модификация ReLU и LeakyReLU. Принимает значения на интервале [-α, +∞).
Вычисляется по формуле:
График приведен выше.
Плюсы:
- вычислительная простота
- быстрота сходимости стохастического градиента
- гладкая функция
Минусы:
- затухающий градиент
SoftPlus¶
Гладкая функция активации. Принимает значения на интервале [0, +∞).
Вычисляется по формуле:
График функции:
Плюсы:
- гладкая бесконечно дифференцируемая функция
Минусы:
- не центрирована относительно нуля
- затухающий градиент
Дополнительные источники¶
- Статья на Википедии с большой сравнительной характеристической таблицей всех популярных функций активации.
Инициализация¶
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
Сформируем наглядные данные.
np.random.seed(123)
h, w = 3, 3
data = gpuarray.to_gpu(np.random.randint(-10, 10, (h, w)).astype(np.float32))
print(data)
[[ 3. -8. -8.]
[ -4. 7. 9.]
[ 0. -9. -10.]]
Допустим, нам интересен сигмоид в качестве функции активации. Инициализируем объект и отправим в него данные.
act = Activation('sigmoid')
print(act(data))
[[0.95257413 0.00033535017 0.00033535017]
[0.01798621 0.999089 0.99987662 ]
[0.5 0.00012339462 0.000045397865 ]]
ReLU:
act = Activation("relu")
print(act(data))
[[3. 0. 0.]
[0. 7. 9.]
[0. 0. 0.]]