用不同形状的张量计算余弦距离
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()
中的实现
我有以下代表词向量的张量
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()
中的实现