如何引入损失以使两个矩阵相似
How to introduce a loss to get two matrices similar
我正在训练一个神经网络,我希望两个矩阵相似(协方差矩阵)。我天真的方法是使用基于差异的损失,例如 L1 损失。但这也迫使矩阵变小,这不是我想要的。
这里有人有想法吗?
非常感谢!
您可以使用许多指标(欧几里得距离、余弦相似度、非负特征的 Bhattacharyya 相似度、Jensen-Shannon 散度)。
余弦相似度似乎是一个不错的起点。您可以通过在 n*m
维 space 中考虑两个 n x m
矩阵来实现此目的。并且,将这两个向量与余弦相似度进行比较。
实际上,这可以使用 torch.flatten
and torch.nn.functionnal.cosine_similarity
. Or equivalently with a nn.Flatten
layer and nn.CosineSimilarity
来完成。
这里我走的是功能路线:
>>> x = torch.rand(1, 10, 10)
>>> y = torch.rand(1, 10, 10)
>>> F.cosine_similarity(torch.flatten(x, 1), torch.flatten(y, 1))
tensor([0.6220])
请注意,您将需要一个额外的批次维度:axis=0
。
编辑 - 如果您不使用批处理,您可以简单地将两个张量广播到一维张量:
>>> F.cosine_similarity(x.reshape(1, -1), y.reshape(1, -1))
我正在训练一个神经网络,我希望两个矩阵相似(协方差矩阵)。我天真的方法是使用基于差异的损失,例如 L1 损失。但这也迫使矩阵变小,这不是我想要的。
这里有人有想法吗?
非常感谢!
您可以使用许多指标(欧几里得距离、余弦相似度、非负特征的 Bhattacharyya 相似度、Jensen-Shannon 散度)。
余弦相似度似乎是一个不错的起点。您可以通过在 n*m
维 space 中考虑两个 n x m
矩阵来实现此目的。并且,将这两个向量与余弦相似度进行比较。
实际上,这可以使用 torch.flatten
and torch.nn.functionnal.cosine_similarity
. Or equivalently with a nn.Flatten
layer and nn.CosineSimilarity
来完成。
这里我走的是功能路线:
>>> x = torch.rand(1, 10, 10)
>>> y = torch.rand(1, 10, 10)
>>> F.cosine_similarity(torch.flatten(x, 1), torch.flatten(y, 1))
tensor([0.6220])
请注意,您将需要一个额外的批次维度:axis=0
。
编辑 - 如果您不使用批处理,您可以简单地将两个张量广播到一维张量:
>>> F.cosine_similarity(x.reshape(1, -1), y.reshape(1, -1))