【问题标题】:Computing Cosine Distance with Differently shaped tensors用不同形状的张量计算余弦距离
【发布时间】:2021-10-16 00:29:25
【问题描述】:

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

A = (2, 500)

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

我也有以下张量

B = (10, 500)

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

C = (2, 10, 1)

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

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

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

【问题讨论】:

  • 您输入的内容中有轻微的拼写错误/行话:它是torch.nn.functional.cosine_similarity

标签: pytorch cosine-similarity


【解决方案1】:

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

import torch.nn.functional as F

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

这是sentence-transformers中的实现

【讨论】:

    【解决方案2】:

    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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 2022-01-05
      • 2019-10-15
      • 1970-01-01
      • 2020-06-06
      • 2016-11-29
      • 2018-12-17
      相关资源
      最近更新 更多