Класс CosineEmbeddingLoss
Класс CosineEmbeddingLoss реализует функцию потерь,
основанную на косинусном сходстве между парами векторов.
Он полезен в задачах обучения эмбеддингов, где нужно
сближать похожие объекты и разносить разные.
В качестве первого параметра передаются входные данные
в виде тензора x1, вторым - тензор x2,
третьим - тензор целевых значений y,
который содержит метки сходства (1 для похожих, -1 для разных).
Четвертым необязательным параметром можно задать
значение margin, которое определяет порог
для потери у разных пар.
Синтаксис
torch.nn.CosineEmbeddingLoss(margin=0.0, size_average=None, reduce=None, reduction='mean')
Параметры класса:
-
margin- пороговое значение для косинусного расстояния у отрицательных пар (по умолчанию 0.0) -
reduction- способ агрегации потерь: 'none', 'mean' или 'sum' (по умолчанию 'mean')
Пример базового использования
Создадим функцию потерь и вычислим её для двух похожих векторов:
import torch
criterion = torch.nn.CosineEmbeddingLoss()
x1 = torch.tensor([1.0, 0.0])
x2 = torch.tensor([0.8, 0.6])
y = torch.tensor([1]) # 1 - похожие
loss = criterion(x1, x2, y)
print(loss)
Результат выполнения кода:
tensor(0.0400)
Теперь рассмотрим случай с разными векторами:
import torch
criterion = torch.nn.CosineEmbeddingLoss()
x1 = torch.tensor([1.0, 0.0])
x2 = torch.tensor([-1.0, 0.0])
y = torch.tensor([-1]) # -1 - разные
loss = criterion(x1, x2, y)
print(loss)
Результат выполнения кода:
tensor(0.)
Пример с параметром margin
Изменим значение маржины для отрицательных пар:
import torch
criterion = torch.nn.CosineEmbeddingLoss(margin=0.5)
x1 = torch.tensor([1.0, 0.0])
x2 = torch.tensor([0.5, 0.866])
y = torch.tensor([-1])
loss = criterion(x1, x2, y)
print(loss)
Результат выполнения кода:
tensor(0.1340)
Пример использования в обучении
Применим функцию потерь в простом цикле обучения:
import torch
torch.manual_seed(0)
criterion = torch.nn.CosineEmbeddingLoss(margin=0.5)
x1 = torch.randn(2, 4)
x2 = torch.randn(2, 4)
y = torch.tensor([1, -1])
loss = criterion(x1, x2, y)
print(loss)
Результат выполнения кода:
tensor(0.2109)
Пример с разными режимами reduction
Используем режим 'none' для получения потерь по каждому элементу:
import torch
criterion = torch.nn.CosineEmbeddingLoss(reduction='none')
x1 = torch.tensor([[1.0, 0.0], [0.0, 1.0]])
x2 = torch.tensor([[0.8, 0.6], [0.0, -1.0]])
y = torch.tensor([1, -1])
loss = criterion(x1, x2, y)
print(loss)
Результат выполнения кода:
tensor([0.0400, 0.0000])
Режим 'sum' суммирует все потери:
import torch
criterion = torch.nn.CosineEmbeddingLoss(reduction='sum')
x1 = torch.tensor([[1.0, 0.0], [0.0, 1.0]])
x2 = torch.tensor([[0.8, 0.6], [0.0, -1.0]])
y = torch.tensor([1, -1])
loss = criterion(x1, x2, y)
print(loss)
Результат выполнения кода:
tensor(0.0400)
Смотрите также
-
класс
TripletMarginLoss,
который вычисляет потерю для троек векторов -
класс
MarginRankingLoss,
который вычисляет потерю для ранжирования пар -
класс
HingeEmbeddingLoss,
который вычисляет потерю для эмбеддингов с шарнирной функцией -
класс
MSELoss,
который вычисляет среднеквадратичную ошибку