Функция F.softplus
Функция F.softplus применяет к каждому элементу тензора преобразование, которое является гладкой аппроксимацией функции ReLU. Она вычисляется по формуле log(1 + exp(x)) и позволяет получать градиенты для отрицательных значений, что помогает избежать проблемы "мертвых" нейронов. Функция принимает на вход тензор произвольной формы и возвращает тензор той же формы с примененным преобразованием.
Синтаксис
torch.nn.functional.softplus(input, beta=1.0, threshold=20.0)
Параметр beta управляет крутизной функции: чем больше значение, тем быстрее она приближается к ReLU. Параметр threshold задает порог, выше которого функция переключается на линейное приближение для численной стабильности.
Пример
Давайте применим softplus к тензору с положительными и отрицательными числами:
import torch
import torch.nn.functional as F
t = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
res = F.softplus(t)
print(res)
Результат выполнения кода:
tensor([0.1269, 0.3133, 0.6931, 1.3133, 2.1269])
Обратите внимание, что для отрицательных значений функция возвращает небольшие положительные числа, а для положительных - значения, близкие к исходным.
Пример
Давайте сравним softplus с ReLU на одном тензоре:
import torch
import torch.nn.functional as F
t = torch.tensor([-3.0, -1.5, 0.0, 1.5, 3.0])
softplus_res = F.softplus(t)
relu_res = F.relu(t)
print("Softplus:", softplus_res)
print("ReLU: ", relu_res)
Результат выполнения кода:
Softplus: tensor([0.0486, 0.2014, 0.6931, 1.7014, 3.0486])
ReLU: tensor([0.0000, 0.0000, 0.0000, 1.5000, 3.0000])
Softplus дает гладкие значения для отрицательных чисел, в то время как ReLU просто обнуляет их.
Пример
Давайте изменим параметр beta, чтобы сделать функцию более крутой:
import torch
import torch.nn.functional as F
t = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
res_default = F.softplus(t)
res_beta2 = F.softplus(t, beta=2.0)
print("beta=1.0:", res_default)
print("beta=2.0:", res_beta2)
Результат выполнения кода:
beta=1.0: tensor([0.1269, 0.3133, 0.6931, 1.3133, 2.1269])
beta=2.0: tensor([0.0181, 0.0676, 0.6931, 2.0676, 4.0181])
При увеличении beta функция быстрее приближается к ReLU, и значения для положительных чисел становятся ближе к исходным.
Пример
Давайте применим softplus к двумерному тензору:
import torch
import torch.nn.functional as F
t = torch.tensor([
[-1.0, 0.0, 1.0],
[2.0, -2.0, 3.0]
])
res = F.softplus(t)
print(res)
Результат выполнения кода:
tensor([
[0.3133, 0.6931, 1.3133],
[2.1269, 0.1269, 3.0486]
])
Смотрите также
-
функцию
relu,
которая реализует функцию выпрямления -
функцию
leaky_relu,
которая позволяет небольшие градиенты для отрицательных значений -
функцию
sigmoid,
которая преобразует значения в диапазон от 0 до 1 -
функцию
tanh,
которая преобразует значения в диапазон от -1 до 1