【问题标题】:How to calculate mutual information in PyTorch (differentiable estimator)如何在 PyTorch 中计算互信息(可微分估计器)
【发布时间】:2022-11-09 09:56:50
【问题描述】:

我正在用pytorch训练一个模型,我需要计算两个张量之间的依赖程度(假设它们是两个张量,每个张量都包含非常接近零或一的值,例如v1 = [0.999, 0.998, 0.001, 0.98]和 v2 = [0.97, 0.01, 0.997, 0.999]) 作为我的损失函数的一部分。我正在尝试计算mutual information,但我在 PyTorch 中找不到任何互信息估计实现。有没有地方提供过这样的东西?

【问题讨论】:

    标签: pytorch entropy mutual-information


    【解决方案1】:

    互信息是为分布而不是单个点定义的。因此,我将假设 v1 和 v2 是来自分布 p 的样本来编写下一部分。我也会认为你有来自 p 的 n 个样本,n>1。

    您需要一种从样本中估计互信息的方法。有很多方法可以做到这一点。最简单的方法之一是使用像 NPEET (https://github.com/gregversteeg/NPEET) 这样的非参数估计器。它适用于 numpy(您可以为此从 torch 转换为 numpy)。还有更多涉及的参数模型,您可以在 pytorch 中找到它们的实现(参见https://arxiv.org/abs/1905.06922)。

    如果您只有两个向量并且想要计算相似度度量,则点积相似度将比互信息更合适,因为没有分布。

    【讨论】:

    • 是的,我的意思是从两个概率分布中采样的两个向量。由于我使用的是 pytorch 并且需要区分,所以我不能使用 NPEET(使用 sklearn 函数)。
    • 在这种情况下,您应该看到引用的论文。它有不同的下限/上限估计器,具体取决于您的优化问题---最大化/最小化,您可以选择一个。
    【解决方案2】:

    官方 Pytorch 代码中没有提供它,但我有一个 pytorch 实现 here,它使用 kernel density estimation 进行直方图近似。请注意,此方法是完全可微的。

    或者,如果您出于任何原因想要更多控制权,也可以使用Kornia 中的可微直方图函数自己计算 MI 指标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多