GAN是当今作为火热的生成式算法,由Ian Goodfellow,Yoshua Bengio等人在2014年提出的,Yan LeCun表示道GAN是“adversarial training is the coolest thing since sliced bread”。它使用两个神经网络,将一个神经网络与另一个神经网络进行对抗,通过GAN我们可以生成足以以假乱真的图像,GAN被广泛的应用在图像生成,语音生成等场景中。例如经典的换脸应用DeepFakes背后的技术便是GAN.
(一个神经网咯与另一个神经网络进行对抗)
在了解GAN之前,我们有必要先了解什么是判别式算法和生成式算法。判别式算法是指给定实例的一些特征,我们根据这些特征来判断器所属类别,它建模时特征和标签之间的关系。例如在MNIST数据集上,我们需要判断一个图片是哪一个数字,我们可以用后验概率来建模判别算法。假定一个数据特征是
x
x
x,它的标签是
y
y
y,判别算法指的是在给定
x
x
x的前提下,标签是
y
y
y的概率。
表示为
P
(
y
∣
x
)
P(y|x)
P(y∣x),生成算法并不关系数据标签是什么,其关系的是能否生成和数据
x
x
x同一个分布的特征。
GAN是一个由两个模型组成的系统:判别器( D D D )和生成器( G G G )。判别器的任务是判断输入图像是源自数据集中还是由机器生成的。判别器一般使用二分类的神经网络来构建,一般将取自数据集的样本视为正样本,而生成的样本标注为负样本。生成器的任务是接收随机噪声,然后使用反卷积网络来创建一个图像。生成器的随机输入可以看做一个种子,相同的种子会得到相同的生成图像,不同的种子则得到的图像不同,大量种子的作用是保证生成图像的多样性。在最原始的GAN论文中,它都是使用了MLP搭建生成模型和判别模型。
GAN的双系统,目的是让生成器尽量的去迷惑判别器。同时,让判别器尽可能的对输入图像的来源进行判断。两个模型之间是互相对抗的关系,它们都通过试图击败对方来使自己变得更好,生成器可以通过判别器得到其生成的图像和数据集图像分布是否一致的反馈。而判别模型则可以通过生成器得到更多的训练样本。
GAN生成器和判别器可以通过博弈的手段不断的对两个模型进行迭代优化。其基本流程如下:
这里只所以先循环多次优化判别器,在优化生成器,是因为,我们想要先拥有一个有一定效果得判别器。其能够比较正确得区分真实样本和生成样本,这样,我们才能够根据判别函数得反馈来对生成器进行优化。如图2所示:
GAN在训练过程中判别器和生成器的分布变化。
图2中的黑色虚线是真实样本的分布情况,绿色实线是生成样本的分布,蓝色虚线是判别器判别概率的分布情况。 是噪声, 到 的变化是生成器将噪音数据映射到生成数据的过程。从图2中可以看出,(a)是出于初始状态,此时生成样本和真实样本的差距比较大,而且判别器也不能对它们进行很好的区分,因此我们需要先对判别器进行优化。在对判别器优化了若干个Epoch后,来到了(b)状态,此时判别器已能够很好的区分真实样本和生成样本。此时生成样本和真实样本的分布差异还是非常明显的,因此我们需要对生成器进行优化。经过训练后真实样本和生成样本的差异缩小了很多,也就是状态©。经过若干轮的对判别器很生成器的训练后,我们希望生成样本和真实样本的分布已经完全一致,而此时判别器也无法再区分它们了。
GAN的一个难点是其损失函数以及其背后的数学原理,对于这一部分内容中介绍的并不是非常清楚,现在很多技术在推导论文公式时,其都犯了一个重要的错误,即假设生成器
G
G
G是可逆的,然而这个假设并不成立,因此,其证明是存在漏洞的,我们这里将给出GAN的正确证明方式。
GAN的目标是让生成器生成足以欺骗判别式的样本,从数学角度将,我们希望生成样本与真实样本拥有相同的概率分布。也可以说生成样本和真实样本拥有相同的密度函数,即:
P
G
(
x
)
=
p
d
a
t
a
(
x
)
P_{G}(x) = p_{data}(x)
PG(x)=pdata(x).
这个结论很重要,因为其是GAN的理论基础,也是我们之后要讨论的GAN的证明策略,即定义了一个优化问题。我们寻找一个
G
G
G满足
P
G
(
x
)
=
P
d
a
t
a
(
x
)
P_{G}(x) = P_{data}(x)
PG(x)=Pdata(x),如果我们知道生成样本是否满足这个关系,那么我们便可以使用
S
G
D
SGD
SGD对
G
G
G进行优化。
GAN的损失函数源自于二分类对数似然函数的交叉熵损失函数,其表示为式3,其中第一项作用是用来使正样本识别结果尽量为
1
1
1,第二项的作用是使得负样本的预测尽量为0
L
=
−
1
N
i
[
y
i
l
o
g
p
i
+
(
1
−
y
i
)
]
l
o
g
(
1
−
p
i
)
L =-\frac{1}{N_i}[y_ilogp_i + (1 - y_i)]log(1 - p_i)
L=−Ni1[yilogpi+(1−yi)]log(1−pi)
根据前面介绍的GAN定理,首先,我们要求判别器D能够满足
p
d
a
t
a
(
x
)
p_{data}(x)
pdata(x)能够满足分布的样本识别为正样本,因此有上式为:
其中
E
E
E表示期望,这一项取自于对数似然函数正类,最大化这一项能偶使判别器将真实样本
x
x
x预测为1,
即
x
P
d
a
t
a
(
x
)
x ~ P_{data}(x)
x Pdata(x)时,我们有
D
(
x
)
=
1
D(x) = 1
D(x)=1
损失函数是另一项与生成器有关的,这一项来自于对数似然函数的负类,表示式子为5.,通过最大化5式子,我们可以使用
D
(
G
(
z
)
)
D(G(z))
D(G(z))的值趋近于0,也就是希望判别式能够将生成式样本预测为负类
判别器优化目标便是最大化两项之和,表示为
V
(
G
,
D
)
V(G,D)
V(G,D),因为,我们有:
为证明GAN最终收敛的结果是我们需要的,我们必须证明 G A N GAN GAN满足两个性质:
GAN是深度学习领域最主要的生成模型之一,GAN对深度学习的贡献,可以从三点出发,生成(G)、对抗(A)、网络(N)。
G:机器学习大直可以分为生成模型和判别模型两类,在之前的深度学习中,判别模型得到了充分的发展,例如在CV领域中的物体分离,人脸识别、NLP领域中的机器翻译,文本分类等。它们都是经典的判别模型,对于判别模型,损失函数是非常好构建的,我们以损失函数为目标,模型优化起来也不是那么困难,而对于生成模型而言,器目标构建起来就非常困难,因为衡量生成样本的质量不能其与训练集的某个数值关系。一个高质量的生成样本必然从各个角度上都是非常优秀的,例如,我们要生成一只猫,其从整体上的轮廓到具体的毛发细节,每一个环节都非常重要,而要做到这一点,GAN正式采用了对抗思想。
慢慢的将各种模型啥的都研究透彻,各种模型啥的都好好研究一波,争取在把模型的精髓都学习一遍。全部都将其搞定都行啦的回事与打算。
。