MINE(mutual) information neural estimaiton)

论文:https://arxiv.org/pdf/1801.04062.pdf

摘要:

论文指出,可以使用神经网络梯度下降算法对高维度连续随机变量间的互信息进行估计,MINE 算法在维度上和样本大小上是线性可测量的,可使用反向传播算法训练。MINE算法可以最大或者最小化互信息,提升生成模型的对抗训练,突破监督学习分类任务的瓶颈。

介绍:

互信息的定义如下公式所示:是一个联合概率分布,是边缘概率分布,互信息用于捕捉变量之间的统计独立性。

由于电脑计算只能计算离散变量或者在限定场景条件,一般的方法是无参数的(比如基于向量的似然估计,核密度估计等),或者依赖于高斯分布进行近似,但是上述方法都在度量采样样本大小和维度上表现不够好,也就不能被成为通用目的问题解决方案。论文提出了使用变量之间的KL散度来度量互信息,该KL散度方法也用于对抗网络,对对抗网络是GAN的基础(GAN训练一个生成模型而不需要明显的数据分布的假设)。论文主要贡献有以下几点:① 论文引入了MINE算法,MINE算法可度量,灵活,可使用反向传播算法训练并提供理论分析依据。② 论文使用互信息估计,并进行最大和最小化 ③ 论文提升了对抗生成网络的重建和推断能力 ④ 论文使用的Information Bottleneck 方法优异与 variational bottleneck方法。

背景:

互信息用来描述随机变量之间的信息相关度,互信息越大,变量之间的相关度越强,公式可以转化如下:

其中H是熵,熵可以理解为惊喜度,若越是惊喜度越高,熵越大,事情发生的概率越低。互信息的公式还可以写成如下形式:散度表示两个分布之间的距离,距离越远,散度越大。

定义如下:

散度的两种表示:

MINE算法一个关键技巧就是使用了两种散度表示方式,如下公式所示:

互信息神经网络估计:

论文提出使用神经网络进行估计,公式如下:

是一个神经网络互信息,定义如下:公式(10)使用联合分布与边缘分布可以通过梯度下降求进行最大化处理,神经网络保证了该公式可以以任意精度近似逼近互信息公式。

MINE的定义:此公式也可以通过定义。但是相对于有更低的下届,会导致估计更加宽松不准确,SGD(Stochastic Gradient Decent)应用与MINE算法是偏置的。(后续论证)

论文算法如下:

初始化神经网络参数

从联合分布中采样:

从边缘分布中采样:

通过估计下届:

评估偏置,对梯度进行更正:

更新梯度:

直到收敛

在上述算法中,对梯度进行更正的公式如下:

使用moving average 可以减少上述公式第二项的偏置,对梯度的偏置进行更正可以很大程度上提高MINE的表现.

理论依据:一致性和采样复杂性的论证是为了使得MINE算法进行神经网络估计更有理论依据。

consistency(一致性):

sample complexity(采样复杂性):

思考:

MINE算法应该是和其他的生成模型算法结合使用,就想HER算法和DDPG联合使用一样?

### 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. **训练过程** 在每次迭代过程中更新权重使得最终能够更精确地反映原始数据间的依赖关系。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值