VAE(Variational Autoencoder)变分自编码器

♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥

Table of Contents

0.Autoencoders 自动编码器

1. Variational autoencoders 变分自编码器

1.1 Intuition 我们的直觉

1.2 represent each latent attribute as a range of possible values

将每个潜在属性表示为可能值的范围

1.3 sampling 采样

2 theory 理论知识

2.1 use an approximation function to compute p(x)

2.2 train the neural network 训练模型

2.3 loss function 损失函数

2.4 reparameterization trick(backpropagation)  重参数技巧

♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥

0.Autoencoders 自动编码器

自动编码器是一种数据压缩的方法。并且是一种有损压缩的方法。

encoder(编码):输入一幅图像,经过神经网络对数据提取特征(对数据进行降维,降维到一个编码)。

decoder(解码):通过神经网络进行解码。

loss(损失值):比较原始图像和解码图像的相似度,最小化它们之间的差异。即在训练模型的时候,要逐步减小重构图像和原始图像的平均平方误差。

1. Variational autoencoders 变分自编码器

在自动编码器中,模型将输入数据映射到一个低维的向量(map it into a fixed vector)。

在变分自编码器中,模型将输入的数据映射到一个分布(map it into a distribution)。变分自编码器会产生两个向量:一个是均值向量(mean),另一个是标准差向量(Variance)。变分自编码将神经网络和概率进行了结合。

1.1 Intuition 我们的直觉

The autoencoder will learn descriptive attributes of faces such as skin color, whether or not the person is wearing glasses, etc. in an attempt to describe an observation in some compressed representation.

在上个例子中,输入一个人的图像,自动编码器会试图提取皮肤的颜色,是否带眼镜等等,以提取出图像的特征。

1.2 represent each latent attribute as a range of possible values

将每个潜在属性表示为可能值的范围

在变分自动编码器中,将提取出每个特征的数值范围(根据均值和标准差确定)。

1.3 sampling 采样

当模型提取出每个特征的分布时,就可以从分布中进行采样,从而生成新的图片。

2 theory 理论知识

在变分自编码中,图像处理经过了以下步骤:

输入图像 x --------> 分布向量 z ----------> 解码后的图像x'

在变分自编码器,将假设原始图像编码后的数据是服从一个设定的分布的(即假设z是服从一定分布的),然后解码阶段要做的事情就是训练神经网络 使得 x’=g(z) 与 x更加相似

Suppose that there exists some hidden variable z which generates an observation x:

为了使得x’=g(z) 与 x更加相似,试图求出给定x条件下z的分布,即试图求出p(z|x)

但是我们发现,计算p(x)是比较难的,因为输入的x是N个图像。不能保证输入的x都服从一定的分布。

所以用一种近似的方法来计算p(x),令p(x)=\int p(x|z)p(z)dz

2.1 use an approximation function to compute p(x)

在上图中,encoder(编码)网络的参数为\theta(即网络的权值参数),decoder(解码)网络的参数为\varphi

编码阶段:\theta实现网络从输入在z的映射。

解码阶段:\varphi实现网络从z到x的重构。

利用近似的方法计算p(x):p(x)=\int p(x|z)p(z)dz

p(x|z)记录了由z来生成x的模型,而对于p(z),模型直接假设是服从正态分布的。

但是,本质上,模型是直接假设后验分布是正态分布,即假设q(z|x)是正态分布。

p(z)=\sum_x q(z|x)p(x)=\sum_x N(0,1)p(x)=N(0,1)\sum_xp(x)=N(0,1)

这样,对模型来讲,解码阶段x’=g(z)采样获得的x‘与输入的x是对应的。

此时,对每一个特征,都假设了一个正态分布。

正态分布有两组参数:均值\mu和方差\sigma^2。但是在实际过程中计算log\sigma ^2,是因为\sigma^2是非负的,因此需要加上激活函数处理。而log\sigma ^2是可以正数,也可以负数。

同时,为了使得模型更好训练,重构的更好,假设VAE是服从标准正态分布的。即在变分自编码中,一般假设提取出的特征的分布是一个均值为0,方差为1的高斯分布N(0,1)。假设标准正态分布的好处是防止了模型训练的方差为0,从而模型没有了生成能力(因为方差为0的时候,采样将没有了随机性,所有的采样将是同一个值,这个值就是均值)。

为了保证模型训练出来的分布p(z|x)接近于N(0,1),模型中加入了一个误差:单位高斯分布的拟合度

即训练出来的模型与单位高斯分布之间的误差,这个误差可以用KL散度来计算。

则最终的误差可以由两方面构成,一方面是重构图片与原始图片的误差,另一方面是单位高斯分布的拟合度

即:损失函数=重构图片与原始图片的误差+单位高斯分布的拟合度

2.2 train the neural network 训练模型

2.3 loss function 损失函数

上面介绍到损失函数将由两方面构成,一方面是重构图片与原始图片的误差,另一方面是单位高斯分布的拟合度

(1)重构图片和原始图片的误差

对于重构图片与原始图片的误差,可以用平均平方误差来度量或者交叉熵。

(2)单位高斯分布的拟合度

对于潜在变量的分布与单位高斯分布的差异,可以用KL散度来度量,即要计算D_{KL}(q_{\phi}(z|x)||p_{\theta}(z))

KL散度也被称为相对熵,用于两个概率分布间差异的非对称度量。

KL\Big(p(x)\Big\Vert q(x)\Big) =\int p(x)\ln \frac{p(x)}{q(x)} dx =\mathbb{E} _{x\sim p(x)}\left[\ln \frac{p(x)}{q(x)}\right]

单位高斯分布拟合度推导(使用KL散度计算,训练目标是降低D_{KL}):

公式计算:

所以:

因此:log{p_{\theta}}(x)=D_{KL}(q_{\phi}(z|x)||p_{\theta}(z|x))+L(\theta, \phi;x)

其中L(\theta, \phi;x)=-D_{KL}(q_{\phi}(z|x)||p_{\theta}(z))+\mathbb{E}_{z\sim q_{\phi}(z|x)}[logp_{\theta}(x|z)]

L(\theta, \phi)被称为变分的下界,因为有:

log{p_{\theta}}(x)=D_{KL}(q_{\phi}(z|x)||p_{\theta}(z|x))+L(\theta, \phi;x)\geq L(\theta, \phi;x)

这里的log_{p_\theta}(x)是输入样本x的先验分布,由于这个分布很难算出,很难对其优化。因此算法中选择优化它的下界,即L(\theta, \phi;x)。在模型中,希望最大化L(\theta, \phi;x),使得其更加接近于log{p_{\theta}}(x),此时的KL散度是最小的,即q(z|x)与p(z|x)之间的分布更加接近。

L(\theta, \phi;x)=-D_{KL}(q_{\phi}(z|x)||p_{\theta}(z))+\mathbb{E}_{z\sim q_{\phi}(z|x)}[logp_{\theta}(x|z)]

变分下界的左边一项{\color{Red} D_{KL}(q_{\phi}(z|x)}

在损失函数中,根据之前的分析,假设p_{\theta}(z)是服从标准正态分布的。对于q_{ \phi }(z|x)的分布,假设其是正态分布。

对于计算正态分布与标准正态分布的KL散度:

\begin{aligned}&KL\Big(N(\mu,\sigma^2)\Big\Vert N(0,1)\Big)\\ =&\int \frac{1}{\sqrt{2\pi\sigma^2}}e^{-(x-\mu)^2/2\sigma^2} \left(\log \frac{e^{-(x-\mu)^2/2\sigma^2}/\sqrt{2\pi\sigma^2}}{e^{-x^2/2}/\sqrt{2\pi}}\right)dx\\ =&\int \frac{1}{\sqrt{2\pi\sigma^2}}e^{-(x-\mu)^2/2\sigma^2} \log \left\{\frac{1}{\sqrt{\sigma^2}}\exp\left\{\frac{1}{2}\big[x^2-(x-\mu)^2/\sigma^2\big]\right\} \right\}dx\\ =&\frac{1}{2}\int \frac{1}{\sqrt{2\pi\sigma^2}}e^{-(x-\mu)^2/2\sigma^2} \Big[-\log \sigma^2+x^2-(x-\mu)^2/\sigma^2 \Big] dx\end{aligned}

即:

KL\Big(N(\mu,\sigma^2)\Big\Vert N(0,1)\Big)=\frac{1}{2}\Big(-\log \sigma^2+\mu^2+\sigma^2-1\Big)

-KL\Big(q_{ \phi }(z|x)\Big\Vert p_{\theta}(z)\Big)=-\frac{1}{2} \sum_{k=1}^d \Big(\mu_{(k)}^2(x) + \sigma_{(k)}^2(x) - \log \sigma_{(k)}^2(x) - 1\Big)

-KL\Big(q_{ \phi }(z|x)\Big\Vert p_{\theta}(z)\Big)= \frac{1}{2} \sum_{k=1}^d \Big(-\mu_{(k)}^2(x) - \sigma_{(k)}^2(x) + \log \sigma_{(k)}^2(x) -+1\Big)

其中的\mu(x),\sigma^2(x)为神经网络训练出来的均值和方差。

变分下界的右边一项{\color{Red} \mathbb{E}_{z\sim q_{\phi}(z|x)}[logp_{\theta}(x|z)]}

这一项考虑用采样的方法解决

\mathbb{E}_{z\sim q_{\phi}(z|x)}[logp_{\theta}(x|z)]=\frac{1}{L}\sum_{l=1}^{L}logp_{\theta}(x|z)

log(p_\theta(x|z))p_\theta(x|z)的分布,可以选择伯努利分布或者正态分布。

若选择伯努利分布,则其为一个二元分布:

p(\xi)=\left\{\begin{aligned}&\rho,\, \xi = 1;\\ &1-\rho,\, \xi = 0\end{aligned}\right.

p(x|z)=\prod_{k=1}^D \Big(\rho_{(k)}(z)\Big)^{x_{(k)}} \Big(1 - \rho_{(k)}(z)\Big)^{1 - x_{(k)}}\tag{18}

\log p(x|z) = \sum_{k=1}^D \Big[ x_{(k)} \log \rho_{(k)}(z) + (1-x_{(k)}) \log \Big(1 -\rho_{(k)}(z)\Big)\Big]\tag{19}

若选择正态分布:

p(x|z)=\frac{1}{\prod\limits_{k=1}^D \sqrt{2\pi \tilde{\sigma}_{(k)}^2(z)}}\exp\left(-\frac{1}{2}\left\Vert\frac{x-\tilde{\mu}(z)}{\tilde{\sigma}(z)}\right\Vert^2\right)

\log p(x|z) = -\frac{1}{2}\left\Vert\frac{x-\tilde{\mu}(z)}{\tilde{\sigma}(z)}\right\Vert^2 - \frac{D}{2}\log 2\pi - \frac{1}{2}\sum_{k=1}^D \log \tilde{\sigma}_{(k)}^2(z)

若将方差固定,则:

\log p(x|z) \sim- \frac{1}{2\tilde{\sigma}^2}\Big\Vert x-\tilde{\mu}(z)\Big\Vert^2
综上得到:

L(\theta, \phi;x)\\=-D_{KL}(q_{\phi}(z|x)||p_{\theta}(z))+\mathbb{E}_{z\sim q_{\phi}(z|x)}[logp_{\theta}(x|z)] \\=\frac{1}{2} \sum_{k=1}^d \Big(-\mu_{(k)}^2(x) - \sigma_{(k)}^2(x) + \log \sigma_{(k)}^2(x) -+1\Big)+\frac{1}{L}\sum_{l=1}^{L}logp_{\theta}(x|z) \\ where\, \, \, \, \, z = \mu(x) + \varepsilon \times \sigma(x),\quad \varepsilon\sim \mathcal{N}(0,I).

代码:

# KL_divergence为z与标准高斯分布之间的差距,即编码器的损失
KL_divergence = 0.5 * tf.reduce_sum(tf.square(mu) + tf.square(sigma) - tf.log(1e-8 + tf.square(sigma)) - 1, 1)
KL_divergence = tf.reduce_mean(KL_divergence)

# marginal_likelihood loss为y与输入数据x之间交叉墒,即解码器的损失
marginal_likelihood = tf.reduce_sum(x * tf.log(y) + (1 - x) * tf.log(1 - y), 1)
marginal_likelihood = tf.reduce_mean(marginal_likelihood)

# 变分下界L(x),目标最大化
ELBO = -KL_divergence + marginal_likelihood

# 令损失函数为-L(x),目标梯度下降最小化
loss = -ELBO

2.4 reparameterization trick(backpropagation)  重参数技巧

采样是不可以导的,为了使得采样可导出,加入了\varepsilon,使得z=\mu +\varepsilon \times \sigma。这个\varepsilon是服从N(0,1)的正态分布。

z = \mu(x) + \varepsilon \times \sigma(x),\quad \varepsilon\sim \mathcal{N}(0,I).

# 重参数技巧
def sampling(args):
    z_mean, z_log_var = args
    epsilon = K.random_normal(shape=K.shape(z_mean))
    return z_mean + K.exp(z_log_var / 2) * epsilon

♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥

广告时间:

本宝宝开通了一个公众号,记录日常的深度学习和强化学习笔记。

希望大家可以共同进步,嘻嘻嘻!求关注,爱你呦!

KeepYourAims

发布了125 篇原创文章 · 获赞 126 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/Valieli/article/details/103897098