VAE背后的哲学思想及数学原理

本文深入浅出地介绍了变分自编码器(VAE)的工作原理及其背后的数学逻辑,包括其如何利用可测函数进行编码解码,以及如何通过最大化对数似然的下界来进行模型训练。

作者:李乐——优快云 AI专栏作家

引言

短短三年时间,变分编码器VAE(Variational Auto-encoder)同GAN一样,成为无监督复杂概率分布学习的最流行的方法。VAE之所以流行,是因为它建立在标准函数逼近单元,即神经网络,此外它可以利用随机梯度下降进行优化。本文将解释重点介绍VAE背后的哲学思想和直观认识及其数学原理。

VAE的最大特点是模仿自动编码机的学习预测机制,在可测函数之间进行编码、解码。同GAN类似,其最重要的idea是基于一个令人惊叹的数学事实:对于一个目标概率分布,给定任何一种概率分布,总存在一个可微的可测函数,将其映射到另一种概率分布,使得这种概率分布与目标的概率分布任意的接近。

看到这里读者可能会一头雾水。下面我们来一一阐明其中的含义。

可测函数之间的编解码?什么样的可测函数?可测函数是测度论中的概念,它是真实世界的随机事件到数学世界的随机事件的映射。当然,在形式化问题过程中我们需要对这里面的所有事件进行量化,于是我们自然地会将这个数学世界选取为欧式空间,相应的σ-代数也就是Borel σ-代数了。回到选取可测函数的问题。VAE的一个重要的哲学思想是,遵从图模型,我们希望生成的样本是由某些隐含变量所构造出来的。举个例子,比如我们想要生成0-9的手写体,影响生成这些数字的样式可能有很多因素,比如笔画粗细、笔尖的角度、写者的书写习惯、天气好坏(天气会影响写者的心情,进而影响书写方式。根据蝴蝶效应,初始条件的微小变化会影响最终的结果)。这些因素不胜枚举,一些看似不相关的因素,都有可能影响最终的结果。一个直接的方法是显示地构造出这些隐含因素的概率分布,但是这些因素实在是太多了,无穷多个,我们显然不能手工构造。VAE巧妙地避开了这个问题,利用一个联合高斯分布作为隐含可测函数的分布(这个隐含可测函数将上面所说的所有现实世界影响写字样式的隐含因素映射到欧式空间中去了),随即将问题转化为学习一个从隐含可测函数(隐含变量)到一个所希望生成样本的映射。后面我们会看到,这个过程就是解码过程。可以想象,这个映射会极为复杂。我们自然会想到利用深度学习强大的函数拟合能力来学习这个映射。

模型推导

因此,我们希望得到这样一个生成模型,如下图所示。

图片描述

其中z是隐含变量(隐含可测函数),将其输入到某种解码器,输出f(z),使得f(z)尽可能在保证样本多样性的同时与真实样本相似。

但是如何通过学习得到这样的解码器呢?

这就需要我们回归到目标函数中去考虑问题了。我们仅仅已知一些现成的样本S={x(i),i=1,...,m},比如,回到我们的例子,我们仅仅已知0-9这些手写体图片的样本,希望生成一些具有多样性类似的样本。那么自然会想到利用极大似然法来估计可学习的参数Θ,即 

Θ∗=argmaxL(x(1),...,x(m);Θ)=argmax∏ip(x(i);Θ)=argmax∑ilog(p(x(i);Θ))

 

不失一般性,我们下面只针对单样本x进行讨论(略去其指标和可学习参数)。上面的似然函数仅仅是关于x的函数,我们需要想办法凑出隐变量z来。 

logL=logp(x)=logp(x)⋅1=logp(x)∫zq(z|x)dz

 

其中q(z|x)是给定样本下z的某一个条件概率分布。

这一步变换值得深思,为什么选用一个条件概率分布呢,而不选用q(z)或者p(z|x)呢?

因为q(z)的选取范围太大,我们更感兴趣的是那些更有可能生成x的隐变量z;关于p(z|x),p(⋅)可以认为是真实的概率分布,我们很难得到,我们希望做的是通过q(⋅)去逼近p(⋅),因此前者可以理解为某一种近似的概率分布。

我们继续进行推导, 

logL=logp(x)∫zq(z|x)dz=∫zq(z|x)logp(x,z)p(z|x)dz=∫zq(z|x)[logp(x,z)q(z|x)−logp(z|x)q(z|x)]dz=∫zq(z|x)logp(x,z)q(z|x)dz+∫zq(z|x)logq(z|x)p(z|x)dz=∫zq(z|x)logp(x,z)q(z|x)dz+DKL(q(z|x)||p(z|x))

 

我们考查其中的第一项,利用贝叶斯公式 

∫zq(z|x)logp(x,z)q(z|x)dz=∫zq(z|x)logp(x|z)dz+∫zq(z|x)logp(x)q(z|x)dz=Ez∼q[logp(x|z)]−DKL(q(z|x)||p(z))

 

这样我们就推导出VAE的一个核心等式, 

logp(x)=Ez∼q[logp(x|z)]−DKL(q(z|x)||p(z))+DKL(q(z|x)||p(z|x))

 

下面可以开始建模了。由前面的讨论(利用一个联合高斯分布作为隐含可测函数的分布), 

p(z)=N(0,I)


同样,q(z|x)p(x|z)用联合高斯去建模, 

 

q(z|x)=N(μ(x),Σ(x))

 

p(x|z)=N(f(z),Λ(z))

 

自然地,问题就转化成了用神经网络学习四种映射关系。但是,即使做了这样的建模,对于DKL(q(z|x)||p(z|x)),我们仍然难以给出其闭式解(归一化因子是一个复杂的多重积分)。因此只能退而求其次,我们对其做缩放 

logp(x)=Ez∼q[logp(x|z)]−DKL(q(z|x)||p(z))+DKL(q(z|x)||p(z|x))≥Ez∼q[logp(x|z)]−DKL(q(z|x)||p(z))

 

对对数似然的下界进行最大化。

进一步推导,我们将前面建模的概率模型带入这个下界中去。注意到在实际实现过程中,为了简化起见,Λ(z)取与z无关的单位阵I,于是有 

Ez∼q[logp(x|z)]−DKL(q(z|x)||p(z))=Ez∼q[C−12∥X−f(z)∥2]−12(tr(Σ(x))+μ(x)Tμ(x)−k−logdet(Σ(x)))


最大化这个下界等价于最小化 

 

minΘ∥X−f(z)∥2+12(tr(Σ(x))+μ(x)Tμ(x)−k−logdet(Σ(x)))

 

其中Θ为四个待学习映射的可学习参数集合。

至此,整个的学习框架就清晰了,如下图所示。

图片描述

总结起来,整个训练框架就是在对样本x进行编解码。q是将样本x编码为隐变量z,而p又将隐含变量z解码成f(z),进而最小化重构误差。训练的目的是学习出编码器的映射函数和解码器的映射函数,所以训练过程实际上是在进行变分推断,即寻找出某一个函数来优化目标。因此取名为变分编码器VAE(Variational Auto-encoder).

关注具体实现的读者可能会发现在“解码器Decoder到μ(x)和Σ(x)”这个阶段从技术上没办法进行梯度反传。的确如此,上图只是作为帮助大家理解的示意图,而真正实现过程中,我们需要利用重参数化这个trick,如下图所示。

图片描述

重参数化这个名字听起来很神秘,其实就是基于下面的一个简单的数学事实: 
如果z∼N(μ,Σ),那么随机变量z可以写成 

z=μ+Σ12ϵ


其中ϵ∼N(0,I).

 

利用重参数化这个trick,我们成功地规避了这个问题。

讨论

A. 既然任意概率分布都可以作为隐变量的分布,为什么都用高斯分布去建模呢? 
这个问题的答案可能在于两个方面。一方面是,建模高斯分布给我们带来了良好的可计算性,能得到一些解析的结果。另一方面,可能是基于下面的数学事实,

 

maxf−∫f(x)lnf(x)dxs.t.∫f(x)dx∫(x−μ)2f(x)dxf(x)=1=σ2>0

 

这个问题的解是 

f∗=N(μ,σ2)

 

即给定概率分布的均值和方差,使得信息熵最大的概率分布是高斯分布。

B. 我们虽然退而求其次地仅仅最大化对数似然的下界,但如果网络实际的合理,我们实际上是在最大化logp(x)−DKL(q(z|x)||p(z|x)),这意味着训练过程中一方面最大化对数似然(我们的终极目标),另一方面最小化q和p的KL散度,即两者的概率分布距离。这样我们就一举两得:一方面完成了终极目标,另一方面使得原来不可计算的p(z|x)可计算,将q(z|x)最为其良好的近似。

C. 联合高斯分布之间的KL散度

根据上一篇关于GAN的“模拟上帝之手,对抗博弈——GAN背后的数学原理”一文,我们很容易得到两个联合高斯p1=N(μ1,Σ1)和p2=N(μ2,Σ2)之间的KL散度 

DKL(p1||p2)=12[logdetΣ2detΣ1−d+tr(Σ−12Σ1)+(μ2−μ1)TΣ−12(μ2−μ1)]

caffe_code:https://github.com/cdoersch/vae_tutorial

参考文献

Tutorial on Variational Autoencoders. Carl Doersch. arXiv:1606.05908, 2016.

<think> 首先,用户要求使用中文回答问题。所以我的整个响应必须是中文。 用户的问题是:“详细介绍一下vae的技术细节,数学原理,非常详细” 这里“vae”可能指的是Variational Autoencoder(变分自编码器)。这是一个深度学习的主题,涉及生成模型。 我需要非常详细地介绍VAE的技术细节数学原理。关键点包括: - **技术细节**:VAE的结构,包括编码器(encoder)、潜在空间(latent space)解码器(decoder)。编码器通常是一个神经网络,将输入数据映射到潜在变量的分布(通常是高斯分布)。解码器从潜在变量重构输入数据。 - **数学原理**:核心是变分推断(Variational Inference)。VAE使用一个近似后验分布q(z|x)来逼近真实后验p(z|x),其中z是潜在变量,x是观测数据。目标是最小化证据下界(Evidence Lower Bound, ELBO)的负值。 ELBO的定义是:ELBO = E_{q(z|x)}[log p(x|z)] - KL(q(z|x) || p(z)) 其中: - p(x|z) 是似然函数(解码器)。 - q(z|x) 是近似后验(编码器)。 - p(z) 是先验分布(通常是标准正态分布)。 - KL散度衡量两个分布的差异。 VAE通过最大化ELBO来训练,这等价于最小化重构误差潜在分布的KL散度。 我还需要覆盖训练过程:使用重参数化技巧(reparameterization trick)来处理随机变量z的采样,从而使梯度可以反向传播。 最后,用户指定在回答后必须提出3-5个相关问题,输出在末尾,第一行必须是“§§相关问题§§”,禁止换行分散。所以,我需要确保最后部分以“§§相关问题§§”开头,然后列出3-5个问题。 相关问题必须基于用户的问题我的回答。既然问题是关于VAE的细节原理,相关问题可以涉及: 1. 变分推断的其他应用。 2. VAE其他生成模型(如GAN)的比较。 3. ELBO的推导细节。 4. 重参数化技巧的具体实现。 5. VAE的局限性或改进方法。 列出3-5个问题。 现在,构建回答结构: 1. **介绍VAE**:简要解释什么是VAE及其目的。 2. **技术细节**:描述网络结构、编码器、解码器、潜在空间。 3. **数学原理**:详细推导ELBO,解释变分推断。 4. **训练过程**:包括损失函数、重参数化技巧。 5. **总结**。 6. **相关问题**:以“§§相关问题§§”开头,然后编号问题。 确保回答非常详细,所以数学推导要清晰。 用中文写所有内容。 最终输出格式: - 回答主体。 - “§§相关问题§§” - 问题列表。 </think>### 详细解释变分自编码器(VAE)的技术细节数学原理 变分自编码器(Variational Autoencoder, VAE)是一种深度生成模型,由KingmaWelling于2013年提出。它结合了自编码器的结构概率图模型的框架,用于学习数据的潜在表示,并生成新样本。以下是极其详细的技术细节数学原理阐述。 #### 一、技术细节 VAE由三个核心组件组成:编码器(Encoder)、潜在空间(Latent Space)解码器(Decoder)。整体架构基于神经网络,通常使用多层感知机(MLP)或卷积神经网络(CNN)。 1. **编码器(Encoder)**: - 输入是观测数据 \( \mathbf{x} \)(例如,图像或向量)。 - 编码器是一个神经网络(参数为 \( \phi \)),输出潜在变量 \( \mathbf{z} \) 的分布参数。 - 通常假设潜在分布是多元高斯分布: \( q_\phi(\mathbf{z} | \mathbf{x}) = \mathcal{N}(\mathbf{z}; \boldsymbol{\mu}_\phi(\mathbf{x}), \boldsymbol{\sigma}_\phi^2(\mathbf{x}) \mathbf{I}) \),其中: - \( \boldsymbol{\mu}_\phi(\mathbf{x}) \) 是均值向量。 - \( \boldsymbol{\sigma}_\phi^2(\mathbf{x}) \) 是方差向量(常通过指数函数确保正值)。 - 例如,在PyTorch中实现编码器: ```python class Encoder(nn.Module): def __init__(self, input_dim, hidden_dim, latent_dim): super().__init__() self.fc1 = nn.Linear(input_dim, hidden_dim) self.fc_mu = nn.Linear(hidden_dim, latent_dim) self.fc_logvar = nn.Linear(hidden_dim, latent_dim) # 输出对数方差,确保正值 def forward(self, x): h = torch.relu(self.fc1(x)) mu = self.fc_mu(h) log_var = self.fc_logvar(h) return mu, log_var ``` 2. **潜在空间(Latent Space)**: - 潜在变量 \( \mathbf{z} \) 是低维向量(维度通常远小于输入数据),用于捕获数据的本质特。 - 先验分布 \( p(\mathbf{z}) \) 通常设置为标准高斯分布: \( p(\mathbf{z}) = \mathcal{N}(\mathbf{z}; \mathbf{0}, \mathbf{I}) \)。 - 关键点:VAE不直接输出点估计,而是学习分布,使模型能生成多样化的样本。 3. **解码器(Decoder)**: - 输入是潜在变量 \( \mathbf{z} \),输出是重构数据 \( \mathbf{x}' \) 的分布。 - 解码器是另一个神经网络(参数为 \( \theta \)),定义似然函数 \( p_\theta(\mathbf{x} | \mathbf{z}) \)。 - 对于连续数据(如图像),通常假设高斯分布: \( p_\theta(\mathbf{x} | \mathbf{z}) = \mathcal{N}(\mathbf{x}; \boldsymbol{\mu}_\theta(\mathbf{z}), \sigma^2 \mathbf{I}) \),其中 \( \sigma^2 \) 是固定方差。 - 对于离散数据(如文本),可能使用伯努利或分类分布。 - 实现示例: ```python class Decoder(nn.Module): def __init__(self, latent_dim, hidden_dim, output_dim): super().__init__() self.fc1 = nn.Linear(latent_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, output_dim) def forward(self, z): h = torch.relu(self.fc1(z)) x_recon = torch.sigmoid(self.fc2(h)) # 用于二值化数据 return x_recon ``` 4. **训练过程**: - 使用小批量随机梯度下降(SGD)优化。 - 关键技巧:重参数化(Reparameterization Trick),用于处理随机采样,使梯度可传播。具体: - 采样 \( \mathbf{z} \) 时,不直接从 \( q_\phi(\mathbf{z} | \mathbf{x}) \) 采样,而是引入辅助噪声变量: \( \mathbf{z} = \boldsymbol{\mu}_\phi(\mathbf{x}) + \boldsymbol{\sigma}_\phi(\mathbf{x}) \odot \boldsymbol{\epsilon} \),其中 \( \boldsymbol{\epsilon} \sim \mathcal{N}(\mathbf{0}, \mathbf{I}) \),\( \odot \) 是逐元素乘法。 - 这使得 \( \mathbf{z} \) 的梯度可通过 \( \boldsymbol{\mu}_\phi \) \( \boldsymbol{\sigma}_\phi \) 反向传播。 - 损失函数基于证据下界(ELBO),详见数学原理部分。 #### 二、数学原理 VAE的核心是变分推断(Variational Inference),用于近似难以计算的后验分布 \( p(\mathbf{z} | \mathbf{x}) \)。目标是最小化KL散度 \( \text{KL}(q_\phi(\mathbf{z} | \mathbf{x}) \| p(\mathbf{z} | \mathbf{x})) \),但直接计算不现实,因此引入证据下界(ELBO)。 1. **证据下界(ELBO)的推导**: - 从观测数据的边缘似然 \( \log p_\theta(\mathbf{x}) \) 出发: \[ \log p_\theta(\mathbf{x}) = \mathbb{E}_{q_\phi(\mathbf{z} | \mathbf{x})} \left[ \log \frac{p_\theta(\mathbf{x}, \mathbf{z})}{q_\phi(\mathbf{z} | \mathbf{x})} \right] + \text{KL}(q_\phi(\mathbf{z} | \mathbf{x}) \| p_\theta(\mathbf{z} | \mathbf{x})) \] - 由于KL散度非负,因此有: \[ \log p_\theta(\mathbf{x}) \geq \mathbb{E}_{q_\phi(\mathbf{z} | \mathbf{x})} \left[ \log p_\theta(\mathbf{x}, \mathbf{z}) - \log q_\phi(\mathbf{z} | \mathbf{x}) \right] \triangleq \text{ELBO}(\theta, \phi; \mathbf{x}) \] - 展开ELBO: \[ \text{ELBO}(\theta, \phi; \mathbf{x}) = \mathbb{E}_{q_\phi(\mathbf{z} | \mathbf{x})} \left[ \log p_\theta(\mathbf{x} | \mathbf{z}) \right] - \text{KL}(q_\phi(\mathbf{z} | \mathbf{x}) \| p_\theta(\mathbf{z})) \] - 第一项:重构项(Reconstruction Term),衡量解码器重构数据的质量。 - 第二项:正则化项(KL Divergence),强制近似后验 \( q_\phi(\mathbf{z} | \mathbf{x}) \) 接近先验 \( p_\theta(\mathbf{z}) = \mathcal{N}(\mathbf{0}, \mathbf{I}) \)。 - 具体计算: - 重构项:对于高斯似然, \( \mathbb{E}_{q_\phi} \left[ \log p_\theta(\mathbf{x} | \mathbf{z}) \right] \approx -\frac{1}{2} \|\mathbf{x} - \boldsymbol{\mu}_\theta(\mathbf{z})\|^2 \)(忽略常数)。 - KL项:对于高斯先验后验,有闭式解: \[ \text{KL}(q_\phi(\mathbf{z} | \mathbf{x}) \| p(\mathbf{z})) = \frac{1}{2} \sum_{j=1}^J \left( \sigma_{\phi,j}^2 + \mu_{\phi,j}^2 - 1 - \log \sigma_{\phi,j}^2 \right) \] 其中 \( J \) 是潜在维度。 2. **优化目标**: - 训练时最大化ELBO,等价于最小化损失函数: \[ \mathcal{L}(\theta, \phi; \mathbf{x}) = -\text{ELBO}(\theta, \phi; \mathbf{x}) = \mathbb{E}_{q_\phi(\mathbf{z} | \mathbf{x})} \left[ -\log p_\theta(\mathbf{x} | \mathbf{z}) \right] + \text{KL}(q_\phi(\mathbf{z} | \mathbf{x}) \| p(\mathbf{z})) \] - 实践中,使用蒙特卡洛采样估计期望:采样 \( L \) 个 \( \mathbf{z}^{(l)} \sim q_\phi(\mathbf{z} | \mathbf{x}) \)(通常 \( L=1 \)),损失为: \[ \mathcal{L} \approx -\log p_\theta(\mathbf{x} | \mathbf{z}^{(l)}) + \text{KL}(q_\phi(\mathbf{z} | \mathbf{x}) \| p(\mathbf{z})) \] - 总损失在数据集上平均: \( \frac{1}{N} \sum_{i=1}^N \mathcal{L}(\theta, \phi; \mathbf{x}_i) \)。 3. **概率图模型视角**: - VAE建模为隐变量模型:数据生成过程为 \( \mathbf{z} \sim p(\mathbf{z}) \), \( \mathbf{x} \sim p_\theta(\mathbf{x} | \mathbf{z}) \)。 - 变分推断提供优化框架:通过最大化ELBO,近似后验 \( q_\phi(\mathbf{z} | \mathbf{x}) \) 逼近真实后验 \( p(\mathbf{z} | \mathbf{x}) \),同时提升生成能力。 #### 三、总结 VAE通过变分推断重参数化技巧,将生成模型训练转化为可优化的神经网络问题。其优势包括生成多样样本、学习平滑潜在空间,但局限性如生成质量不如GAN、KL散度可能导致后验塌陷(Posterior Collapse)。应用领域包括图像生成、异常检测半监督学习。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值