Есть четыре возможности в зависимости от того, что вы ищете. Вам нужно будет задать себе два вопроса:
Q1) Будут ли у вашей функции активации настраиваемые параметры?
Если yes , у вас нет выбора для создания функции активации в качестве класса nn.Module
, потому что вам нужно хранить эти веса.
Если нет , вы можете просто создать обычную функцию или класс, в зависимости от того, что вам удобно.
Q2) Может ли ваша функция активации быть выражена как комбинация существующих функций PyTorch?
Если да , вы можете просто написать это как комбинацию существующей функции PyTorch, и вам не нужно будет создавать функцию backward
, которая определяет градиент.
Если нет , вам нужно будет написать градиент вручную.
Пример 1: функция Swish
Функция swish f(x) = x * sigmoid(x)
не имеет изученных весов и может быть полностью записана с использованием существующих функций PyTorch, поэтому вы можете просто определить ее как функцию:
def swish(x):
return x * torch.sigmoid(x)
, а затем просто используйте его, как если бы вы имели torch.relu
или любую другую функцию активации.
Пример 2. Swish с выученным уклоном
В этом случае у вас есть один запомненный параметр - наклон, поэтому вам нужно сделать из него класс.
class LearnedSwish(nn.Module):
def __init__(self, slope = 1):
super().__init__()
self.slope = slope * torch.nn.Parameter(torch.ones(1))
def forward(self, x):
return self.slope * x * torch.sigmoid(x)
Пример 3: с обратным ходом
Если у вас есть что-то, для чего вам нужно создать собственную функцию градиента, вы можете посмотреть на этот пример: Pytorch: определить пользовательскую функцию