pytorch 代码中的 KL 散度与公式有何关系?
How is KL-divergence in pytorch code related to the formula?
在 VAE 教程中,两个正态分布的 kl 散度定义为:
并且在很多代码中,比如here, hereand here,代码实现为:
KL_loss = -0.5 * torch.sum(1 + logv - mean.pow(2) - logv.exp())
或
def latent_loss(z_mean, z_stddev):
mean_sq = z_mean * z_mean
stddev_sq = z_stddev * z_stddev
return 0.5 * torch.mean(mean_sq + stddev_sq - torch.log(stddev_sq) - 1)
它们有什么关系?为什么代码中没有 "tr" 或“.transpose()”?
您发布的代码中的表达式假定 X 是一个不相关 多变量高斯随机变量。这在协方差矩阵的行列式中缺少交叉项是显而易见的。因此,均值向量和协方差矩阵的形式为
使用它我们可以快速推导出以下原始表达式组件的等价表示
将这些代回原始表达式得到
在 VAE 教程中,两个正态分布的 kl 散度定义为:
并且在很多代码中,比如here, hereand here,代码实现为:
KL_loss = -0.5 * torch.sum(1 + logv - mean.pow(2) - logv.exp())
或
def latent_loss(z_mean, z_stddev):
mean_sq = z_mean * z_mean
stddev_sq = z_stddev * z_stddev
return 0.5 * torch.mean(mean_sq + stddev_sq - torch.log(stddev_sq) - 1)
它们有什么关系?为什么代码中没有 "tr" 或“.transpose()”?
您发布的代码中的表达式假定 X 是一个不相关 多变量高斯随机变量。这在协方差矩阵的行列式中缺少交叉项是显而易见的。因此,均值向量和协方差矩阵的形式为
使用它我们可以快速推导出以下原始表达式组件的等价表示
将这些代回原始表达式得到