赞
踩
本周学习了生成式对抗网络,从应用背景出发,先认识了生成器和辨别器,并学习了这两者的训练方法;然后学习了生成器产生图片跟真实图片之间差异的计算原理和方法,学习了WGAN,学习了GAN的一些评估方法的优缺点,学习了无条件型生成模型和条件型生成模型,还学习了GAN在无监督学习中的应用Cycle GAN。
This week, I learned generative adversarial networks. Starting from the application background, I first understood the generator and discriminator, and learned the training methods of the two. Then I learned the calculation principle and method of the difference between the image generated by the generator and the real image, learned WGAN, learned the advantages and disadvantages of some evaluation methods of GAN, learned unconditional generation model and conditional generation model, and learned the application of GAN in unsupervised learning, Cycle GAN.
在生成模型输入时会将一个随机变量 z 与原始输入 x 一并输入到模型中,这个变量是从随机分布中采样得到。输入时可以采用向量拼接的方式将 x 和 z 一并输入,或在 x、z 长度一样时,将二者的加和作为输入。(每次输入一个x时,我们都从随机分布如:高斯分布(Gaussian distribution)、均匀分布(uniform distribution)等中采样得到z)随着采样得到的 z 的不同,我们得到的输出 y 也会不一样。
输出是一个很复杂的分布
在预测小精灵左转右转例子中,训练模式是,玩小精灵的同时进行视频录制,来训练网络,可能出现同时左转和右转这两种数据会被同时训练,就会出现同时右转和左转的情况。
解决该问题就是让网络有概率的输出一切可能的结果,或者说输出一个概率的分布,而不是原来的单一的输出。
就是我们的任务需要“创造力”,相同的输入要产生不同种类的输出
我们不需要原始输入 x,对于无限制的 GAN,它的唯一输入就是 z(通常是一个低纬的向量),这里假设为正态分布采样出的向量。
在GAN中除了生成器以外,我们要多训练一个判别器(discriminator),通常是一个神经网络
采用生成二次元头像的例子中,对于discriminator的输入为一个图像,输出为一个数字表示该输入的图像和真实的二次元头像的相似度,数值越大表示越像。
第一代生成器的参数几乎是完全随机的,所以它根本就不知道要怎么画动漫人物,所以其画出来的东西就是一些莫名其妙的噪音。
然后辨别器辨别出生成器生成的图片跟真是的图片之间的差距,接下来生成器就要通过训练调整里面的参数来骗过判别器。同时判别器也是会进化的,其会试图分辨新的生成器与真实图片之间的差异。
所以生成器和判别器彼此之间是一直的互动、促进关系,和我们所说的“内卷”一样。最终,生成器会学会画出动漫人物的脸,而判别器也会学会分辨真假图片,这就是 GAN 的训练过程。
生成器和判别器是两个网络,在训练前我们要先分别进行参数初始化。
重复以上的训练,训练完判别器固定判别器训练生成器。训练完生成器以后再用生成器去产生更多的新图片再给判别器做训练。训练完判别器后再训练生成器,如此反覆地去执行。当其中一个进行训练的时候,另外一个就固定住,期待它们都可以在自己的目标处达到最优,
生成器的输入是一系列的从分布中采样出的向量,生成器就会产生一个比较复杂的分布,我们称之为 P G P_G PG。这些原始的数据本身会形成另外一个分布,我们称之为 P d a t a P_{data} Pdata。
divergence表达的是这两个分布之间的差异我们可以将其视为两个分布间的某种距离如果这个距离越大,就代表这两个分布越不像;差异越小,代表这两个分布越相近。
问题是如何计算这个divergence?
对于一般的神经网络其损失函数是可以计算的,但是对于生成器的差异,对于连续的差异例如 KL 散度和 JS 散度是很复杂的。
对于 GAN,只要我们知道怎样从 P G P_G PG 和 P d a t a P_{data} Pdata 中采样,就可以计算得到差异,而不需要知道实际的公式。
在训练判别器,其训练目标是看到真实数据就给它比较高的分数,看到
生成的数据就给它比较低的分数。
用
m
a
x
D
V
(
G
,
D
)
max_DV(G,D)
maxDV(G,D)代替上式后半部分,
m
a
x
D
V
(
G
,
D
)
max_DV(G,D)
maxDV(G,D)实在G已经确定的情况下找一个D是使目标函数V的值达到最大。
JS散度的问题:
JS 散度的两个输入
P
G
P_G
PG和
P
d
a
t
a
P_{data}
Pdata 之间的重叠部分往往非常少。
导致的问题后果:
对于两个没有重叠的分布,JS 散度的值都为 Log2,与具体的分布无关。。就算两个分布都是直线,但是它们的距离不一样,得到的 JS 散度的值就都会是 Log2,
所以在没有WGAN的时候,使用JS时,训练 GAN 真的就很像盲盒。根本就不知道训练的时候,模型有没有越来越好。
Wasserstein 距离的定义
假设两个分布分别为 P 和 Q,我们想要知道这两个分布的差异,我们可以想像有一个推土机,它可以把 P 这边的土堆挪到 Q 这边,那么推土机平均走的距离就是 Wasserstein 距离
Wasserstein 距离与 JS 距离的对比
但是如果换成 Wasserstein距离,由左向右的时候我们会知道,我们的生成器做得越来越好。所以我们的 Wasserstein 距离越小,对应的生成器就越好。
Wasserstein 距离的定义是一个最优化的问题。我们要找一个函数 D,这个函数 D 是一个函数,我们可以想像成是一个神经网络,这个神经网络的输入是 x,输出是 D(x)。X 如果是从
P
d
a
t
a
P_{data}
Pdata采样来的,我们要计算它的期望值
E
x
∼
P
d
a
t
a
E_{x∼P_{data}}
Ex∼Pdata,如果 X 是从
P
G
P_G
PG 采样来的,那我们要计算它的期望值
E
x
∼
P
G
E_{x∼P_G}
Ex∼PG ,然后再乘上一个负号,所以如果要最大化这个目标函数就会达成。如果 X 如果是从
P
d
a
t
a
P_{data}
Pdata 采样得到的,那么判别器的输出要越大越好,如果 X 如果是从 PG 采样得到的,从生成器采样出来的输出应该要越小越好。
GAN是以很难训练而闻名的,当generator或discriminator其中任何一个停止进步了,另一个也随之停止进步
把 GAN 产生出来的图片输入到这个图像的分类系统里面,看它产生什么样的结果这个图像分类系统的输入是一张图片,输出是一个概率分布,这个概率分布代表说这张图片是猫的概率、狗的概率、斑马的概率等等。如果这个概率分布越集中,就代表现在产生的图片可能越好。
该方法存在一个问题:Mode Collapse(模式崩塌)
会发现生成式的模型它输出来的图片来来去去就是那几张,可能单一张拿出来你觉得好像还做得不错,但让它多产生几张就露出马脚,产生出来就只有那几张图片而已,这就是模式崩塌的问题。
同时Mode Dropping(模式丢失)更难被发现
GAN 能很好地生成训练集中的数据,但难以生成非训练集的数据,“缺乏想象力”
我们还是要看生成器产生的图片的多样性够不够多,把生成器生成的一系列图片都丢到图像分类器里,看它被判断成哪一个类别。每张图片都会给我们一个分布,我们将所有的分布平均起来,接下来看看平均的分布长什么样子。如果平均的分布非常集中,就代表现在多样性不够,如果平均的分布非常平坦,就代表现在多样性够了
FID方式评估GAN的性能:
先把生成器产生出来的人脸图片,丢到 InceptionNet 里面,让 Inception
网络输出它的类别。这里我们需要的不是最终的类别,而是进入 Softmax 之前的隐藏层的输出向量,这个向量的维度是上千维的,代表这个图片
图中所有红色点代表把真正的图片丢到 Inception 网络以后,拿出来的向量。蓝色点是 GAN 的生成器产生出来的图片,它丢到 Inception 网络以后进入 Softmax 之前的向量
我们假设真实的图片和生成的图片都服从高斯分布,然后去计算这两个分布之间的 Fréchet 的距离。两个分布间的距离越小越好,距离越小越代表这两组图片越接近,也就是产生出来的品质越高。
之前学习的 GAN 中的生成器,它没有输入任何的条件,它只是输入一个随机的分布,然后产生出来一张图片。现在希望能够操控生成器的输出,我们给它一个条件 x,让他根据条件 x 跟输入 z 来产生输出 y。
对于有监督学习,即我们要训练一个网络,其输入是 x,输出为 y,并且我们需要成对的数据才有办法训练网络。
把 GAN 用在无监督学习上,有一系列的输入和输出,但是 x 和 y 之间并没有成对的关系,也就是说我们没有成对的数据。
举个例子:训练一个深度学习的网络,它要做的事情是把 x 域的真人照片,转换为 y 域的动漫人物的头像。
在训练的时候,我们会增加一个额外的目标,就是我们希望输入一张图片,其从 x 域转成 y 域以后,要从 y 域转回原来一模一样的 x 域的图片。就这样经过两次转换以后,输入跟输出要越接近越好,或者说两张图片对应的两个向量之间的距离越接近越好。
Cycle GAN 可以是双向:有一个生成器,输入
y 域的图片,输出 x 域的图片,是先把 x 域的图片转成 y,在把 y 转回 x。在训练 cycle GAN的时候,其实可以同时做另外一个方向的训练,也就是把橙色的生成器给它 y 域的图片,让它产生 x 域的图片。然后在让蓝色的生成器把 x 域的图片还原回原来 y 域的图片。同时我们还要再训练一个x域的判别器
本周学习了Transformer和GAN,但由于自身原因,Transformer相关内容还未写周报,下周补上然后继续往下学习
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。