VAE(变分自编码器) 详解

该文详细介绍了变分自编码器(VAE)的工作原理,结合神经网络结构和变分推断理论进行讲解。VAE是自编码器和变分推断的结合,用于非监督学习任务如降维和信息检索。文章通过对比自编码器,解释了VAE引入噪声和修改损失函数的原因,并提供了直观理解。进一步,文章从变分推断角度推导了VAE的优化目标,解释了重参数化技巧在其中的作用。最后,给出了一个简单的PyTorch实现VAE的代码示例,以帮助读者更好地理解和应用VAE。

近期看论文要用到VAE,看了很多资料,有这样一种感觉,要么过度过于偏向数学原理,要么只是讲了讲网络结构。本文将两者结合,以简洁易懂的语言结合代码实现来介绍VAE。

1 解决问题

VAE是变分推断(variational inference )以及自编码器(Auto-encoder)的组合,是一种非监督的生成模型,其概率图模型和深度学习有机结合,近年来比较火热。VAE可以用于但不局限于降维信息检索等任务,我看文献遇到的是一篇做配准的论文,也用到了VAE。

2 从神经网络理解

先从神经网络的角度去看VAE,VAE实际上是在Atuo-encoder(AE)的变种,其基本架构也如Atuo-encoder,包含两部分encoder(编码器)和decoder(解码器)。大概如下:
在这里插入图片描述
图片摘自:github
以最开始的自编码器为例,其loss函数一般是输入和输出的MSE,通过调整Encoder输出层的节点数(需要低于输入的维度),我们可以从低维度的数据(code)通过Decoder重建出输入。

自编码器存在这样的问题,倘若模型过完备(中间层维度大于输入),模型会直接复制模型的输入作为输出。

在一般实际使用中,我们往往会添加正则项。
除此之外,还有VAE,可以学习出高容量且过完备(中间层维度大于输入)模型。VAE的网络结构如下:
在这里插入图片描述
本图摘自:李宏毅2020深度学习课程
可以看到VAE和AE的区别在于两方面:
1.中间层引入了一个noise;
2.loss函数的改变多了: ∑ i = 1 3 ( x e p ( σ i − ( 1 + σ i ) + ( m i 2 ) ) ) \sum_{i=1}^{3}(xep(\sigma_{i}-(1+\sigma_{i})+(m_{i}^{2}))) i=13(xep(σi(1+σi)+(mi2)))这一项。根据上面的结构,我们基本可以很容易地代码实现。

那么如何直观地理解上面地改变呢?
1.为什么要引入noise?首先直观理解,就算有一个noise也要尽量输入和输出相似,这样的decoder更加鲁棒。另一个直观理解就是,在引入noise之前,我们的decoder的输入和输出地映射可以看作是离散的,但是在加入noise之后,可以看作把不连续地变成连续的了。
2.为什么更改loss?首先假设没有更改,其实最好的情况肯定是方差为0,即 σ = 0 \sigma=0 σ=0。这就回到了AE的形式。直观地说,多加地这一项避免了这一点。那么怎么要这样更改loss呢?首先公式地前两项的值域大于等于0,最后一项可以看作一个L2正则项。

上面的理解都是直观的,感性的认识。下面一部分将从变分推断的角度推导出所谓的引入noise其实是重参数化技巧的结果,而loss的改变也是推导所得,本质是一个KL散度。如果读者到目前为止还有求知欲,就可以继续往下看。

3 从变分推断理解VAE

设:x:为观测数据,可以看作是样本
y:为隐变量,包含但不限于模型的参数
首先变分推断的核心思想是:因为一般情况下后验概率 p ( z ∣ x ) p(z|x) p(zx)是不可求解的,所以变分推断采用了一种迂回的策略,即使用 q ( z ) q(z) q(z)去近似 p ( z ∣ x ) p(z|x) p(zx)。如果读者对生成模型不是很理解,可以把 p ( z ∣ x ) p(z|x) p(zx)看作是AE中的编码器, p ( x ∣ z ) p(x|z) p(xz)看作是AE中的解码器。
VAE是典型的生成模型,那就从下面公式开始:
log ⁡ p ( x ) = log ⁡ p ( x , z ) p ( z ∣ x ) = log ⁡ p ( x , z ) q ( z ) − log ⁡ p ( z ∣ x ) q ( z ) \begin{aligned}\log p(x)&=\log \frac{p(x,z)}{p(z|x)} \\ &= \log \frac{p(x,z)}{q(z)}-\log \frac{p(z|x)}{q(z)} \end{aligned} logp(x)=logp(zx)p(x,z)=logq(z)p(x,z)logq(z)p(zx)
两边关于 q ( z ) q(z) q(z)同时求期望,则: 左边 = ∫ z q ( z ) log ⁡ p ( x ) d z = log ⁡ p ( x ) 左边=\int_{z}q(z)\log p(x) dz=\log p(x) 左边=zq(z)logp(x)dz=logp(x) 右边 = ∫ z q ( z ) log ⁡ p ( x , z ) q ( z ) d z − ∫ z q ( z ∣ x ) log ⁡ p ( z ∣ x ) q ( z ) d z = L ( q ) + K L ( q ( z ) ∣ ∣ p ( z ∣ x ) ) \begin{aligned} 右边 &= \int_{z} q(z)\log \frac{p(x,z)}{q(z)} dz-\int_{z} q(z|x)\log \frac{p(z|x)}{q(z)} dz \\ &=\mathcal{L}(q)+KL(q(z)||p(z|x)) \end{aligned} 右边=zq(z)logq(z)p(x,z)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值