本文参考链接
自动编码器原理:
由编码器和解码器组成,编码器和解码器通常是神经网络模型。
输入的数据经过神经网络降维到一个编码,再通过一个神经网络去解码得到一个与输入原始数据一模一样的生成数据,然后通过比较这两个数据去最小化它们之间的差异来训练编码器和解码器的参数。
变分自动编码器VAE:
在自动编码器中需要输入一张图片,然后将图片编码之后得到隐含向量,隐含向量解码得到与原始图片对应的照片。
变分自动编码器可以自己去构造隐藏向量,生成任意图片,只需要给它一个标准正态分布的随机隐含向量,通过解码器就能够生成想要的图片,而不需要给它一个原始的图片。实际情况中需要在准确率与隐含向量服从标准正态分布之间去做一个权衡。KL divergence可以用来权衡两者分布的相似程度。越小表示两种概率分布越接近。
生成对抗网络GAN:
1.概念:
Gan主要包含两个部分,一部分是生成器generator,一部分是判别器discriminator。生成器主要用来学习真实图像分布,从而让自身生成的图像更加真实,以骗过判别器。而判别器则是对接收的图片进行真假判别。
整个过程就是生成器生成的图片越来越真实,判别器判别真实图片的性能更加准确,随着时间的推移,两个模型达到一种平衡。生成器生成的图片接近于真实图片,判别器识别不出来真假图片,对给定的图像的预测为真的概率接近0.5.
2.原理
(1)损失函数:
损失函数实际上是一个交叉熵,判别器的目的是尽可能的令D(x)接近1,令D(G(z))接近0,所以D主要是最大化上面的损失函数,G恰恰相反,主要是最小化上述损失函数。
上述D最大化和G最小化的原因分析:
·D意图是让D(x)变大,让D(G(z))变小。而由于D(x)是一个概率,概率最大为1。D(X)越接近1,则 logD(x)越大,D(G(z))越接近0,则1-D(G(z))越大,则 log(1-D(G(z)))越大,因此整个式子越大.
·G意图是让D(G(z))变大。同样因为是概率,若D(G(z))越大,则1-D(G(z))越小,log(1-D(G(z)))越小,因此整个式子越小。
(2)求平衡点:
先做假设,即G固定情况下,D的最优形式,然后根据D的最优形式再去观察G最小化损失函数的问题。
步骤一:
假设在G固定的条件下,将损失函数化为如下形式:
L
=
a
l
o
g
(
y
)
+
b
l
o
g
(
1
−
y
)
L=alog(y)+blog(1-y)
L=alog(y)+blog(1−y)
D的目标是最大化L,因此我们可以通过对上述的L求导,令导数为0,计算出L取最大值时y的取值,计算出的结果如下:
y
∗
=
a
a
+
b
y ^* = \frac{a}{a+b}
y∗=a+ba
所以,将a和b换成原来损失函数中的值后,最优解形式为:
D
G
∗
(
x
)
=
p
d
a
t
a
(
x
)
p
d
a
t
a
(
x
)
+
p
g
(
x
)
D^* _G (x) = \frac{p_{data}(x)}{p_{data}(x)+p_g(x)}
DG∗(x)=pdata(x)+pg(x)pdata(x)
即当G固定时,D的最优形式如上式,其中pdata(x)是真实数据x的分布,pg(x)是生成样本的分布,即G(z)的分布。
步骤二:求当D最优时,G最小化损失函数到什么形式才能达到二者相互博弈的平衡点
将步骤一中得到的D最优形式代入原损失函数中,得到如下形式:
这时观察到,上面式子仍然是一个交叉熵也称KL散度的形式,KL散度通常用来衡量分布之间的距离,它是非对称的。同样还有另一个衡量数据分布距离的散度–JS散度,他们之间有如下关系
KL散度公式如下:
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) q ( x i ) ) D_{KL}(p||q)=\sum_{i=1}^n p(x_i) log \left( \frac{p(x_i)}{q(x_i)} \right) DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))
这时观察到,上面式子仍然是一个交叉熵也称KL散度的形式,KL散度通常用来衡量分布之间的距离,它是非对称的。同样还有另一个衡量数据分布距离的散度–JS散度,他们之间有如下关系。
J
S
(
P
1
∣
∣
P
2
)
=
1
2
K
L
(
P
1
∣
∣
P
1
+
P
2
2
)
+
1
2
K
L
(
P
2
∣
∣
P
1
+
P
2
2
)
JS(P_1 || P_2)=\frac{1}{2}KL(P_1 || \frac{P_1 + P_2}{2})+\frac{1}{2}KL(P_2 || \frac{P_1 + P_2}{2})
JS(P1∣∣P2)=21KL(P1∣∣2P1+P2)+21KL(P2∣∣2P1+P2)
不过JS散度有一个很重要的性质就是总是大于等于0的,当且仅当 P1=P2上面的式子取得最小值0,
所以可以将C(G)写成JS散度的形式:
C
(
G
)
=
−
l
o
g
(
4
)
+
K
L
(
P
d
a
t
a
∣
∣
P
d
a
t
a
+
P
g
2
)
+
K
L
(
P
g
∣
∣
P
d
a
t
a
+
P
g
2
)
C(G)=-log(4) + KL \left(P_{data} || \frac{P_{data} + P_g}{2}\right) + KL \left(P_g || \frac{P_{data} + P_g}{2}\right)
C(G)=−log(4)+KL(Pdata∣∣2Pdata+Pg)+KL(Pg∣∣2Pdata+Pg)
结论:也即是当且仅当Pg=Pdata时,C(G)取得最小值-log(4),也即是D最优时,G能将损失函数最小化到-log(4),最小点处Pg=Pdata。即真实数据的分布和生成数据的分布相等。
Pg=Pdata意味着此时D恰好等于0.5,就是D有一半的概率认为D(G(z))是真的数据,有一半概率认为是假的数据,这不就和猜硬币正反面一样嘛。也说明了此时G生成的数据足以以假乱真。