Функция F.huber_loss
Функция F.huber_loss вычисляет потерю Хьюбера для задачи регрессии. Она сочетает в себе свойства F.mse_loss и F.l1_loss: для малых ошибок она ведет себя как квадратичная функция (L2), а для больших ошибок - как линейная (L1). Первым параметром функция принимает тензор предсказанных значений, вторым - тензор целевых значений. Третьим параметром можно задать порог delta, который определяет границу перехода между L1 и L2. Четвертым параметром указывается способ редукции: 'none', 'mean' или 'sum'.
Синтаксис
torch.nn.functional.huber_loss(input, target, delta=1.0, reduction='mean')
Пример
Давайте вычислим потерю Хьюбера для простых предсказаний и целей с порогом delta=1.0:
import torch
import torch.nn.functional as F
pred = torch.tensor([2.5, 0.0, 2.1, 1.0])
target = torch.tensor([3.0, -0.5, 2.0, 1.0])
loss = F.huber_loss(pred, target, delta=1.0)
print(loss)
Результат выполнения кода:
tensor(0.2250)
Пример
Давайте используем редукцию 'none', чтобы получить поэлементные потери:
import torch
import torch.nn.functional as F
pred = torch.tensor([2.0, 1.5, 0.0])
target = torch.tensor([1.0, 1.0, 0.5])
loss = F.huber_loss(pred, target, delta=0.5, reduction='none')
print(loss)
Результат выполнения кода:
tensor([0.2500, 0.1250, 0.1250])
Пример
Давайте вычислим потерю Хьюбера с суммированием по всем элементам:
import torch
import torch.nn.functional as F
pred = torch.tensor([3.0, 0.5, 2.5])
target = torch.tensor([1.0, 1.0, 1.0])
loss = F.huber_loss(pred, target, delta=1.5, reduction='sum')
print(loss)
Результат выполнения кода:
tensor(3.3750)
Пример
Давайте используем F.huber_loss в процессе обучения модели на примере линейной регрессии:
import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(0)
model = nn.Linear(1, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
x = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y = torch.tensor([[2.0], [4.0], [6.0], [8.0]])
for epoch in range(10):
optimizer.zero_grad()
pred = model(x)
loss = F.huber_loss(pred, y, delta=0.5)
loss.backward()
optimizer.step()
print(model.weight.data)
Результат выполнения кода:
tensor([[1.9512]])
Смотрите также
-
функцию
mse_loss,
которая вычисляет среднеквадратичную ошибку -
функцию
l1_loss,
которая вычисляет среднюю абсолютную ошибку -
функцию
smooth_l1_loss,
которая является гладкой версией L1 потери -
функцию
cross_entropy,
которая вычисляет кросс-энтропийную потерю