最小化两个张量的余弦相似度并输出一个标量。火炬

Jac*_*cob 0 cosine-similarity pytorch

我使用Pytorch余弦相似度函数如下。我有两个特征向量,我的目标是使它们彼此不同。所以,我想我可以最小化它们的余弦相似度。我对我的编码方式有一些疑问。感谢您对以下问题的建议。

  1. 我不知道为什么这里有一些负值val1

  2. 我已经完成了三个步骤来转换val1为标量。我的做法正确吗?还有其他办法吗?

  3. 为了最小化相似性,我使用了1/var1. 这是执行此操作的标准方法吗?如果我使用它正确吗1-var1

    def loss_func(feat1, feat2):
         cosine_loss = torch.nn.CosineSimilarity(dim=1, eps=1e-6)
         val1 = cosine_loss(feat1, feat2).tolist()
         # 1. calculate the absolute values of each element,
         # 2. sum all values together,
         # 3. divide it by the number of values
         val1 = 1/(sum(list(map(abs, val1)))/int(len(val1)))
         val1 = torch.tensor(val1, device='cuda', requires_grad=True)
         return val1 
    
    Run Code Online (Sandbox Code Playgroud)

jod*_*dag 7

不要将损失函数转换为列表。这会破坏 autograd,因此您将无法使用 pytorch 优化模型参数。

损失函数已经是需要最小化的东西了。如果您想最小化相似度,那么您可能只想返回平均余弦相似度。相反,如果您希望最小化相似度的大小(即鼓励特征正交),那么您可以返回余弦相似度的平均绝对值。

看来您所实现的将尝试最大化相似性。但这似乎与你所说的不符。此外,要将最小化问题转化为等效的最大化问题,您通常只需否定该度量即可。负损失值并没有什么问题。取严格正度量的倒数确实会将其从最小化问题转换为最大化问题,但也会改变度量的行为,并且可能不是您想要的。

根据您的实际需求,其中之一可能会满足您的需求

import torch.nn.functional as F

def loss_func(feat1, feat2):
    # minimize average magnitude of cosine similarity
    return F.cosine_similarity(feat1, feat2).abs().mean()

def loss_func(feat1, feat2):
    # minimize average cosine similarity
    return F.cosine_similarity(feat1, feat2).mean()

def loss_func(feat1, feat2):
    # maximize average magnitude of cosine similarity
    return -F.cosine_similarity(feat1, feat2).abs().mean()

def loss_func(feat1, feat2):
    # maximize average cosine similarity
    return -F.cosine_similarity(feat1, feat2).mean()
Run Code Online (Sandbox Code Playgroud)