我使用Pytorch
余弦相似度函数如下。我有两个特征向量,我的目标是让它们彼此不同。所以,我想我可以最小化它们的余弦相似度。我对我的编码方式有些怀疑。感谢您对以下问题的建议。
我不知道为什么这里有一些负值val1
?
我已经完成了三个步骤来转换val1
为标量。我是否以正确的方式做这件事?有没有其他办法?
为了最小化相似性,我使用了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
不要将您的损失函数转换为列表。这会破坏 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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句