Класс HuberLoss
Класс HuberLoss реализует функцию потерь Хьюбера,
которая сочетает в себе свойства L1Loss и MSELoss.
Эта функция менее чувствительна к выбросам, чем квадратичная ошибка,
но при этом имеет более гладкий градиент, чем абсолютная ошибка.
Параметр delta определяет порог переключения между квадратичной
и линейной частями функции.
Синтаксис
torch.nn.HuberLoss(delta=1.0, reduction='mean')
Основные параметры:
-
delta- пороговое значение, при превышении которого функция переключается с квадратичной на линейную -
reduction- способ агрегации результатов:'none','mean'или'sum'
Пример
Создадим функцию потерь и применим её к предсказаниям:
import torch
loss_fn = torch.nn.HuberLoss(delta=1.0)
pred = torch.tensor([0.5, 1.2, 2.8, 0.3])
target = torch.tensor([1.0, 1.0, 3.0, 0.5])
loss = loss_fn(pred, target)
print(loss.item())
Результат выполнения кода:
0.171875
Пример
Сравним работу HuberLoss с MSELoss и L1Loss
на данных с выбросом:
import torch
pred = torch.tensor([1.0, 2.0, 3.0, 100.0])
target = torch.tensor([1.0, 2.0, 3.0, 0.0])
huber = torch.nn.HuberLoss(delta=1.0)
mse = torch.nn.MSELoss()
l1 = torch.nn.L1Loss()
print("Huber:", huber(pred, target).item())
print("MSE:", mse(pred, target).item())
print("L1:", l1(pred, target).item())
Результат выполнения кода:
Huber: 7.9375
MSE: 2500.0
L1: 49.5
Пример
Используем HuberLoss в процессе обучения модели
с партией данных:
import torch
torch.manual_seed(0)
model = torch.nn.Linear(5, 1)
loss_fn = torch.nn.HuberLoss(delta=0.5)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
x = torch.randn(10, 5)
y = torch.randn(10, 1)
for epoch in range(3):
pred = model(x)
loss = loss_fn(pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"Epoch {epoch + 1}: {loss.item():.4f}")
Результат выполнения кода:
Epoch 1: 0.5843
Epoch 2: 0.5706
Epoch 3: 0.5607
Пример
Используем режим reduction='none' для получения
индивидуальных значений потерь:
import torch
loss_fn = torch.nn.HuberLoss(delta=0.5, reduction='none')
pred = torch.tensor([0.0, 1.0, 2.0])
target = torch.tensor([1.0, 1.0, 1.0])
loss = loss_fn(pred, target)
print(loss)
Результат выполнения кода:
tensor([0.1250, 0.0000, 0.3750])
Смотрите также
-
класс
L1Loss,
который вычисляет среднюю абсолютную ошибку -
класс
MSELoss,
который вычисляет среднеквадратичную ошибку -
класс
SmoothL1Loss,
который является сглаженной версией L1-потери -
класс
CrossEntropyLoss,
который вычисляет перекрёстную энтропию между классами