Функция smooth_l1_loss
Функция smooth_l1_loss (также известная как функция потери Хьюбера в некоторых реализациях) вычисляет потерю между каждым элементом входного тензора input и целевым тензором target. Она представляет собой комбинацию L1 и L2 потерь: при больших ошибках ведет себя как L1 (линейная), что делает её устойчивой к выбросам, а при малых ошибках - как L2 (квадратичная), что обеспечивает гладкий градиент. Первым параметром функция принимает тензор предсказаний, вторым - тензор целевых значений. Третьим параметром можно указать размер партии для усреднения. Четвертый параметр beta задает порог, определяющий переход между L1 и L2 поведением.
Математически функция определяется следующим образом: если абсолютная разница между предсказанием и целью меньше beta, то используется квадратичная функция (L2), иначе - линейная (L1), сглаженная в точке перехода.
Синтаксис
torch.nn.functional.smooth_l1_loss(
input,
target,
size_average=None,
reduce=None,
reduction='mean',
beta=1.0
)
Параметры
-
input- тензор предсказанных значений. -
target- тензор целевых значений. -
size_average- устаревший параметр, вместо него используйтеreduction. -
reduce- устаревший параметр, вместо него используйтеreduction. -
reduction- строка, определяющая режим усреднения:'mean'(усреднение по элементам),'sum'(суммирование) или'none'(без усреднения). Значение по умолчанию:'mean'. -
beta- положительное число, задающее порог перехода между L1 и L2 поведением. Значение по умолчанию:1.0.
Пример с разными параметрами beta
Рассмотрим работу функции для двух пар предсказаний и целей с разными значениями beta:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
input = torch.tensor([0.5, 2.5, -1.0])
target = torch.tensor([0.0, 3.0, -2.0])
res1 = F.smooth_l1_loss(input, target, beta=0.5)
res2 = F.smooth_l1_loss(input, target, beta=1.0)
res3 = F.smooth_l1_loss(input, target, beta=2.0)
print(res1)
print(res2)
print(res3)
Результат выполнения кода:
tensor(0.1667)
tensor(0.2083)
tensor(0.2917)
Пример с режимом суммирования
Используем параметр reduction='sum' для получения суммы потерь вместо среднего значения:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
input = torch.tensor([0.2, 1.2, -0.5])
target = torch.tensor([0.0, 1.0, 0.0])
res = F.smooth_l1_loss(input, target, reduction='sum', beta=1.0)
print(res)
Результат выполнения кода:
tensor(0.0850)
Пример без усреднения
Используем reduction='none' для получения тензора поэлементных потерь:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
input = torch.tensor([1.5, 0.2, -0.8])
target = torch.tensor([1.0, 0.0, 0.0])
res = F.smooth_l1_loss(input, target, reduction='none', beta=0.5)
print(res)
Результат выполнения кода:
tensor([0.1250, 0.0200, 0.2950])
Использование в качестве функции потерь в обучении
Функция smooth_l1_loss часто используется в задачах регрессии, особенно в детекции объектов. Приведем пример вычисления потерь для двух батчей предсказаний:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
pred = torch.randn(4, 3)
target = torch.randn(4, 3)
loss = F.smooth_l1_loss(pred, target, beta=1.0)
print(loss)
Результат выполнения кода:
tensor(0.7565)
Смотрите также
-
функцию
l1_loss,
которая вычисляет среднюю абсолютную ошибку -
функцию
mse_loss,
которая вычисляет среднеквадратичную ошибку -
функцию
huber_loss,
которая является обобщением smooth L1 для задач регрессии -
функцию
cross_entropy,
которая вычисляет кросс-энтропийную потерю для классификации