РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
541 of 769 menu

Класс 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,
    который вычисляет перекрёстную энтропию между классами
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить