在pytorch中,假设我有两个矩阵,我如何计算每个矩阵中所有行与另一个矩阵中所有行的余弦相似度。
例如
给定输入=
matrix_1 = [a b]
[c d]
matrix_2 = [e f]
[g h]
我希望输出为
输出=
[cosine_sim([a b] [e f]) cosine_sim([a b] [g h])]
[cosine_sim([c d] [e f]) cosine_sim([c d] [g h])]
目前我使用torch.nn.functional.cosine_similarity(matrix_1,matrix_2),它返回该行的余弦值,而另一个矩阵中只有相应的行。
在我的例子中,我只有2行,但我希望有一个解决方案,工作的许多行。我甚至希望处理的情况下,行数在每个矩阵是不同的。
我意识到我可以使用扩展,但是我想在不使用如此大的内存占用的情况下进行扩展。
5条答案
按热度按时间ffx8fchx1#
通过手动计算相似度并使用矩阵乘法+转置:
mpbci0fu2#
根据benjaminplanche的答案,增加
eps
以获得数值稳定性:azpvetkf3#
与Zhang Yu的答案相同,但使用clamp而不是max,并且没有创建新的Tensor。我用timeit做了一个小测试,表明clamp更快,尽管我不精通使用该工具。
vof42yt14#
在计算矩阵的行向量和列向量的相似度时,不需要使用循环。下面是一个例子。
gudnpqoy5#
您可以展开2个输入批次,执行成对余弦相似性运算,然后转置它:
使用
torch.repeat_interleave
和torch.repeat
的非克隆等同物。