我正在用pytorch训练一个模型,我需要计算两个张量之间的依赖程度(假设它们是两个张量,每个张量都包含非常接近零或一的值,例如 v1 = [0.999, 0.998, 0.001, 0.98 ] 和 v2 = [0.97, 0.01, 0.997, 0.999]) 作为我的损失函数的一部分。我正在尝试计算互信息,但我在 PyTorch 中找不到任何互信息估计实现。哪里有提供这样的东西吗?
互信息是针对分布定义的,而不是针对单个点定义的。因此,我将假设 v1 和 v2 是来自分布 p 的样本来编写下一部分。我还认为你有来自 p 的 n 个样本,n>1。
您需要一种方法来估计样本中的互信息。有很多方法可以做到这一点。最简单的方法之一是使用非参数估计器,例如 NPEET (https://github.com/gregversteeg/NPEET)。它与 numpy 一起使用(您可以为此从 torch 转换为 numpy)。还有更多涉及的参数模型,您可以在 pytorch 中找到实现(请参阅https://arxiv.org/abs/1905.06922)。
如果您只有两个向量并想要计算相似性度量,则点积相似性比互信息更合适,因为没有分布。
Torchmetrics 有 MutualInfoScore。
他们文档中的示例:
>>> import torch
>>> from torchmetrics.clustering import MutualInfoScore
>>> preds = torch.tensor([2, 1, 0, 1, 0])
>>> target = torch.tensor([0, 2, 1, 1, 0])
>>> mi_score = MutualInfoScore()
>>> mi_score(preds, target)
tensor(0.5004)
功能性:
>>> from torchmetrics.functional.clustering import mutual_info_score
>>> target = torch.tensor([0, 3, 2, 2, 1])
>>> preds = torch.tensor([1, 3, 2, 0, 1])
>>> mutual_info_score(preds, target)
tensor(1.0549)