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

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