Класс SoftMarginLoss
Класс SoftMarginLoss предназначен для бинарной классификации.
Он вычисляет потери, применяя сигмоидное преобразование к входным данным
и затем вычисляя логистическую функцию потерь между полученными вероятностями
и целевыми метками. Данный класс полезен в задачах, где необходимо
получить вероятности принадлежности к классам, не прибегая к явному
применению функции sigmoid.
Основное преимущество SoftMarginLoss заключается в том, что он
объединяет сигмоидное преобразование и вычисление потерь в одном шаге,
что делает процесс обучения более стабильным и численно устойчивым.
Входные данные могут быть любыми вещественными числами, а целевые метки
должны быть представлены в виде чисел -1 и 1.
Синтаксис
torch.nn.SoftMarginLoss(size_average=None, reduce=None, reduction='mean')
Класс принимает следующие параметры:
-
reduction- определяет способ агрегации потерь. Возможные значения:'none'- потери возвращаются поэлементно,'mean'- вычисляется среднее значение,'sum'- вычисляется сумма. По умолчанию'mean'.
Пример
Давайте создадим экземпляр класса и применим его к простым данным:
import torch
# Создаём функцию потерь
loss_fn = torch.nn.SoftMarginLoss()
# Входные данные
pred = torch.tensor([0.5, -1.2, 2.0, -0.8])
target = torch.tensor([1.0, -1.0, 1.0, -1.0])
# Вычисляем потери
loss = loss_fn(pred, target)
print(loss)
Результат выполнения кода:
tensor(0.5838)
Как видно из примера, функция потерь возвращает скалярное значение при стандартных настройках.
Пример
Рассмотрим пример с параметром reduction='none', который
возвращает поэлементные потери:
import torch
# Создаём функцию потерь без агрегации
loss_fn = torch.nn.SoftMarginLoss(reduction='none')
# Входные данные
pred = torch.tensor([0.5, -1.2, 2.0, -0.8])
target = torch.tensor([1.0, -1.0, 1.0, -1.0])
# Вычисляем потери
loss = loss_fn(pred, target)
print(loss)
Результат выполнения кода:
tensor([0.4741, 0.4375, 0.1269, 1.2966])
В данном случае мы получаем тензор той же размерности, что и входные данные, где каждый элемент представляет собой потерю для соответствующей пары предсказание-цель.
Пример
Давайте рассмотрим использование SoftMarginLoss в процессе
обучения простой нейронной сети:
import torch
# Фиксируем случайное зерно для воспроизводимости
torch.manual_seed(0)
# Создаём простую модель
model = torch.nn.Linear(5, 1)
loss_fn = torch.nn.SoftMarginLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# Создаём случайные данные
x = torch.randn(10, 5)
y = torch.tensor([1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0])
# Один шаг обучения
optimizer.zero_grad()
pred = model(x).squeeze()
loss = loss_fn(pred, y)
loss.backward()
optimizer.step()
print(f"Loss: {loss.item():.4f}")
Результат выполнения кода:
Loss: 0.7001
В этом примере мы создали простой линейный слой, который принимает
5-мерные входные данные и выдаёт скалярное предсказание. Затем мы
используем SoftMarginLoss для вычисления потерь и выполняем
один шаг оптимизации.
Смотрите также
-
функцию потерь
BCEWithLogitsLoss,
которая объединяет сигмоидное преобразование с бинарной кросс-энтропией -
функцию потерь
MultiLabelSoftMarginLoss,
которая является многоклассовым аналогом SoftMarginLoss -
функцию потерь
HingeEmbeddingLoss,
которая используется для задач обучения метрик -
функцию потерь
MarginRankingLoss,
которая вычисляет потери для ранжирования