Auto-Encoder:
注意:自编码器是一种数据压缩(降维)的方法!
自编码器能否生成新的图像?
自编码器结构的后半部分可以生成图片,因此我们将其单独提出来。
我们希望的事Decoder可以扮演一个Generator的身份。
在自编码器结构中,输入的隐变量来源于Encoder,这也是基于原始图片得到的向量,那么现在该输入什么样的变量就成为了一个问题。
因此,自编码器不能自主生成新的图像。
问题:既然Auto-Encoder可以重构原始的输入图像,那么如何生存新的图像呢?
答:在z中加入一定的随机因素。这样的一个随机因素通常服从高斯分布。
这样一个编码器,我们称之为变分自动编码器(Variational Autoencoders,VAE)。也就是说,VAE可以完成生成新的图像的功能。
变分自编码器是从一个分布中采样的,该过程确保了接近真实样本特征的输入特征可以通过解码器得到近似真实样本的样本。
VAE的其他优势
VAE在本质上肯定是学习如何构建隐藏层的,这也是它的特色之一。
我们假设编码器生成的分布是正态分布。之所以采用分布的形式表示,是因为可以很自然地表达潜在空间的全局正则化和局部正则化。
变分自动编码器
整体架构
两种解释:
- 假设潜在变量z服从某种先验分布(高斯分布)。模型训练完毕后,可以从这种先验分布中采样得到潜在变量,然后在解码器中得到新的样本。
- 在自动编码器基础上加入了随机因子。
变分自动编码器对Encoder增加了约束,强制其产生的隐含变量服从某种分布。
总的来说,编码过程将输入数据编码变成分布而不是一些点。
整体训练过程为:
- 将数据编码成分布;
- 从隐藏分布中采样数据点;
- 解码还原数据并计算重构损失;
- 将重构损失反向传播。
隐藏层部分
我们根据训练集(一个batch)得到样本均值和方差,假设其为正态分布。之后再从中采样,得到新的Z,我们根据这个结果生成新的X。
以上这个想法以及图片是存在问题的。
首先,我们无法得知得到的Z是否还与原来的X对应;其次,在这样的考量下,计算重构误差的意义何在?
在这样的想法当中,我们是假设Z的分布服从正态分布。实际上,这是有偏差的。我们应该假设分布 p ( Z ∣ X k ) p(Z|X_k) p(Z∣Xk)这样一个后验分布是正态分布,这个分布是专属于每一个样本的,目的是为了有一个对应关系,为后续计算重构误差提供便利和依据。下图才是,VAE的真实原理图:
那么我们如何找出专属于
X
k
X_k
Xk的均值和方差呢?
我们构建了均值神经网络和方差神经网络来计算出均值和方差。
于是,我们就完成了分布的构建。
值得一提的是,这样两个神经网络应该是各样本通用的。
其中
μ
k
=
f
1
(
X
k
)
\mu_k=f_1(X_k)
μk=f1(Xk),
log
σ
2
=
f
2
(
X
k
)
\log{\sigma^2}=f_2(X_k)
logσ2=f2(Xk)。
为什么要选择对数函数来表示方差呢?
这是因为
σ
2
\sigma^2
σ2非负数,这样还要加个激活函数才行。
分布标准化
但是在这训练过程中,还存在噪声的影响。毕竟这个Z不是像自编码器一样通过Encoder直接得到的。Z的条件概率分布和Z的分布还是可能存在一定偏差的。
为了让模型重构的好,这个网络肯定想要让方差变为0,也就是说,干脆找到一个让重构误差最小的值,不好吗?
可这样不就变成了普通的Auto Encoder了嘛???
为了防止模型退化,VAE强迫所有的分布都往标准正态分布靠拢。这就是我们正则化的关键点。
同时,向这一固定分布靠拢的好处在于保证了Z的条件概率和Z的先验分布相等或近似。
我感觉其实标不标准并不重要,只要固定的一个正态分布就行。
我们根据定义
p
(
Z
)
=
∑
X
p
(
Z
∣
X
)
p
(
X
)
=
∑
X
N
(
0
,
I
)
p
(
X
)
=
N
(
0
,
I
)
=
N
(
0
,
I
)
∑
X
p
(
X
)
=
N
(
0
,
I
)
p(Z)=\sum_Xp(Z|X)p(X)=\sum_XN(0,I)p(X)=N(0,I)=N(0,I)\sum_Xp(X)=N(0,I)
p(Z)=X∑p(Z∣X)p(X)=X∑N(0,I)p(X)=N(0,I)=N(0,I)X∑p(X)=N(0,I)
我们在重构误差的基础之上加入了正则化项,分别是:
均值损失
L
μ
k
=
∥
f
1
(
X
k
)
∥
2
L_{\mu_{k}}=\|f_1(X_k)\|^2
Lμk=∥f1(Xk)∥2
方差损失
L
σ
k
2
=
∥
f
2
(
X
k
)
∥
2
L_{\sigma_k^2}=\|f_2(X_k)\|^2
Lσk2=∥f2(Xk)∥2
达到 N ( 0 , I ) N(0,I) N(0,I)就是希望二者尽量接近0。因为方差采用的是对数表示,接近0,就还是方差接近1。
那么两个损失如何选择也是一个问题。论文采用的是KL散度。
L μ , σ 2 = − 1 2 ∑ i = 1 d ( μ ( i ) 2 + σ ( i ) 2 − log ( σ ( i ) 2 ) − 1 ) L_{\mu,\sigma^2}=-\frac{1}{2}\sum_{i=1}^{d}(\mu_{(i)}^2+\sigma_{(i)}^2-\log(\sigma_{(i)}^2)-1) Lμ,σ2=−21i=1∑d(μ(i)2+σ(i)2−log(σ(i)2)−1)
这鼓励了Encoder的输出分布 p ( Z ∣ X ) p(Z|X) p(Z∣X)均匀的分布在隐变量的先验空间。换句话说,约束项的目的在于后验概率接近先验概率,其中先验概率我们假设为标准正态分布。
KL散度
又称为相对熵,描述两个概率分布P和Q差异的一种方法。
D
(
P
∣
∣
Q
)
D(P||Q)
D(P∣∣Q)表示当用概率分布Q来拟合真实分布P产生的信息损耗。P表示真实分布,Q表示P的拟合分布。
注意:KL散度不满足距离的概念,首先,它不是对称的;其次,它不满足三角不等式。
离散型随机变量:
D
(
P
∣
∣
Q
)
=
∑
i
∈
X
P
(
i
)
∗
log
(
P
(
i
)
Q
(
i
)
)
D(P||Q)=\sum_{i\in X}P(i)*\log(\frac{P(i)}{Q(i)})
D(P∣∣Q)=i∈X∑P(i)∗log(Q(i)P(i))
连续型随机变量:
D
(
P
∣
∣
Q
)
=
⎰
X
P
(
i
)
∗
log
(
P
(
i
)
Q
(
i
)
)
d
x
D(P||Q)=\lmoustache_{X}P(i)*\log(\frac{P(i)}{Q(i)})dx
D(P∣∣Q)=⎰XP(i)∗log(Q(i)P(i))dx
问题
Sampling layer无法向后传递梯度
因为这个Z是随机采样的得到的。
解决方案:再参数化(Reparameterization Trick)
我们基于事实:
从
N
(
μ
,
σ
2
)
N(\mu,\sigma^2)
N(μ,σ2)中采样一个Z,相当于从
N
(
0
,
I
)
N(0,I)
N(0,I)中采样一个
ε
\varepsilon
ε,然后让
Z
=
μ
+
ε
∗
σ
Z=\mu+\varepsilon*\sigma
Z=μ+ε∗σ。
所以我们变换采样的操作,从而,采样操作不参与梯度下降,改为采样结果参与。
应用
我们从先验分布Z中抽取各种各样的数据就可以得到相应的图像。这相当于从一张图片扩展出了不同的样貌。我们可以以此进行修复与生成新的相关图片。
如何理解呢?
我们在训练时,基于Decoder的内容比较多,所以说Decoder的接受范围广,对输入的大部分向量都有不错的反馈。这是Auto-Encoder所做不到的。
这也是为什么,GAN需要VAE辅助的原因。
Disentangled VAE
待补充。