Reference 李宏毅GAN视频
generator能不能自己learning?
可以让generator达成这样的效果,输入一个vector,network根据这个vector输出对应的图像。比如下面这个手写数字的输出。输入的vector是怎么产生的呢?我们一般会希望有共同特征的数字,他们输入的向量会有某些相似之处,输入的vector和输出的图片的特征有某种关联。
要实现上面说的方法,这就需要采用auto_encoder,对于一个手写数字图片,交给encoder进行编码,编码产生低维code输入到decoder解码,输出对应的图像,希望输出的图像和输入的图像越相似越好。这个decoder就相当于generator。
下面这个图展现了随着code变化的数字图像变化:
但是因为training data里面的image是有限的,当出现generator没有见过的vector的时候(比如下面这个PPT里面的,vector a与vector b的平均),可能无法输出正常的数字图像。
这个时候要用VAE解决,我的理解是它可以让generator的抗噪性更好,让输出在有噪声的情况下更稳定。如图它在encoder输出的编码上加上了每一个dimension的variance乘上一个正态分布的vector的积,再输入到decoder。
因为学的重点不在这里就不深入了解VAE了。
What do we miss?
通常用像素之间的距离来衡量两幅图片之间的相似度。一般希望距离越小越好。但generator一般不可能和target完全一样,会在某些地方有误差,误差“在哪里”就很关键。比如说下面的例子,如果用这样的距离来衡量的话,generator倾向于生成上面这种误差更小的图片,但是这种图片并不那么像人手写的。
出现这种图像的原因是,generator是一个一个component学习的,如下图,同一层的两个神经元之间并不会相互影响,让他们产生影响需要加深网络,所以同样是解决这个问题,auto_encoder和GAN比起来往往需要更大的网络。
discriminator能不能自己产生image?
和generator相比,generator是一个一个component生成的,无法考虑component与component之间的影响,而discriminator比较容易考虑,因为它是对一张完整的图片进行评估。
discriminator生成图片,是通过穷举所有x,来找出得到最高分的image。
discriminator的training:
一般我们手头上只有正面例子,如果训练的时候只有正面的例子,那机器就会学会看到什么都给高分。那要怎么选择负面的例子就很重要。如果负面例子太差,机器学习效果也会不好。
需要“好”的负面例子才能产生好的discriminator,但是要好的discriminator才能产生“好”的负面例子。所有就。。尴尬了。那要如何去训练discriminator呢?
1.首先用如下的正面例子和(很差的)负面例子去让discriminator学习
2.训练完之后让discriminator穷举生成目前它觉得能得高分的image
3.把这次discriminator产生的image作为新的负面例子,再让discriminator学习
如此迭代
generator和discriminator的优点与缺点:
discriminator生成图片的穷举问题往往难以解决,所以用擅长生成的generator来代替穷举生成高分图片,或者说generator在学习解决穷举生成高分图片,discriminator在generator产生的bad quality图片和数据库里的好图片中进行学习打分,并且让有“大局意识”的discriminator来评估generator生成的图像,引导generator的改善方向,在这样的博弈里面学习得到我们想要的结果。