一、基本概念介绍
在GAN之前我们学到的架构都是我们会给他一个x然后他经过神经网络之后输出一个y  现在我们要把Network当作Generator来用,让网络自己产生一些东西,这样网络的输入不再是单单的x,还要加上一个Simple Distribution,然后输出是一个复杂的概率分布,我们就把这样的网络叫做Generator
Generator
例子:让机器生成动漫人物脸,这里做的是Unconditional generation,就是在网络的输入当中将x去掉只剩下Z做输入,Z一般来说是一个低维的向量,丢到generator中输出  图片本身就是十分长的向量,所以generator的输出就是一排向量。
Discriminator
Discriminator本身也是一个network、函数,接受图片的输入,输出是一个scalar,这个值越大,说明Generator生成的图片的真实度越大。Discriminator的架构是我们自行决定的,如果想处理图像问题,那架构可能更多地使用CNN来组成  为什么要有Discriminator,其实这可以用进化理论来解释,也就是物竞天择,因为对GAN来说,我是要生成一些东西,这部分由Generator来完成。Generator开始时地参数是随机的,所以生成的东西是很随意的,比如上面的例子来说,Generator生成的二次元人物可能是没有眼睛的,这样的话当图片输入到Discriminator时,Discriminator给的分数很低,不让你通过,那Generator就会根据这一点来更新自己的参数,以生成更像二次元人物的图片,调整的方向就是要骗过discriminator  但是,Discriminator也是会进化的,第一次的时候可能检查的是眼睛,现在可能检查嘴巴等其他特征来判断Generator生成的图片是不是二次元人物  由此看出,Discriminator和Generator是存在对抗关系的。
Algorithm
首先,初始化G(Generator)和D(Discriminator)的参数。再者,训练G,在网络爬到真正的二次元人物,然后比较G产生的图片与真正的类别,不断更新参数 最后因为G产生的图片是要骗过D的,所以D就会增加判断G生成的图片的特征来给图片打分,根据分数是使G的参数更新 当D打的分数比较高时,G就可能骗过D,输出图片。我们可以把G和D看成一个整体的网络,但是参数更新时我们不会更新D部分的参数 两个步骤合起来之后就是下面这样,两个网络是轮流进行训练的
二、理论介绍
我们在训练的时候是要定义Loss函数,然后不断去使他最小化,而在GAN中同样的,我们期待我们G生成的东西与真实的东西Pdata越接近越好  式子可以写成这样:  Divergence表示G生成的与真实的东西的距离,所以我们要找到一组参数使得Divergence越来越小,但是不知道怎么算这个距离。以此GAN是用小数量的样本进行计算,分别从真实图库和G产生的图片Sample一部分出来后就可以计算 根据这些数据可以做训练,将PG丢给D判断,给出分数高低,同时也可以把这个过程当成optimization。找到使D最大的参数,式子由下面所示,对于最下面的式子,我们希望如果Y是从Pdata出来的,则越大越好,如果是从PG中Sample出来的,则希望他越小越好  因为我们是将两种数据混合在一起的,所以对D而言就是在做一个二元分类问题,当Pdata和PG之间的距离很小时,他们混合的程度越大,对于D来说越不容易做分类,就会给出很高的分数,相反则会给很低的分数  所以我们从最开始计算divergence的最小值转化成了计算D*的最大值,且二者是相关的,则可以这样代替 
三、生成器效能评估与条件生成
GAN是十分难train的,Generator和Discriminator是相互抵抗、共同成长的,只要其中一者停止训练,那另一者也会跟着停止  对GAN来说生成一段文字是最难的,对于GAN做Sequence-to-Sequence而言,Generator就是Decoder,然后丢给Discriminator,然后D打分是不是真正的句子,那G就是根据分数进行参数调整,以骗过D。  但事实是,当你在做微分的时候,Decoder会有微小的变化,取max之后,无法改变Decoder的输出,也无法提高D打的分数。这里就可以使用reinforcement Learning进行训练,但十分困难。
Possible Solution
可以尝试supervised的方法进行训练,就是拿真正的图片当作标签给G当参考,一直训练下去
Quality of Image
当G产生的图片时,可以把图片丢到影像分类系统中进行判断,最终输出一个概率分图,当分布十分集中时,那G产生的图片可能就是真正的图片  但这种方法会被Mode Collagse问题骗过,这种情况下,G产生的图片只有那几张图片,这样D就一直认为是真的图片。因此我们要判断图片的多样性够不够,有下面方法,就是判断图片种类加权平均之后概率分布是否平均  但是在评估G的时候,还需要判断其产生的东西是否是我们想要的。因此需要更多的评估方法。
Conditional Generator
我们之前的G的产生都是随机的,如果我们想要控制G的输出,就给G多一些限制性的输入 比如说G输入的限制是红眼睛,那其输出的图片中均是红眼睛  接下来就要做Condition GAN,之前的GAN模型如下  但是这样的训练的话,D并没有考虑到输入限制问题,这样的话G只要产生清晰的图片就可以骗过D,根本无关是否是红眼睛,所以D还要根据限制条件来给分此过程中还需给一些错误的训练数据  Conditional GAN除了输入语音产生图片之外,还可以输入图像产生图像 
四、Cycle GAN
GAN话可以用在Unsupervised Leaning上。在supervised Learning上,当我们训练一个网络的时候输入一个x,输出一个y,训练资料一般成对的,未成对的资料叫做unpaired资料 而对影像风格转化的训练中是完全没有成对资料的,对于G而言,我们要训练一个输入为X-domain的图片,输出Y-domain的图片 按照之前的方法,我们可以直接在X-domain图片中sample一部分出来,丢到G然后输出就可以了,但是的话这样是不够的,因为这样的话没有任何的限制,这样的话G的输出可以跟输入图片没有任何关系,这一点跟Conditional GAN很像 所以就用了Cycle GAN,里面用了两个G,第一个G输入X-domain的图片,输出一张Y-domain图片,第二个G是将第一个G产生的图片还原回最开始输入的X-domain图片, D就会根据两张X-domain图片的相似程度进行打分,越像则分数越高。话第一个G的输出可能产生跟输入完全不同的图,这样的话第二个G就不会产生跟最开始输入的图片相关的图, 所以为第二个G的输出能够还原图片,所以就会强制第一个G的输出跟输入的X-domain图片是相关联的。相互的Cycle GAN也可以是相向的的,也可以用Y-domain图片来做  二者合起来就是Cycle GAN。
五、结语
此次读书笔记是本人学习机器学习的第六篇,如有不足之处还请指出。
|