用不同形状的张量计算余弦距离

Computing Cosine Distance with Differently shaped tensors

我有以下代表词向量的张量

A = (2, 500)

其中第一个维度是 BATCH 维度(即 A 包含两个词向量,每个词向量具有 500 个元素)

我还有如下张量

B = (10, 500)

我想计算 A 和 B 之间的余弦距离,这样我得到

C = (2, 10, 1)

即对于 A 中的每一行计算与 B 中每一行的余弦距离

我查看了使用 torch.nn.functional.F.cosine_similarity 但这不起作用,因为尺寸必须相同。

在 pytorch 中实现此目的的最有效方法是什么?

broadcasting技术与unsqueeze

结合使用
import torch.nn.functional as F

C = F.cosine_similarity(A.unsqueeze(1), B, dim=-1)

print(C.shape)
# torch.size([2,10])

接受的解决方案似乎效率低下——它在我的机器上花了很长时间,最后由于内存不足而破坏了内核——而这个解决方案花了几毫秒:

import torch.nn.functional as F

# cosine similarity = normalize the vectors & multiply
C = F.normalize(A) @ F.normalize(B).t()

这是sentence-transformers

中的实现