Пошаговое руководство по математическим определениям, алгоритмам и реализациям функций активации в PyTorch.

Вы можете найти часть 2 здесь.

Вступление

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

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

  • (Слегка) положительно: ReLU и Leaky ReLU
  • Между 0 и 1: сигмовидный, Softmax.
  • Между -1 и 1: Тань

1. (Слегка) положительный

Если вы хотите изменить входные данные и принимать только их положительные значения, тогда подойдет либо Rectified Linear Unit (ReLU), либо Leaky ReLU.

а. Выпрямленный линейный блок (ReLU)

При вводе x ReLU примет максимальное значение от 0 до x. Графически ReLU имеет следующее преобразующее поведение.

Реализовать функцию ReLU в python можно следующим образом:

import numpy as np
arr_before = np.array([-1, 1, 2])
def relu(x):
    x = np.maximum(0,x)
    return x
arr_after = relu(arr_before)
arr_after
#array([0, 1, 2])

А в PyTorch можно легко вызвать функцию активации ReLU.

import torch.nn
relu = nn.ReLU()
input = torch.randn(2)
output = relu(input)

б. Выпрямленный линейный блок с утечкой (ReLU)

Между ReLU и Leaky ReLU есть небольшая разница. При заданном вводе x Leaky ReLU примет максимальное значение от 0 до x, если значение положительное, в противном случае он умножит x на заданный отрицательный наклон. Графически ReLU имеет следующее преобразующее поведение.

Реализовать функцию активации Leaky ReLU в python можно следующим образом:

import numpy as np
arr_before = np.array([-1, 1, 2])
# If x>0 returns x, else returns x*negative_slope
def leaky_relu(x, neg_slope=0.01):
    x = np.where(x>0, x, x*neg_slope)
    return x
arr_after = leaky_relu(arr_before)
arr_after
#array([-0.01, 1., 2.])

А в PyTorch вы можете легко вызвать функцию активации Leaky ReLU.

import torch.nn
neg_slope=0.01
leaky_relu = nn.LeakyReLU(neg_slope) #Pass in negative slope value
input = torch.randn(2)
output = leaky_relu(input)

2. От 0 до 1

Если вы хотите вывести значения от 0 до 1 (полезно для вероятностной классификации проблем), тогда будет подходящей функция активации Sigmoid или Softmax в зависимости от некоторых оговорок, обсуждаемых ниже.

а. Сигмовидная

Графически Sigmoid имеет следующее трансформирующее поведение, которое ограничивает выходы до [0,1].

Реализовать сигмовидную функцию в Python можно следующим образом:

import numpy as np
arr_before = np.array([-1, 1, 2])
def sigmoid(x):
    x = 1 / (1 + np.exp(-x))
    return x
arr_after = sigmoid(arr_before)
arr_after
#array([0.26894142, 0.73105858, 0.88079708])

А в PyTorch вы можете легко вызвать функцию активации сигмоида.

import torch.nn
sigmoid = nn.Sigmoid()
input = torch.randn(2)
output = sigmoid(input)

б. Софтмакс

Softmax похож на сигмовидную функцию активации в том, что выходной сигнал каждого элемента находится в диапазоне от 0 до 1 (т.е. [0,1]). Разница заключается в том, что softmax нормализует члены экспоненты, так что сумма компонентов равна 1. Таким образом, softmax часто используется для задач многоклассовой классификации, где общая вероятность по известным классам обычно составляет до 1.

Реализовать функцию Softmax в Python можно следующим образом:

import numpy as np
arr_before = np.array([-1, 1, 2])
def softmax(x):
    numerator = np.exp(x)
    denominator = np.sum(np.exp(x))
    x = numerator / denominator
    return x
arr_after = softmax(arr_before)
arr_after
#array([0.03511903, 0.25949646, 0.70538451]) #Sums up to 1

А в PyTorch вы можете легко вызвать функцию активации Softmax.

import torch.nn
softmax = nn.Softmax(dim=1)
input = torch.randn(2, 3)
output = softmax(input)

3. От -1 до 1

Если вы хотите преобразовать значения между -1 и 1, то подходящей функцией активации может быть Tanh.

а. Тань

Графически Tanh имеет следующее поведение активации, которое ограничивает выходы между [-1,1].

Реализовать функцию Tanh в python можно следующим образом:

import numpy as np
arr_before = np.array([-1, 1, 2])
def tanh(x):
    x = (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
    return x
arr_after = tanh(arr_before)
arr_after
#array([-0.76159416,  0.76159416,  0.96402758])

А в PyTorch вы можете легко вызвать функцию активации Tanh.

import torch.nn
tanh = nn.Tanh()
input = torch.randn(2)
output = tanh(input)

Заключение

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

Подпишитесь на мою информационную рассылку по электронной почте: https://tinyurl.com/2npw2fnz , где я регулярно резюмирую исследовательские работы по ИИ на простом английском языке и в красивой визуализации.