VAE——变分自编码器的数学推导

这篇博客探讨了生成模型的构建,其中隐变量z先从单位高斯分布采样,再通过解码器神经网络生成图像x。由于p(z|x)的计算困难,采用了变分推断作为解决方案,通过最小化KL散度来逼近真实的后验分布p(z|x)。文章提到了近似推断的两种方法——MCMC和VI,重点阐述了VAE如何利用VI来转换推断问题为优化问题,并假设后验近似为高斯分布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

考虑一个生成模型(Generative model),可以从一个隐变量(latent variable, z)映射到一张图片(x),用有向无环图模型(directed acyclic graphical model / Bayesian network)表示为
在这里插入图片描述
上图表示,x的分布可以通过首先从p(z)采样得到z后再从p(x|z)采样建模。

  • p(z)先验概率,意味着只需要选择一个合适的分布就可以了,一般采用单位高斯分布(unit Gaussian distribution),因为高斯分布的熵最大。(Paper: Let the prior over the latent variables be the centered isotropic multivariate Gaussian p ( z ) = N ( z ; 0 ; I ) p(z) = N (z; 0; I) p(z)=N(z;0;I))
  • p(x|z) 用神经网络进行表示 p ( x ∣ z ; θ ) = d e c o d e r ( z ; θ ) p(x|z; \theta) = decoder(z; \theta) p(xz;θ)=decoder(z;θ)

此时已经对生成模型建模完毕,接下来为了进行求解,也就是要学习到参数 θ \theta θ。目前,唯一确定的是数据集样本x,当可以得到 z → x ^ z \rightarrow \hat x zx^后,还需要确定 x , x ^ , z x, \hat{x}, z x,x^,z三者之间的对应关系,如下图
在这里插入图片描述
为题转换为:已知一个数据集中的样本x,如何确定对应的隐变量z,也就是求解p(z|x)

因为 p ( x ) = ∫ p ( x ∣ z ) p ( z ) d z p(x) = \int p(x|z)p(z) dz p(x)=p(xz)p(z)dz不可通过数值计算获得结果,且
p ( z ∣ x ) = p ( x ∣ z ) p ( z ) p ( x ) p(z|x) = \frac{p(x|z)p(z)}{p(x)} p(zx)=p(x)p(xz)p(z)
同样不可数值求解,因此使用近似推断的方法进行求解。近似推断有两大方法:MCMC(马尔可夫蒙特卡洛)和VI(变分推断)法,VAE正是使用了VI得名。

概念

泛函是将自变量函数映射到数值上的函数
变分法求解泛函极值的方法。
散度可以简单的理解为不需要对称性的距离,即不要求从P到Q的值等于从Q到P的值。
KL散度 K L ( P ( x ) ∣ Q ( x ) ) = E x ∼ P ( x ) [ log ⁡ P ( x ) − log ⁡ Q ( x ) ] KL(P(x)|Q(x)) = E_{x \sim P(x)}[\log P(x) - \log Q(x)] KL(P(x)Q(x))=ExP(x)[logP(x)logQ(x)]

VI

预设一个关于隐变量的密度函数的集合 Q \mathcal{Q} Q,从中找到一个函数 Q ( z ) Q(z) Q(z)使得和 p ( z ∣ x ) p(z|x) p(zx)的最接近,使用KL散度来衡量
Q ∗ ( z ) = arg ⁡ min ⁡ Q ( z ) ∈ Q K L ( Q ( z ) ∣ P ( z ∣ x ) ) Q^*(z) = \arg \min_{Q(z)\in \mathcal{Q}}KL(Q(z)|P(z|x)) Q(z)=argQ(z)QminKL(Q(z)P(zx))

由此,变分推断将一个推断问题转化为了优化问题

(Paper: While there is much freedom in the form q ( z ∣ x ) q(z|x) q(zx), we’ll assume the true (but intractable) posterior takes on a approximate Gaussian form with an approximately diagonal covariance)

MD, CSDN的公式编辑好垃圾…先不写了

### 自编码器的数学公式及其推导 #### 编码与解码过程中的映射关系 自编码器是一种无监督学习算法,旨在通过压缩输入数据到低维表示后再重建原始输入。设 \( \mathbf{x} \in \mathbb{R}^{d_x} \) 表示输入样本,则编码器将此输入转换成潜在变量 \( \mathbf{z}=f_{\theta_e}\left(\mathbf{x}\right)\),其中\( f_{\theta_e} \) 是由参数集 \( \theta_e \) 定义的一个非线性变换函数[^1]。 对于变分自编码器而言,由于直接求得精确的概率密度较为困难,所以采用近似的方法——即引入一个可微分的辅助分布 \( q_\phi (\mathbf{z}| \mathbf{x})\) 来逼近真实的后验概率 \( p_\theta (\mathbf{z}| \mathbf{x}) \)[^2]。具体来说,这个辅助分布在实践中通常被设定为正态分布的形式: \[q_\phi (\mathbf{z}| \mathbf{x})=\mathcal N (\mu, \sigma ^2 I)=\prod_i \frac {1}{\sqrt {2πσ_i^2}}e^{-\frac{(z-\mu)^2 }{2 σ _i^2 }}\] 这里 \( μ=f_μ(x;θ), σ =f_σ (x; θ)>0 \) 分别是由两个独立的神经网络预测出来的均值向量和标准差向量[^3]。 #### 重参数化技巧的应用 为了使上述过程中涉及的随机抽样操作可以参与到整个模型的学习当中,从而实现端到端训练的目的,研究者们提出了所谓的“重参数化技巧”。该技术允许我们把原本不可导的操作转化为连续形式下的运算,进而使得梯度能够顺利传递给前面各层。具体做法是在已知均值 \( μ \) 和方差 \( σ^2 \) 的情况下,利用如下表达式生成服从指定高斯分布的新样本: \[ \mathbf{z}=\boldsymbol{\mu}_{\phi}(x)+\epsilon \odot \log(1+\exp (\boldsymbol{\rho})) , \quad \text { where }\;\epsilon \sim \mathcal{N}(0, I)\] 此处使用的符号 “⊙” 表达的是逐元素乘法;而最后一项则采用了softplus激活函数来确保输出总是正值,以此代表对数尺度上的方差估计值。 #### 损失函数的设计原则 考虑到既要让重构的数据尽可能接近原图又要保持隐含表征具有良好的统计特性,最终构建的目标函数往往包含了两项主要成分:一是衡量两者之间差异程度的重构误差(reconstruction error),二是用来控制先验假设影响力度的KL散度(Kullback-Leibler divergence): \[L=-D_{K L}[p(X \| Z ; \Theta) \| P]+\beta D_{K L}[Q(Z | X ; \Phi) \| P]\] 这里的第一个部分反映了当给定某个特定观测序列X时所对应的条件分布P(X|Z;Θ)同真实情况之间的差距大小;第二个部分则是针对隐藏状态Z本身的边际分布Q(Z|X;Φ)相对于预定义好的简单先验P之间的偏离状况进行了量化评估[^2]。 ```python import torch.nn as nn class VAE(nn.Module): def __init__(self): super(VAE, self).__init__() # Define encoder and decoder architectures here... def encode(self, x): mu, log_var = ... # Compute mean and variance from input data using neural networks. return mu, log_var def reparameterize(self, mu, logvar): std = torch.exp(0.5*logvar) eps = torch.randn_like(std) return mu + eps*std def decode(self, z): recon_x = ... # Reconstruct the original inputs based on latent variables. return recon_x def forward(self, x): mu, logvar = self.encode(x.view(-1, 784)) z = self.reparameterize(mu, logvar) return self.decode(z), mu, logvar ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值