Класс HingeEmbeddingLoss
Класс HingeEmbeddingLoss реализует функцию потерь,
предназначенную для обучения эмбеддингов, где цель -
обеспечить малые расстояния между похожими объектами
и большие расстояния между различными. Первым параметром
конструктор принимает margin - границу, определяющую
минимальное расстояние для различных пар. Вторым параметром
можно передать reduction, который указывает способ
редукции выходного значения (суммирование, среднее или
отсутствие редукции).
Синтаксис
torch.nn.HingeEmbeddingLoss(margin=1.0, reduction='mean')
Параметры
Основные параметры класса:
-
margin(float) - граница, определяющая максимальное расстояние между различными парами, по умолчанию1.0. -
reduction(str) - способ редукции:'none','mean'или'sum'. По умолчанию'mean'.
Пример 1
Создадим экземпляр функции потерь с границей 1.5
и применим его к двум парам векторов:
import torch
# Создаем функцию потерь
loss_fn = torch.nn.HingeEmbeddingLoss(margin=1.5)
# Входные данные (два эмбеддинга)
x = torch.tensor([2.0, 3.0, 1.0])
y = torch.tensor([1.0, 2.0, 3.0])
# Метки: 1 - похожие, -1 - различные
target = torch.tensor([1.0, -1.0])
# Вычисляем потерю
loss = loss_fn(x, y)
print(loss)
Результат выполнения кода:
tensor(2.3333)
Пример 2
Рассмотрим случай, когда все пары являются похожими
(метки равны 1). В этом случае потеря равна
среднему квадрату расстояния:
import torch
loss_fn = torch.nn.HingeEmbeddingLoss(margin=1.0)
x = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
y = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
target = torch.tensor([1.0, 1.0])
loss = loss_fn(x, y)
print(loss)
Результат выполнения кода:
tensor(0.)
Пример 3
Используем функцию потерь с редукцией 'sum'
для получения суммы потерь по всем элементам батча:
import torch
loss_fn = torch.nn.HingeEmbeddingLoss(
margin=0.5,
reduction='sum'
)
x = torch.tensor([0.2, 0.8, 0.5])
y = torch.tensor([0.1, 0.9, 0.6])
target = torch.tensor([1.0, -1.0, 1.0])
loss = loss_fn(x, y)
print(loss)
Результат выполнения кода:
tensor(0.6900)
Пример 4
При использовании редукции 'none' функция возвращает
покомпонентные значения потерь без агрегации:
import torch
loss_fn = torch.nn.HingeEmbeddingLoss(
margin=0.5,
reduction='none'
)
x = torch.tensor([0.2, 0.8, 0.5])
y = torch.tensor([0.1, 0.9, 0.6])
target = torch.tensor([1.0, -1.0, 1.0])
loss = loss_fn(x, y)
print(loss)
Результат выполнения кода:
tensor([0.0100, 0.6800, 0.0100])
Смотрите также
-
класс
CosineEmbeddingLoss,
который использует косинусное расстояние для эмбеддингов -
класс
TripletMarginLoss,
который вычисляет потерю для троек примеров -
класс
MarginRankingLoss,
который сравнивает расстояния между парами -
класс
MSELoss,
который вычисляет среднеквадратичную ошибку