本文内容同个人微信号推送文章:变分自编码器 VAE(Variational Autoencoder)

0.Autoencoders 自动编码器


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

(1)encoder(编码):输入一幅图像,经过神经网络对数据提取特征(对数据进行降维,降维到一个编码)。
(2)decoder(解码):通过神经网络进行解码。
(3)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)}}

\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]

若选择正态分布:

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)的正态分布。

# 重参数技巧
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
0
Posted in 深度学习&强化学习

Leave a Comment:

电子邮件地址不会被公开。