本文是在阅读苏剑林大佬和网上其他一些讲解之后做的总结,所以有一点对VAE的了解看本文会比较容易。
苏大佬的三部曲:
变分自编码器(一):原来是这么一回事
变分自编码器(二):从贝叶斯观点出发
变分自编码器(三):这样做为什么能成?
自编码器与变分自编码器
在我理解看来,自编码器是一种学习数据特征的网络结构,由编码器、隐层表示和解码器三部分组成。假设有一组数据 X = ( x 1 , x 2 , , , , x n ) X=(x_{1}, x_{2},,,,x_{n}) X=(x1,x2,,,,xn),现在想学习到 X X X的数据特征,应该怎么做呢?编码器将输入数据 x i x_{i} xi编码成隐层表示 h i h_{i} hi(向量),然后解码器通过隐层表示将数据恢复出来记为 x i ^ \hat{x_{i}} xi^,通过距离函数 D ( x i , x i ^ ) D(x_{i},\hat{x_{i}}) D(xi,xi^)衡量二者的误差。
下面用kreas实现一个简单的自编码器。
input_size= 784
hidden_size= 64
output_size= 784
x= Input(shape=(input_size,))
# Encoder
h= Dense(hidden_size, activation='relu')(x)
# Decoder
r= Dense(output_size, activation='sigmoid')(h)
autoencoder= Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')
可以看到 ,自编码器学习到的是数据特征的向量表示
h
i
h_{i}
hi,
h
i
h_{i}
hi的每个维度就表示了学习到的数据的属性,也就是自编码器将数据的每个维度的特征表示成为单个的值了。
变分自编码器是用概率分布来描述数据特征,变分自编码器将学习到
h
i
h_{i}
hi的每一个维度所表示特征的概率分布,也就是每一个维度的取值是一个范围,而不在是一个单个的值了。这样做的好处也是显而易见的,如果我们将自编码器看做生成模型,也就是我们希望用到解码器的输出,对于普通的自编码器,输入一张照片
x
i
x_{i}
xi,学习到其特征向量表示
h
i
h_{i}
hi,解码器根据
h
i
h_{i}
hi只能重构出一张照片。而对于变分自编码器来说,输入一张照片
x
i
x_{i}
xi,学习到其特征概率分布
h
i
h_{i}
hi,解码器根据
h
i
h_{i}
hi可以取不同的值重构出不同的照片,但是这些照片都是根据相同的特征重构出来的,所以应该是很相似的。
下面将整理两种不同的推导方式,第一种是论文中的推导方式,第二种是苏大佬的推导方式。
VAE的理论推导(一)
假定数据都是独立同分布的,
X
=
(
x
1
,
x
2
,
,
,
x
n
)
X = (x^{1}, x^{2},,,x^{n})
X=(x1,x2,,,xn),
X
X
X服从的分布的参数是
θ
\theta
θ,这里将每个样本的编号标在了右上角。
VAE的原理还是最大化似然函数来求解未知参数的,所以首先要写出未知参数的似然函数。VAE的概率图模型如上图所示,实线是生成过程,虚线是训练过程。对于单个样本
x
i
x^{i}
xi,其对数似然边缘概率函数(暂时就这样命名了)就是
l
o
g
p
θ
(
x
i
)
=
∫
p
θ
(
x
i
∣
z
)
p
θ
(
z
)
d
z
(1)
\tag{1} logp_{\theta}(x^{i}) = \int p_{\theta}(x^{i}|z)p_{\theta}(z)dz
logpθ(xi)=∫pθ(xi∣z)pθ(z)dz(1)
其中
z
z
z是隐变量的空间,我们最后就是要通过学到的
z
来
生
成
x
z来生成x
z来生成x。
VAE用识别模型
q
φ
(
z
∣
x
i
)
q_{\varphi}(z|x^{i})
qφ(z∣xi)去逼近真实的后验概率分布
p
θ
(
z
∣
x
i
)
p_{\theta}(z|x^{i})
pθ(z∣xi),用
K
L
KL
KL
散度来衡量二者的距离,即
K
L
(
q
φ
(
z
∣
x
i
)
∣
∣
p
θ
(
z
∣
x
i
)
)
=
E
q
φ
(
z
∣
x
i
)
[
l
o
g
q
φ
(
z
∣
x
i
)
p
θ
(
z
∣
x
i
)
]
=
E
q
φ
(
z
∣
x
i
)
[
l
o
g
q
φ
(
z
∣
x
i
)
p
θ
(
x
i
)
p
θ
(
z
∣
x
i
)
p
θ
(
x
i
)
]
=
E
q
φ
(
z
∣
x
i
)
[
l
o
g
q
φ
(
z
∣
x
i
)
p
θ
(
z
,
x
i
)
]
+
E
q
φ
(
z
∣
x
i
)
[
l
o
g
p
θ
(
x
i
)
]
=
E
q
φ
(
z
∣
x
i
)
[
l
o
g
q
φ
(
z
∣
x
i
)
p
θ
(
z
,
x
i
)
]
+
l
o
g
p
θ
(
x
i
)
(2)
\begin{aligned} \tag{2}KL(q_{\varphi}(z|x^{i}) || p_{\theta}(z|x^{i})) = & E_{q_{\varphi}(z|x^{i})}[log{q_{\varphi}(z|x^{i}) \over p_{\theta}(z|x^{i})}] \\ =& E_{q_{\varphi}(z|x^{i})}[log{q_{\varphi}(z|x^{i})p_{\theta}(x^i) \over p_{\theta}(z|x^{i})p_{\theta}(x^i)}] \\ = &E_{q_{\varphi}(z|x^{i})}[log{q_{\varphi}(z|x^{i}) \over p_{\theta}(z, x^{i})}] + E_{q_{\varphi}(z|x^{i})}[logp_{\theta}(x^{i})] \\ = & E_{q_{\varphi}(z|x^{i})}[log{q_{\varphi}(z|x^{i}) \over p_{\theta}(z, x^{i})}] + logp_{\theta}(x^{i}) \end{aligned}
KL(qφ(z∣xi)∣∣pθ(z∣xi))====Eqφ(z∣xi)[logpθ(z∣xi)qφ(z∣xi)]Eqφ(z∣xi)[logpθ(z∣xi)pθ(xi)qφ(z∣xi)pθ(xi)]Eqφ(z∣xi)[logpθ(z,xi)qφ(z∣xi)]+Eqφ(z∣xi)[logpθ(xi)]Eqφ(z∣xi)[logpθ(z,xi)qφ(z∣xi)]+logpθ(xi)(2)
(2)式第3行到第4行是因为从
q
φ
(
z
∣
x
i
)
q_{\varphi}(z|x^i)
qφ(z∣xi)采样
z
z
z之后就与
x
x
x无关了,所以
E
q
φ
(
z
∣
x
i
)
[
l
o
g
p
θ
(
x
i
)
]
=
∫
l
o
g
p
θ
(
x
i
)
q
φ
(
z
∣
x
i
)
d
z
=
l
o
g
p
θ
(
x
i
)
E_{q_{\varphi}(z|x^{i})}[logp_{\theta}(x^{i})]=\int logp_{\theta}(x^i)q_{\varphi}(z|x^i)dz = logp_{\theta}(x^{i})
Eqφ(z∣xi)[logpθ(xi)]=∫logpθ(xi)qφ(z∣xi)dz=logpθ(xi)
由(2)式可以得到,
l
o
g
p
θ
(
x
i
)
=
K
L
(
q
φ
(
z
∣
x
i
)
∣
∣
p
θ
(
z
∣
x
i
)
)
+
L
(
φ
,
θ
,
x
i
)
(3)
\tag{3} logp_{\theta}(x^{i}) = KL(q_{\varphi}(z|x^{i})|| p_{\theta}(z|x^{i}))+L(\varphi,\theta,x^{i})
logpθ(xi)=KL(qφ(z∣xi)∣∣pθ(z∣xi))+L(φ,θ,xi)(3)
其中
L
(
φ
,
θ
,
x
i
)
=
−
E
q
φ
(
z
∣
x
i
)
[
l
o
g
q
φ
(
z
∣
x
i
)
p
θ
(
z
,
x
i
)
]
=
E
q
φ
(
z
∣
x
i
)
[
l
o
g
p
θ
(
x
i
∣
z
)
p
θ
(
z
)
q
φ
(
z
∣
x
i
)
]
=
E
q
φ
(
z
∣
x
i
)
[
l
o
g
p
θ
(
x
i
∣
z
)
]
−
K
L
(
q
φ
(
z
∣
x
i
)
∣
∣
p
θ
(
z
)
)
)
(4)
\begin{aligned} \tag{4}L(\varphi,\theta,x^{i}) = &-E_{q_{\varphi}(z|x^{i})}[log{q_{\varphi}(z|x^{i}) \over p_{\theta}(z, x^{i})}] \\ = & E_{q_{\varphi}(z|x^{i})}[log{p_{\theta}(x^{i}|z)p_{\theta}(z) \over q_{\varphi}(z|x^{i})}] \\ = & E_{q_{\varphi}(z|x^{i})}[logp_{\theta}(x^{i}|z)] - KL(q_{\varphi}(z|x^{i})||p_{\theta}(z))) \end{aligned}
L(φ,θ,xi)===−Eqφ(z∣xi)[logpθ(z,xi)qφ(z∣xi)]Eqφ(z∣xi)[logqφ(z∣xi)pθ(xi∣z)pθ(z)]Eqφ(z∣xi)[logpθ(xi∣z)]−KL(qφ(z∣xi)∣∣pθ(z)))(4)
根据(3)式我们得到了似然函数的另一种表达方式,由于(3)式中的KL散度是非负数,所以
L
(
φ
,
θ
,
x
i
)
L(\varphi,\theta,x^{i})
L(φ,θ,xi)是
l
o
g
p
θ
(
x
i
)
logp_{\theta}(x^{i})
logpθ(xi)的下界,那么最大化
l
o
g
p
θ
(
x
i
)
logp_{\theta}(x^i)
logpθ(xi)就可以转化为最大化
L
(
φ
,
θ
,
x
i
)
L(\varphi,\theta,x^{i})
L(φ,θ,xi)。
(4)式的另外一种推到方法(用到了jensen不等式):
l
o
g
p
θ
(
x
)
=
l
o
g
∫
z
p
θ
(
x
,
z
)
d
z
=
l
o
g
∫
z
q
φ
(
z
∣
x
)
p
θ
(
x
,
z
)
q
φ
(
z
∣
x
)
d
z
=
l
o
g
E
q
φ
(
z
∣
x
)
[
p
θ
(
x
,
z
)
q
φ
(
z
∣
x
)
]
≥
E
q
φ
(
z
∣
x
)
[
l
o
g
p
θ
(
x
,
z
)
q
φ
(
z
∣
x
)
]
E
L
B
O
=
E
q
φ
(
z
∣
x
)
[
l
o
g
p
θ
(
x
,
z
)
q
φ
(
z
∣
x
)
]
=
E
q
φ
(
z
∣
x
)
[
l
o
g
p
θ
(
z
)
p
θ
(
x
∣
z
)
q
φ
(
z
∣
x
)
]
=
E
q
φ
(
z
∣
x
)
[
l
o
g
p
θ
(
x
∣
z
)
]
−
K
L
[
q
φ
(
z
∣
x
)
∣
∣
p
θ
(
z
)
]
\begin{aligned} logp_{\theta}(x) = & log \int_{z}p_{\theta}(x, z)dz \\ = & log \int_{z} {q_{\varphi}(z|x)p_{\theta}(x,z) \over q_{\varphi}(z|x)}dz \\ = & log E_{q_{\varphi}(z|x)}[{p_{\theta}(x, z) \over q_{\varphi}(z|x) }] \\ \ge & E_{q_{\varphi}(z|x)}[log{p_{\theta}(x, z) \over q_{\varphi}(z|x) }] \\ ELBO = & E_{q_{\varphi}(z|x)}[log{p_{\theta}(x, z) \over q_{\varphi}(z|x) }] \\ = & E_{q_{\varphi}(z|x)}[log{p_{\theta}(z)p_{\theta}(x|z) \over q_{\varphi}(z|x)}] \\ = & E_{q_{\varphi}(z|x)}[logp_{\theta}(x|z)] - KL[q_{\varphi}(z|x)||p_{\theta}(z)] \end{aligned}
logpθ(x)===≥ELBO===log∫zpθ(x,z)dzlog∫zqφ(z∣x)qφ(z∣x)pθ(x,z)dzlogEqφ(z∣x)[qφ(z∣x)pθ(x,z)]Eqφ(z∣x)[logqφ(z∣x)pθ(x,z)]Eqφ(z∣x)[logqφ(z∣x)pθ(x,z)]Eqφ(z∣x)[logqφ(z∣x)pθ(z)pθ(x∣z)]Eqφ(z∣x)[logpθ(x∣z)]−KL[qφ(z∣x)∣∣pθ(z)]
所以(4)式就是最后的损失函数。对于(4)式中的第一项,我们可以用蒙特卡洛模拟的方法,从
q
φ
(
z
∣
x
i
)
q_{\varphi}(z|x^{i})
qφ(z∣xi)中依据z的概率分布采样L个点,即
E
q
φ
(
z
∣
x
i
)
[
l
o
g
p
θ
(
x
i
∣
z
)
]
≈
1
L
∑
l
=
1
L
l
o
g
p
θ
(
x
i
∣
z
i
,
l
)
(5)
\tag{5}E_{q_{\varphi}(z|x^{i})}[logp_{\theta}(x^{i}|z)] \approx {1 \over L}\sum_{l =1}^{L}logp_{\theta}(x^{i}|z^{i,l})
Eqφ(z∣xi)[logpθ(xi∣z)]≈L1l=1∑Llogpθ(xi∣zi,l)(5)
这样通过采样貌似可以,但是我们还要通过采样来反向梯度优化
φ
\varphi
φ,这样采样之后
E
q
φ
(
z
∣
x
i
)
[
l
o
g
p
θ
(
x
i
∣
z
)
]
E_{q_{\varphi}(z|x^{i})}[logp_{\theta}(x^{i}|z)]
Eqφ(z∣xi)[logpθ(xi∣z)]就与
φ
\varphi
φ无关了,因此这个操作是不可导的,就需要重参数化技巧来使采样操作可导。我们假设
z
i
,
l
=
g
φ
(
x
i
,
ε
i
,
l
)
,
ε
i
,
l
∼
p
(
ε
)
z^{i,l} = g_{\varphi}(x^{i}, \varepsilon^{i,l}),\varepsilon^{i,l} \sim p(\varepsilon)
zi,l=gφ(xi,εi,l),εi,l∼p(ε),其中
p
(
ε
)
和
g
φ
p(\varepsilon)和g_{\varphi}
p(ε)和gφ都是形式已知的。这样(5)式对
φ
\varphi
φ就可导了,因为
g
φ
g_{\varphi}
gφ中含有参数
φ
\varphi
φ。
所以(4)式可进一步写成
L
(
φ
,
θ
,
x
i
)
=
1
L
∑
l
=
1
L
l
o
g
p
θ
(
x
i
∣
z
i
,
l
)
−
K
L
(
q
φ
(
z
∣
x
i
)
∣
∣
p
θ
(
z
)
)
(6)
\tag{6}L(\varphi,\theta,x^{i}) = {1 \over L}\sum_{l =1}^{L}logp_{\theta}(x^{i}|z^{i,l}) - KL(q_{\varphi}(z|x^{i})||p_{\theta}(z))
L(φ,θ,xi)=L1l=1∑Llogpθ(xi∣zi,l)−KL(qφ(z∣xi)∣∣pθ(z))(6)
其中
z
i
,
l
=
g
φ
(
x
i
,
ε
i
,
l
)
,
ε
i
,
l
∼
p
(
ε
)
z^{i,l} = g_{\varphi}(x^{i}, \varepsilon^{i,l}),\varepsilon^{i,l} \sim p(\varepsilon)
zi,l=gφ(xi,εi,l),εi,l∼p(ε)。也可以发现采样操作只用来计算(4)式中的第一项。
这里再讲解一下为什么采样操作不可导,我们可以反向思考一下,什么样的操作是可导的?
我们想要通过梯度来反向传播优化参数的话,那么在进行了这个操作之后,参数应该还是在表达式中的,比如我们从一个分布 q ( x ∣ θ ) q(x|\theta) q(x∣θ)中采样一个值,采样之后得到了一个确定性是值 x i x_i xi,而分布的参数 θ \theta θ就没有出现在表达式中了,所以后续无法通过梯度反向优化 θ \theta θ。下图是VAE的模型图,左图没有用重参数化技巧,右图用了重参数化技巧。
红色框表示采样操作,是不可导的,蓝色框表示损失,我们期望的是,重构损失 ∣ ∣ X − f ( z ) ∣ ∣ 2 ||X-f(z)||^2 ∣∣X−f(z)∣∣2和KL损失都可以反向梯度传播来优化参数 μ ( X ) , Σ ( X ) \mu(X), \Sigma(X) μ(X),Σ(X),但是在左图中, ∣ ∣ X − f ( z ) ∣ ∣ 2 ||X-f(z)||^2 ∣∣X−f(z)∣∣2的损失反向传播到红色框就断了,无法继续优化 μ ( X ) , Σ ( X ) \mu(X), \Sigma(X) μ(X),Σ(X),而在右图中,使用重参数化技巧,将采样操作移到网络外面,两项损失的梯度都可以反向传播过来。
下面开始计算。
现在在(6)式中,
p
θ
(
z
)
,
q
φ
(
z
∣
x
i
)
,
p
θ
(
x
i
∣
z
)
,
g
φ
(
x
i
,
ε
i
,
l
)
,
p
(
ε
)
p_{\theta}(z),q_{\varphi}(z|x^{i}),p_{\theta}(x^{i}|z),g_{\varphi}(x^{i}, \varepsilon^{i,l}),p(\varepsilon)
pθ(z),qφ(z∣xi),pθ(xi∣z),gφ(xi,εi,l),p(ε)都是未知的,只有给定他们才能启动算法。
在VAE中,一般假设
p
(
ε
)
=
N
(
ε
;
0
,
I
)
g
φ
(
ε
l
,
x
i
)
=
μ
i
+
σ
i
⊙
ε
l
p
θ
(
z
)
=
N
(
z
;
0
,
I
)
q
φ
(
z
∣
x
i
)
=
N
(
z
;
μ
i
,
σ
2
(
i
)
I
)
p
θ
(
x
i
∣
z
)
=
N
(
x
i
;
μ
′
i
,
σ
′
2
(
i
)
I
)
p(\varepsilon) = N(\varepsilon;0, I) \\ g_{\varphi}(\varepsilon^{l}, x^{i}) = \mu^{i} + \sigma^{i}\odot\varepsilon^{l} \\ p_{\theta}(z) = N(z;0, I)\\ q_{\varphi}(z|x^{i})= N(z;\mu^{i},\sigma^{2(i)}I) \\ p_{\theta}(x^{i}|z)= N(x^{i};\mu'^{i},\sigma'^{2(i)}I)
p(ε)=N(ε;0,I)gφ(εl,xi)=μi+σi⊙εlpθ(z)=N(z;0,I)qφ(z∣xi)=N(z;μi,σ2(i)I)pθ(xi∣z)=N(xi;μ′i,σ′2(i)I)
在论文中,作者使用多层感知机(MLP)来拟合
q
φ
(
z
∣
x
)
和
p
θ
(
x
∣
z
)
q_{\varphi}(z|x)和p_{\theta}(x|z)
qφ(z∣x)和pθ(x∣z)
上式中的第一项是一般的正态分布与标准正态分布的KL散度,可以推导出来,具体推导细节可以看变分自编码器(一):原来是这么一回事
在实现时,一般取
L
L
L为1就可以了,也就是采样一个点就够了。
下图是VAE训练时的网络结构
下图是用decoder生成时的网络结构
VAE理论推导(二)
这种方式是苏大佬的推导方式,与原论文的推导方式略有不同。具体是从一开始优化目标就不同。
苏大佬是找到一个
x
和
z
x和z
x和z的联和概率分布
q
(
x
,
z
)
q(x, z)
q(x,z),用
q
(
x
,
z
)
q(x,z)
q(x,z)来近似真实的联合概率分布
p
(
x
,
z
)
p(x,z)
p(x,z)
首先定义,
p
(
x
,
z
)
=
p
(
x
)
^
p
(
z
∣
x
)
p(x,z) = \hat{p(x)}p(z|x)
p(x,z)=p(x)^p(z∣x)
方法二与方法一只是符号不同而已,本质还是相同的,关于方法二的很多细节,可以看苏大佬的博客,在本文开头已给出链接。
参考:变分自编码器(VAEs)