李宏毅《机器学习》课程笔记(作业十一:GAN)

GAN包含辨别器和生成器,是一个对抗的关系,用adversarial。是无监督的学习方式。

可以将其看成老师和学生的关系。

注意辨别器和生成器是轮流训练的,输入是一个随机的向量,最后的输出是一个标量。训练一个的时候把另外一个固定住不更新梯度值。对于辨别器,优化目标是两个部分,使得真实图像得分高而生成的图像得分低。

结构化学习,输出不再是一个简单的向量,而是一个句子,一张图片或者一棵树等等。

One-shot learning, 如果我们把每一张图片看做一个class,所以每个类别只出现一次,有些甚至一次也没有出现过。

理论上用之前讲的自动编码器也可以生成图片,但是自动编码器在判断生成的图片与真实图片的距离的时候,不好定义loss,因为一个像素差别可能还不如6个像素的差别。一般来说使用自动编码器生成图片往往需要更大的网络才能生成更GAN接近的图片。

用单独的生成器和辨别器也可以生成,单独用生成器的话,无法学习到全局的信息,如果用单独辨别器的话,要生成图片的话太困难了,要解一个很难的argmax的问题。

所以我们用GAN的话其实是用生成器来解那个argmax的问题

有条件的生成:比如输入一个文字,输出一个对应的图片,而不是输入一个随机值。原来的GAN中的辨别器不需要管输入的随机值,只要产生清晰的图就好了。现在需要同时看生成器的输入和输出。

注意这个时候需要输入图片和文字的pair,作为真实数据,另外生成虚假的数据。

现在的辨别器优化的目标包括,本身的好坏,配对的好坏,

StackGAN先产生小的图,再用小图作为输入产生大的图。

无监督的条件生成,有两种方法:直接转换,一般是小改。或者是先提取特征,再生成。

cycleGAN,同时训练两对一样的生成器和辨别器。

starGAN,把不同domain之间的转换放在一起训练。

背后的理论:

在高维空间中只有一小部分是符合要求的,所以GAN就是在找这个部分。用最大似然估计

其实最大似然估计就是让选择的数据分布函数与现有的数据分布函数之间的KL散度最小。

所以我们生成的generator只要能度量两个分布的divergence,然后用梯度下降来优化就可以了。但是两个分布不知道,所以用generator。

注意GAN就是在解一个minmax的问题,注意要多次训练辨别器再训练一次生成器。

为了微分好算,把log(1-D(x))替换成-log(D(x))也可以,但是不替换也行。

f-GAN,可以处理各种不同divergence。需要一个Fenchel conjugate的概念,数学强但是实际效果差不多。

生成的data分布跟真实的数据分布非常可能完全没有重叠,所以js divergence可能就固定在一个值,失去效果。

为了解决这个问题,把sigmod函数变成一个线性函数,即LSGAN。

WGAN,考虑推土机距离,也是为了解决这个问题。加入了一个平滑的限制,如果不加的辨别器的输出可能无穷大。为了实现平滑,可以用clipping。

energy-based GAN是说用一个auto-encoder来作为辨别器,这样做的好处是可以预训练,大大提高训练效率。 

输出往往跟输入的关系并不明确,输入的每一个维度具体表示什么意思并不清楚。

InfoGAN就解决这个问题,生成图片之后加入一个分类器,来预测输入数据是什么。

还有一个技术叫做特征解析,加入一个分类器,让机器判断是否一个人说的,就相当于一个GAN。在语音或者影像等地方都有应用,其实换脸换声音等技术都可以应用。

修图功能:把短发图片的code取平均,再把长发的取平均,两者相减就是把短发变成长发的距离。

序列生成,有一个难点是,在句子这样的序列生成中,每个元素生成的过程是有个随机采样的过程的,但是这个采样的过程是没办法微分的,造成了困难。 

GAN可以自动生成文章摘要。可以不需要文章和摘要的pair,只要分别得到一堆数据。要求生成的摘要跟人类的摘要很接近,而且能够被扩写回原来的文章。

为了评估生成的效果,缺乏一个baseline。一种方法叫做核密度评估,不过还是有很多问题。还有个办法是用现成的图片分类器来判断是否能判断为真实的图片。首先要能认识生成的图,其次要生成的东西具有不同的类别。

为了解决生成器生成的东西有重复的问题,可以让辨别器辨别一把图片,而非一个图片。

 

你可能感兴趣的:(深度学习,机器学习)