AE (⾃动编码器)与VAE (变分⾃动编码器)简单理解AE (Auto Encoder, ⾃动编码器)
AE 的结构
如上图所⽰,⾃动编码器主要由两部分组成:编码器(Encoder )和解码器(Decoder )。编码器和解码器可以看作是两个函数,⼀个⽤于将⾼维输⼊(如图⽚)映射为低维编码(code ),另⼀个⽤于将低维编码(code )映射为⾼维输出(如⽣成的图⽚)。这两个函数可以是任意形式,但在深度学习中,我们⽤神经⽹络去学习这两个函数。
那如何去学呢?这⾥以图⽚为例,只需要输⼊⼀张图⽚(X ),经过编码器(Encoder )⽹络,输出编码(code ),再将编码(code )作为
解码器⽹络(Decoder )的输⼊,输出⼀张新的图⽚(ˆX ),最后最⼩化X 与ˆX 之间的差距(通常可⽤MSE 误差)即可。
这时候我们直观想象只要拿出Decoder 部分,随机⽣成⼀个code 然后输⼊,就可以得到⼀张⽣成的图像。但实际上这样的⽣成效果并不好(下⾯解释原因),因此AE 多⽤于数据压缩,⽽数据⽣成则使⽤下⾯所介绍的VAE 更好。
AE 的缺陷
由上⾯介绍可以看出,AE 的Encoder 是将图⽚映射成“数值编码”,Decoder 是将“数值编码”映射成图⽚。这样存在的问题是,在训练过程中,随着不断降低输⼊图⽚与输出图⽚之间的误差,模型会过拟合,泛化性能不好。也就是说对于⼀个训练好的AE ,输⼊某个图⽚,就只会将其编码为某个确定的code ,输⼊某个确定的code 就只会输出某个确定的图⽚,并且如果这个code 来⾃于没见过的图⽚,那么⽣成的图⽚也不会好。下⾯举个例⼦来说明:
假设我们训练好的AE 将“新⽉”图⽚encode 成code=1(这⾥假设code 只有1维),将其decode 能得到“新⽉”的图⽚;将“满⽉”encode 成code=10,同样将其decode 能得到“满⽉”图⽚。这时候如果我们给AE ⼀个code=5,我们希望是能得到“半⽉”的图⽚,但由于之前训练时并没有将“半⽉”的图⽚编码,或者将⼀张⾮⽉亮的图⽚编码为5,那么我们就不太可能得到“半⽉”的图⽚。因此AE 多⽤于数据的压缩和恢复,⽤于数据⽣成时效果并不理想。
那如何解决以上问题呢?这时候我们转变思路,不将图⽚映射成“数值编码”,⽽将其映射成“分布”。还是刚刚的例⼦,我们将“新⽉”图⽚映射成µ=1的正态分布,那么就相当于在1附近加了噪声,此时不仅1表⽰“新⽉”,1附近的数值也表⽰“新⽉”,只是1的时候最像“新⽉”。将"满⽉"映射成µ=10的正态分布,10的附近也都表⽰“满⽉”。那么code=5时,就同时拥有了“新⽉”和“满⽉”的特点,那么这时候decode 出来的⼤概率就是“半⽉”了。这就是VAE 的思想。
VAE (Variational Auto-Encoder, 变分⾃动编码器)
VAE 的结构
如上图所⽰,VAE 与AE 整体结构类似,不同的地⽅在于AE 的Encoder 直接输出code ,⽽VAE 的Encoder 输出的是若⼲个正态分布的均值(µ1,µ2...µn )和标准差(σ1,σ2...σn ),然后从每个正态分布
µ1,σ21,µ2,σ22...µn ,σ2n 采样得到编码code(Z 1,Z n ),再将code 送⼊Decoder 进⾏解码。那如何进⾏训练呢?在训练过程中,VAE 的Loss 函数由两部分组成:
1. 为了让输出和输⼊尽可能像,所以要让输出和输⼊的差距尽可能⼩,此部分⽤MSELoss 来计算,即最⼩化MSELoss 。
2. 训练过程中,如果仅仅使输⼊和输出的误差尽可能⼩,那么随着不断训练,会使得σ趋近于0,这样就使得VAE 越来越像AE ,对数据产⽣了过拟合,编码的噪声也会消失,导致⽆法⽣成未见过的数据。因此为了解决这个问题,我们要对µ和σ加以约束,使其构成的正态分布尽可能像标准正态分布,具体做法是计算µ,σ2
与(0,1)之间的KL 散度,即最⼩化下式(具体推导过程下⾯介绍):KL(µ,σ2||(0,1))=12−log σ2+µ2+σ2−1但是我们注意到这⾥的code 是通过从正态分布中采样得到的,这个采样的操作是不可导的,这会导致在反向传播时Z 对µ和σ⽆法直接求导,因此这⾥⽤到⼀个trick :重参数化技巧(reparametrize )。具体思想是:从(0,1)中采样⼀个ε,然后让Z =µ+ε×σ,这就相当于直接从µ,σ2
中采样Z 。具体过程如下所⽰:KL Loss 推导
()()()()()()
()
先导知识
连续随机变量下KL散度公式:
KL(P‖
连续随机变量下期望公式:
设连续型随机变量X的概率密度函数为f(x),且积分绝对收敛,则期望为:
E(X)=\int_{-\infty}^{\infty} x f(x) d x
若随机变量Y符合Y=g(X),X的概率密度函数为f(x),且g(x)f(x)的积分绝对收敛,则期望为:
E(Y)=E(g(X))=\int_{-\infty}^{\infty} g(x) f(x) d x
⽅差公式:
\mathrm D(\mathrm X) = \mathrm E\big([x-\mathrm E(\mathrm X)]^2\big)= \mathrm E(\mathrm X^2)-[\mathrm E(\mathrm X)]^2
正态分布公式:
X \sim N\left(\mu, \sigma^{2}\right)的概率密度函数:
f(x)=\frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right)
KL Loss推导过程
\begin{aligned} \mathrm {KL}(\mathcal{N}\left(\mu_{}, \sigma_{}^2\right)||\mathcal{N}\left(0, 1\right)) &=\int \frac{1}{\sqrt{2 \pi \sigma^{2}}}
\exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\left(\log \frac{\exp\big({-(x-\mu)^{2} / 2 \sigma^{2}\big) \big/ \sqrt{2 \pi \sigma^{2}}}}{\exp\big({-x^{2} / 2\big) \big/ \sqrt{2 \pi}}}\right)\ dx\\ &=\int \frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\log \bigg( \frac{1}
{\sqrt{\sigma^2}}\cdot \exp\big(\frac 1 2(x^2-(x-\mu)^2/\sigma^2)\big) \bigg)\ d x\\ &=-\frac 1 2 \int \frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\bigg(\log\sigma^2-x^2+(x-\mu)^2/\sigma^2\bigg)\ dx \end{aligned}
其中展开可以分为三项:
第⼀项:
\begin{aligned} &\int \frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\cdot \log\sigma^2 \ dx\\ &=\log\sigma^2\int \frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg) \ dx\\ &=\log\sigma^2 \end{aligned}
此处注意:概率密度函数的积分为1
第⼆项:
\begin{aligned} &\int \frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\cdot x^2 \ dx\\ \end{aligned}
这⾥的化简技巧是:根据E(Y)=E(g(X))=\int_{-\infty}^{\infty} g(x) f(x) d x,将上式中\frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2
\sigma^{2}}\bigg)看作f(x),将x^2看作g(x),则有:
\begin{aligned} \int \frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\cdot x^2 \ dx &=\mathrm E(\mathrm X^2) \\
&=\mathrm D(\mathrm X)+[\mathrm E(\mathrm X)]^2\\ &=\sigma^2+\mu^2 \end{aligned}
其中X \sim N\left(\mu, \sigma^{2}\right)
第三项:
\begin{aligned} &\int \frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\cdot (x-\mu)^2/\sigma^2 \ dx\\ &=\frac {1} {\sigma^2} \int \frac{(x-\mu)^2}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\ dx\\ \end{aligned}
这⾥的化简技巧同上⾯第⼆项的化简类似,将上式中\frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)看作f(x),
将(x-\mu)^2=\big(x-\mathrm E(\mathrm X)\big)^2看作g(x),则有:
\begin{aligned} \frac {1} {\sigma^2} \int \frac{(x-\mu)^2}{\sqrt{2 \pi \sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\ dx &=\frac {1} {\sigma^2} \cdot \mathrm E\big([x-\mathrm E(\mathrm X)]^2\big)\\ &=\frac {1} {\sigma^2} \cdot \mathrm D(\mathrm X) \\ &= \frac {1} {\sigma^2} \cdot \sigma^2\\ &=1 \end{aligned}
综上所述:
\begin{aligned} \mathrm {KL}(\mathcal{N}\left(\mu_{}, \sigma_{}^2\right)||\mathcal{N}\left(0, 1\right)) &=-\frac 1 2 \int \frac{1}{\sqrt{2 \pi
\sigma^{2}}} \exp\bigg({-(x-\mu)^{2} / 2 \sigma^{2}}\bigg)\bigg(\log\sigma^2-x^2+(x-\mu)^2/\sigma^2\bigg)\ dx\\ &=-\frac 1 2(\log\sigma^2-
\sigma^2-\mu^2+1) \end{aligned}
decoder代码
有关VAE的代码实现:
实验效果:
从正态分布中随机采样100个code输⼊训练好的Decoder⽣成结果:
⼩结
AE主要⽤于数据的压缩与还原,在⽣成数据上使⽤VAE。
AE是将数据映直接映射为数值code,⽽VAE是先将数据映射为分布,再从分布中采样得到数值code。
VAE的缺点是⽣成的数据不⼀定那么“真”,如果要使⽣成的数据“真”,则要⽤到GAN。
注:本⽂主要还是对VAE⽐较直观的介绍,关于其中具体的数学原理(如估计训练集的概率分布、混合⾼斯思想等),可以参考原论⽂或者其他博主的⽂章。另外,本⽂部分内容仅个⼈见解,如有错误也欢迎读者批评指正。
参考
Loading [MathJax]/jax/element/mml/optable/GeneralPunctuation.js

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。