Как указано в документации CosineEmbeddingLoss :
Создает критерий, который измеряет потери с учетом двух входных тензоров и метки Tensor со значениями 1 или -1.
В вашем сценарии вы всегда должны указывать 1 в качестве метки Tensor.
batch_size, seq_len, w2v_dim = 32, 100, 200
x1 = torch.randn(batch_size, seq_len, w2v_dim)
x2 = torch.randn(batch_size, seq_len, w2v_dim)
y = torch.ones(batch_size, seq_len)
loss_fn = torch.nn.CosineEmbeddingLoss(reduction='none')
loss = loss_fn(x1.view(-1, w2v_dim),
x2.view(-1, w2v_dim),
y.view(-1))
loss = loss.view(batch_size, seq_len)
Здесь я предполагаю, что x1
- это вложение слова, x2
- это выход LSTM.с последующим некоторым преобразованием.
Почему я всегда должен указывать 1 в качестве метки Tensor?
Сначала вы должны увидеть функцию потерь.
В вашем сценарии, чем выше сходство косинусов, тем меньше должны быть потери.Другими словами, вы хотите максимизировать косинусное сходство.Таким образом, вам нужно указать 1 в качестве метки.
С другой стороны, если вы хотите минимизировать косинусное сходство, вам нужно указать -1 в качестве метки.