互信息及DIM

博客提供了一篇参考链接https://zhuanlan.zhihu.com/p/343772864 ,可能与互信息和DIM相关知识有关。
  • 参考
    https://zhuanlan.zhihu.com/p/343772864
### MINE (Mutual Information Neural Estimation) 的核心概念 MINE 是一种基于神经网络的方法,用于估算两个高维连续随机变量之间的互信息(Mutual Information, MI)。这种方法的核心在于通过优化目标函数来逼近真实的互信息值。具体来说,MINE 使用了一个参数化的神经网络模型 \( T_\theta \),并通过最大化下界来估计互信息。 #### 数学基础 设 \( X \) 和 \( Y \) 为两个随机变量,则它们的互信息定义如下: \[ I(X;Y) = \int p(x,y) \log{\frac{p(x,y)}{p(x)p(y)}} dx dy \] 然而,在实际应用中直接计算这一积分通常是不可行的,尤其是当数据分布复杂或者维度较高时。因此,MINE 提出了一个变分形式的目标函数作为互信息的一个下界[^1]: \[ D_{KL}(P_{XY} || P_X P_Y) = I(X;Y) = \sup_T E_{X,Y}[T(X,Y)] - \log(E_X[E_Y[e^{T(X',Y')}]]) \] 其中 \( T \) 表示由神经网络学习得到的评分函数,\( X' \) 和 \( Y' \) 分别是从边缘分布采样的独立样本。 --- ### Python 实现 MINE 以下是使用 PyTorch 编写的简单版本 MINE 算法实现代码: ```python import torch import torch.nn as nn import torch.optim as optim class MineModel(nn.Module): def __init__(self, input_size=2, hidden_size=100): super(MineModel, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.fc2 = nn.Linear(hidden_size, hidden_size) self.fc3 = nn.Linear(hidden_size, 1) def forward(self, inputs): output = torch.relu(self.fc1(inputs)) output = torch.relu(self.fc2(output)) return self.fc3(output) def mine_loss(model, joint_samples, marginal_samples): t_joint = model(joint_samples) t_marginal = model(marginal_samples) # Compute the loss based on the variational form of mutual information. mi_lower_bound = torch.mean(t_joint) - torch.log(torch.mean(torch.exp(t_marginal))) return -mi_lower_bound # We minimize the negative lower bound. # Example usage with synthetic data generation if __name__ == "__main__": batch_size = 512 dim_x = 10 dim_y = 10 # Generate some random samples from a multivariate Gaussian distribution mu = torch.zeros(dim_x + dim_y) cov = torch.eye(dim_x + dim_y) dist = torch.distributions.MultivariateNormal(mu, cov) # Joint and Marginal Samples Generation joint_samples = dist.sample((batch_size,)) marginal_samples = torch.cat([joint_samples[:, :dim_x], dist.sample((batch_size,))[:, dim_x:]], dim=1) # Initialize Model & Optimizer model = MineModel(input_size=dim_x + dim_y) optimizer = optim.Adam(model.parameters(), lr=1e-3) # Training Loop num_epochs = 1000 for epoch in range(num_epochs): optimizer.zero_grad() loss = mine_loss(model, joint_samples, marginal_samples) loss.backward() optimizer.step() if epoch % 100 == 0: print(f"Epoch {epoch}, Loss {-loss.item()}") ``` 此代码实现了基本的 MINE 模型结构以及损失函数的设计,并展示了如何通过梯度下降方法训练该模型以估计互信息。 --- ### 关键点解析 1. **联合分布与边际分布** 联合分布表示的是 \( X \) 和 \( Y \) 同时发生的概率密度;而边际分布则是分别考虑 \( X \) 或者 \( Y \) 单独的概率密度。为了构建合适的输入数据集,通常会从真实的数据集中抽取联合样本和边际样本。 2. **神经网络架构设计** 上述代码中的 `MineModel` 定义了一种简单的多层感知机(MLP),它接受联合样本或边际样本作为输入并输出一个标量值。这个标量值代表了当前样本对于互信息贡献程度的一种评估。 3. **损失函数构造** 基于理论推导得出的公式,我们希望最小化负数形式下的互信息下限,从而间接达到最大似然的目的。 4. **训练过程** 在每次迭代过程中更新权重使得最终能够更精确地反映原始数据间的依赖关系。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值