电脑基础 · 2023年4月3日

【深度学习】生成模型:VAE(自编码器)模型解析

目录

  • 1 前言
  • 2 VAE模型
    • 2.1 VAE模型推导
    • 2.2 重参化技巧
  • 3 QA
    • 3.1 生成体现在什么地方
    • 3.2 AE和VAE的区别
  • 4 另一种角度理解VAE
  • 5 总结
  • 不足
  • 6 参考文献

1 前言

  本文为自己自学内容的记录,其中多有借鉴别人博客的地方,一并在参考文献中给出链接,其中大部分截图来自李宏毅深度学习PPT课件。其中内容有理解不到位的地方,各位大佬在评论区给出修改意见,感恩。

  本文前置知识高斯混合模型和EM算法,如果不了解这两种算法直接看VAE模型会有理解上的障碍。

2 VAE模型

2.1 VAE模型推导

  VAE模型的初始化推导和EM算法的推导有相似之处,不同的是在VAE模型中隐变量
Z
Z
Z
是一个连续的无穷维而不是跟高斯分布一样为有限的离散变量,所以在VAE的参数估计中用到了神经网络。

  VAE是一个深度生成模型,其最终目的是生成出概率分布
P
(
x
)
P(x)
P(x)

x
x
x
即输入数据。在VAE中,通过高斯混合模型(Gaussian Mixture Model)来生成
P
(
x
)
P(x)
P(x)
,也就是说
P
(
x
)
P(x)
P(x)
是由一系列高斯分布叠加而成的,每一个高斯分布都有它自己的参数
μ
\mu
μ

σ
\sigma
σ

【深度学习】生成模型:VAE(自编码器)模型解析
为此假设隐变量
z
z
z
服从
z

N
(
,
I
)
\mathrm{z} \sim \mathrm{N}(0, \mathrm{I})
zN(0,I)
(注意
z
z
z
是一个向量,生成自一个高斯分布),并且找一个映射关系将向量
z
z
z
映射成这一系列高斯分布的参数向量
μ
(
z
)
\mu(z)
μ(z)

σ
(
z
)
\sigma (z)
σ(z)
。有了这一系列高斯分布的参数,就可以得到叠加后的
P
(
x
)
P(x)
P(x)
的形式,即
x

z

N
(
μ
(
z
)
,
σ
(
z
)
)
\mathrm{x} \mid \mathrm{z} \sim \mathrm{N}(\mu(\mathrm{z}), \sigma(\mathrm{z}))
xzN(μ(z),σ(z))
(这里的“形式”仅是对某一个向量
z
z
z
所得到的)这里可以结合高斯混合模型理解,也可以结合参考文献【2】中的例子理解,总之就是假设隐变量
Z
Z
Z
服从某一种分布,而观察到的样本
X
X
X
属于
Z
Z
Z
的某一个分布的概率。

  那么要找的这个映射关系
P
(
x

z
)
P(x|z)
P(xz)
如何获得?这里就需要用到神经网络,那么为什么不用极大似然估计,因为在VAE模型中隐变量数量假设是高维无限的,没有办法用积分去做,所以用神经网络去拟合(神经网络可以拟合任意函数)。如下图所示:
【深度学习】生成模型:VAE(自编码器)模型解析
输入向量
z
z
z
,得到参数向量
μ
(
z
)
\mu (z)
μ(z)

σ
(
z
)
\sigma (z)
σ(z)
。这个映射关系是要在训练过程中更新NN权重得到的。这部分作用相当于最终的解码器(decoder)。

  对于某一个向量
z
z
z
我们知道了如何找到
P
(
x
)
P(x)
P(x)
,那么对连续变量
z
z
z
依据全概率公式有:

P
(
x
)
=

z
P
(
z
)
P
(
x

z
)
d
z
\mathrm{P}(\mathrm{x})=\int_{\mathrm{z}} \mathrm{P}(\mathrm{z}) \mathrm{P}(\mathrm{x} \mid \mathrm{z}) \mathrm{dz}
P(x)=zP(z)P(xz)dz

  但是很难直接计算积分部分,因为我们很难穷举出所有的向量
z
z
z
用于计算积分。又因为
P
(
x
)
P(x)
P(x)
难以计算,那么真实的后验概率
P
(
z

x
)
=
P
(
z
)
P
(
x

z
)
/
P
(
x
)
P(z∣x)=P(z)P(x∣z)/P(x)
P(zx)=P(z)P(xz)/P(x)
同样是不容易计算的,这也就是为什么下文要引入
q
(
z

x
)
q(z|x)
q(zx)
来近似真实后验概率
P
(
z

x
)
P(z|x)
P(zx)

因此我们用极大似然估计来估计
P
(
x
)
P(x)
P(x)
,有似然函数
L
L
L


L
=

x
log

P
(
x
)
\mathrm{L}=\sum_{\mathrm{x}} \log \mathrm{P}(\mathrm{x})
L=xlogP(x)

这里额外引入一个分布
q
(
z

x
)
q(z|x)
q(zx)

z

x

N
(
μ

(
x
)
,
σ

(
x
)
)
z|x \sim N\big(\mu^\prime(x), \sigma^\prime(x)\big)
zxN(μ(x),σ(x))
,这个分布表示形式如下:
【深度学习】生成模型:VAE(自编码器)模型解析
这个分布同样是用一个神经网络来完成,向量
z
z
z
根据NN输出的参数向量
μ

(
x
)
\mu '(x)
μ(x)

σ

(
x
)
\sigma '(x)
σ(x)
运算得到,这部分作用相当于编码器(encoder)。

注意:这里为什么需要引入额外的分布
q
(
z

x
)
q(z|x)
q(zx)
,跟EM算法的求解过程做对比,在EM算法中
q
(
z
)
q(z)
q(z)
是可以取到
P
(
z

x
)
P(z|x)
P(zx)
,从而令散度等于零不断的抬升下界进行极大似然估计,但是在VAE中由于
P
(
z

x
)
P(z|x)
P(zx)
是很难求的所以引入一个变量q(x)对其进行近似。

接下来进行公式的推导,由于在EM算法中已经推导出了ELBO+KL的形式,这里就直接拿来用:

log

P
(
x

θ
)
=

Z
q
(
z

x
)
log

P
(
x
,
z

θ
)
q
(
z

x
)
d
z
+
D
K
L
(
q
(
z

x
)

P
(
z

x
,
θ
)
)
\log P(\mathrm{x} \mid \theta)=\int_{Z} q(\mathrm{z}|\mathrm{x}) \log \frac{P(\mathrm{x}, \mathrm{z} \mid \theta)}{q(\mathrm{z}|\mathrm{x})} d \mathrm{z}+D_{K L}(q(\mathrm{z}|\mathrm{x}) \| P(\mathrm{z} \mid \mathrm{x}, \theta))
logP(xθ)=Zq(zx)logq(zx)P(x,zθ)dz+DKL(q(zx)P(zx,θ))

根据KL divergence的性质
D
K
L
(
q
(
z

x
)

P
(
z

x
,
θ
)
)

D_{K L}(q(\mathrm{z}|\mathrm{x}) \| P(\mathrm{z} \mid \mathrm{x}, \theta)) \geq 0
DKL(q(zx)P(zx,θ))0
当且仅当
q
(
z

x
)
=
P
(
z

x
,
θ
)
q(\mathrm{z}|\mathrm{x})=P(\mathrm{z} \mid \mathrm{x}, \theta)
q(zx)=P(zx,θ)
取等号,因此有


log

P
(
x

θ
)


z
q
(
z

x
)
log

P
(
x
,
z

θ
)
q
(
z

x
)
d
z
\log P(\mathrm{x} \mid \theta) \geq \int_{z} q(\mathrm{z}|\mathrm{x}) \log \frac{P(\mathrm{x}, \mathrm{z} \mid \theta)}{q(\mathrm{z}|\mathrm{x})} d \mathrm{z}
logP(xθ)zq(zx)logq(zx)P(x,zθ)dz

因此便得到了
log

P
(
X

θ
)
\log P(X \mid \theta)
logP(Xθ)
的一个下界称为Evidence Lower Bound (ELBO),简称
L
b
L_b
Lb
。最大化
L
b
L_b
Lb
就等价于最大化似然函数
L
L
L
。那么接下来具体看
L
b
L_b
Lb
:

L
b
=

z
q
(
z

x
)
log

P
(
z
,
x
)
q
(
z

x
)
d
z
=

z
q
(
z

x
)
log

(
P
(
z
)
q
(
z

x
)

P
(
x

z
)
)
d
z
=

z
q
(
z

x
)
log

P
(
z
)
q
(
z

x
)
d
z
+

z
q
(
z

x
)
log

P
(
x

z
)
d
z
=

D
K
L
(
q
(
z

x
)

P
(
z
)
)
+

z
q
(
z

x
)
log

P
(
x

z
)
d
z
=

D
K
L
(
q
(
z

x
)

P
(
z
)
)
+
E
q
(
z

x
)
[
log

P
(
x

z
)
]
\begin{aligned} \mathrm{L}_{\mathrm{b}} &=\int_{z} \mathrm{q}(\mathrm{z} \mid \mathrm{x}) \log \frac{\mathrm{P}(\mathrm{z}, \mathrm{x})}{\mathrm{q}(\mathrm{z} \mid \mathrm{x})} \mathrm{dz} \\ &=\int_{\mathrm{z}} \mathrm{q}(\mathrm{z} \mid \mathrm{x}) \log \left(\frac{\mathrm{P}(\mathrm{z})}{\mathrm{q}(\mathrm{z} \mid \mathrm{x})} \cdot \mathrm{P}(\mathrm{x} \mid \mathrm{z})\right) \mathrm{dz} \\ &=\int_{\mathrm{z}} \mathrm{q}(\mathrm{z} \mid \mathrm{x}) \log \frac{\mathrm{P}(\mathrm{z})}{\mathrm{q}(\mathrm{z} \mid \mathrm{x})} \mathrm{dz}+\int_{\mathrm{z}} \mathrm{q}(\mathrm{z} \mid \mathrm{x}) \log \mathrm{P}(\mathrm{x} \mid \mathrm{z}) \mathrm{dz} \\ &=-\mathrm{D}_{\mathrm{KL}}(\mathrm{q}(\mathrm{z} \mid \mathrm{x}) \| \mathrm{P}(\mathrm{z}))+\int_{\mathrm{z}} \mathrm{q}(\mathrm{z} \mid \mathrm{x}) \log \mathrm{P}(\mathrm{x} \mid \mathrm{z}) \mathrm{dz} \\ &=-\mathrm{D}_{\mathrm{KL}}(\mathrm{q}(\mathrm{z} \mid \mathrm{x}) \| \mathrm{P}(\mathrm{z}))+\mathrm{E}_{\mathrm{q}(\mathrm{z} \mid \mathrm{x})}[\log \mathrm{P}(\mathrm{x} \mid \mathrm{z})] \end{aligned}
Lb=zq(zx)logq(zx)P(z,x)dz=zq(zx)log(q(zx)P(z)P(xz))dz=zq(zx)logq(zx)P(z)dz+zq(zx)logP(xz)dz=DKL(q(zx)P(z))+zq(zx)logP(xz)dz=DKL(q(zx)P(z))+Eq(zx)[logP(xz)]

推导到这一步就会发现这种形式的公式是看VAE相关论文经常给出的形式。同时到了这一步也可以看出,最大化似然函数
L
L
L
就是最大化
L
b
L_b
Lb
,也即最小化

D
K
L
(
q
(
z

x
)

P
(
z
)
)
-\mathrm{D}_{\mathrm{KL}}(\mathrm{q}(\mathrm{z} \mid \mathrm{x}) \| \mathrm{P}(\mathrm{z}))
DKL(q(zx)P(z))
和最大化
E
q
(
z

x
)
[
log

P
(
x

z
)
]
\mathrm{E}_{\mathrm{q}(\mathrm{z} \mid \mathrm{x})}[\log \mathrm{P}(\mathrm{x} \mid \mathrm{z})]
Eq(zx)[logP(xz)]

  • 最小化

    D
    K
    L
    (
    q
    (
    z

    x
    )

    P
    (
    z
    )
    )
    -\mathrm{D}_{\mathrm{KL}}(\mathrm{q}(\mathrm{z} \mid \mathrm{x}) \| \mathrm{P}(\mathrm{z}))
    DKL(q(zx)P(z))
    ,使后验分布近似值
    q
    (
    z

    x
    )
    q(z|x)
    q(zx)
    接近先验分布
    P
    (
    z
    )
    P(z)
    P(z)
    。也就是说通过
    q
    (
    z

    x
    )
    q(z|x)
    q(zx)
    生成的编码
    z
    z
    z
    不能太离谱,要与某个分布相当才行,这里是对中间编码生成起了限制作用。当
    q
    (
    z

    x
    )
    q(z|x)
    q(zx)

    P
    (
    z
    )
    P(z)
    P(z)
    都是高斯分布时,推导式有(参考文献【4】中Appendix B):

    D
    K
    L
    (
    q
    (
    z

    x
    )

    P
    (
    z
    )
    )
    =

    1
    2

    j
    J
    (
    1
    +
    log

    (
    σ
    j
    )
    2

    (
    μ
    j
    )
    2

    (
    σ
    j
    )
    2
    )
    \mathrm{D}_{\mathrm{KL}}(\mathrm{q}(\mathrm{z} \mid \mathrm{x}) \| \mathrm{P}(\mathrm{z}))=-\frac{1}{2} \sum_{\mathrm{j}}^{\mathrm{J}}\left(1+\log \left(\sigma_{\mathrm{j}}\right)^{2}-\left(\mu_{\mathrm{j}}\right)^{2}-\left(\sigma_{\mathrm{j}}\right)^{2}\right)
    DKL(q(zx)P(z))=21jJ(1+log(σj)2(μj)2(σj)2)

    其中
    J
    J
    J
    表示向量
    z
    z
    z
    的总维度数,
    σ
    j
    \sigma_j
    σj

    μ
    j
    \mu_j
    μj
    表示
    q
    (
    z

    x
    )
    q(z|x)
    q(zx)
    输出的参数向量
    σ
    \sigma
    σ

    μ
    \mu
    μ
    的第
    j
    j
    j
    个元素。(这里的
    σ
    \sigma
    σ

    μ
    \mu
    μ
    等于前文中
    μ

    (
    x
    )
    \mu '(x)
    μ(x)

    σ

    (
    x
    )
    \sigma '(x)
    σ(x)
    .
  • 最大化
    E
    q
    (
    z

    x
    )
    [
    log

    P
    (
    x

    z
    )
    ]
    \mathrm{E}_{\mathrm{q}(\mathrm{z} \mid \mathrm{x})}[\log \mathrm{P}(\mathrm{x} \mid \mathrm{z})]
    Eq(zx)[logP(xz)]
    ,即在给定编码器输出
    q
    (
    z

    x
    )
    q(z|x)
    q(zx)
    下解码器输出
    P
    (
    x

    z
    )
    P(x|z)
    P(xz)
    越大越好。这部分也就相当于最小化Reconstruction Error(重建损失)

  由此我们可以得出VAE的原理图:
【深度学习】生成模型:VAE(自编码器)模型解析
通常忽略掉decoder输出的
σ
(
x
)
\sigma(x)
σ(x)
一项,仅要求
μ
(
x
)
\mu(x)
μ(x)

x
x
x
越接近越好。
对某一输入数据
x
x
x
来说,VAE的损失函数即(
L
b
L_b
Lb
取负号):

min

Loss

V
A
E
=
D
K
L
(
q
(
z

x
)

P
(
z
)
)

E
q
(
z

x
)
[
log

P
(
x

z
)
]
\min \operatorname{Loss}_{\mathrm{V} \mathrm{AE}}=\mathrm{D}_{\mathrm{KL}}(\mathrm{q}(\mathrm{z} \mid \mathrm{x}) \| \mathrm{P}(\mathrm{z}))-\mathrm{E}_{\mathrm{q}(\mathrm{z} \mid \mathrm{x})}[\log \mathrm{P}(\mathrm{x} \mid \mathrm{z})]
minLossVAE=DKL(q(zx)P(z))Eq(zx)[logP(xz)]

2.2 重参化技巧

  在前面VAE的介绍中样本经过Encoder生成了隐变量的一个分布
z

q
(
z

x
)
\mathrm{z} \sim \mathrm{q}(\mathrm{z} \mid \mathrm{x})
zq(zx)
,然后从这个分布中采样
z
z
z
进行Decoder,注意“采样”这个操作是不可微的,因此不能做反向传播,所以用reparameterization trick来解决这个问题,示意图如下:
【深度学习】生成模型:VAE(自编码器)模型解析
将上图左图原来的采样操作通过reparameterization trick变换为右图的形式。

我们引入一个外部向量
ϵ

N
(
,
I
)
ϵ∼N(0,I)
ϵN(0,I)
,通过
z
=
μ
+
σ

ϵ
z = μ + σ ⊙ ϵ
z=μ+σϵ
计算编码
z
z
z


\odot
表示element-wise乘法,
ϵ
\epsilon
ϵ
的每一维都服从标准高斯分布即
ϵ
i

\epsilon_i \sim
ϵi
N(0,1),由此loss的梯度可以通过
μ
\mu
μ

σ
\sigma
σ
分支传递到encoder model处(
ϵ
\epsilon
ϵ
并不需要梯度信息来更新)。

这里利用了这样一个事实[3]:考虑单变量高斯分布,假设
z

p
(
z

x
)
=
N
(
μ
,
σ
2
)
z∼p(z∣x)=N(μ,σ 2 )
zp(zx)=N(μ,σ2)
,从中采样一个
z
z
z
,就相当于先从
N
(
,
1
)
N(0,1)
N(0,1)
中采样一个
ϵ
\epsilon
ϵ
,再令
z
=
μ
+
σ

ϵ
z=\mu + \sigma \odot \epsilon
z=μ+σϵ

最终的VAE的形式如下:
【深度学习】生成模型:VAE(自编码器)模型解析

3 QA

3.1 生成体现在什么地方

3.2 AE和VAE的区别

  将把
x
x
x
表示为输入数据,把
z
z
z
表示为潜在变量(编码表示)。在普通的自编码器中,编码器将输入
x
x
x
转换为潜在变量
z
z
z
,而解码器将
z
z
z
转换为重构的输出。而在可变自编码器中,编码器将
x
x
x
转换为潜在变量
p
(
z

x
)
p(z|x)
p(zx)
的概率分布,然后对潜在变量
z
z
z
随机采样,再由解码器解码成重构输出。自编码器(确定性)和可变自编码器(概率性)的区别。

【深度学习】生成模型:VAE(自编码器)模型解析

4 另一种角度理解VAE

5 总结

  其实那么多数学公式推导,我自己都有点晕,但是本质上就是用自编码器去产生很多高斯分布,去拟合样本的分布,然后某个x对应的高斯分布里采样z,然后复原成x,跟GAN区别就是这个是完全去模仿分布,只能生成数据中已有的图片,很难创造新的图片,最多也就是插值图片了。

  也可以理解成图片的特征向量z采样于某种高斯分布,我们要把他给找出来,我们希望这个分布贴近标准正太分布,然后通过编码器生成对应均值和方差,然后采样z,希望z又能复原图片,这样就找到了这个z背后的高斯分布。这个高斯分布的均值就是最大概率生成特征z,可以复原图片,当然均值旁边采样出来的z可能可以复原的不是很像,但是也是在数据集里的,如果有2个图片的特征分布都在这个点有所重合的话,可能就是2个图片中间的插值图片了。

不足

VAE在产生新数据的时候是基于已有数据来做的,或者说是对已有数据进行某种组合而得到新数据的,它并不能生成或创造出新数据。另一方面是VAE产生的图像比较模糊。
而大名鼎鼎的GAN利用对抗学习的方式,既能生成新数据,也能产生较清晰的图像。后续的更是出现了很多种变形。

6 参考文献

[1]【深度学习】VAE(Variational Auto-Encoder)原理
[2]【干货】深入理解变分自编码器
[3]变分自编码器VAE:原来是这么一回事 | 附开源代码
[4]Auto-encoding variational bayes
[5]【机器学习】白板推导系列(三十二) ~ 变分自编码器(VAE)
[6]PyTorch实现VAE
[7]使用(VAE)生成建模,理解可变自动编码器背后的数学原理