GAN学习笔记

131 篇文章 1 订阅
110 篇文章 12 订阅

GAN学习笔记1.0(李宏毅)

一 、Basic Idea of GAN

1.GAN就是需要训练一个Generator,最终我们想要得到的也是一个generation。而所谓的generation真实面目就是一个neural network
在这里插入图片描述

2.对于GAN网络模型,当你想得到一张图片时,例如:当你输入一个向量组,经过Generator就会生成一张图片。
在这里插入图片描述
3.对于Sentence Generation 当你输入一个向量组,那么它就会得到一句话
在这里插入图片描述
4.对于影像的生成,对于一个generation,当你输入一个vector经过generation就会-得到一个image
在这里插入图片描述
更具体一点就是,对于影像生成的generation,它的output就是一个high dimention vector,output的这个向量特别的长。而其中每一个dimention就对应着影像中的一个pixel的颜色。当你把high dimention vector排成一张影像的样子,经过generation,那么你就会得到一张图片。
在这里插入图片描述
5.
当我做生成二次元的generation时,当我们输入的一个很长的vector后,经过generation机会生成一个二次元图像,而这个vector的每一个维度都代表这这个图片的某种特征,比如下图中,当我们把第一维的数字改变成3,图片中的女生的头发就从短发变成了长发。
在这里插入图片描述
6.
在这里插入图片描述
7.
discri-minator是另一个neural network ,它的其中一个示例,例如:它input是image经过discri-minator的处理后,它会输出一个数值,这个数值越大表示,这张图片越真实,

在这里插入图片描述
在这里插入图片描述

GAN中有一个generaton和一个discri-minator,那他们之间是一个什么关系呢?是一种猎食者和猎物之间的关系。
在这里插入图片描述
9.
今天假设你要让机器做二次元人物头像的生成,首先你的准备一个database,database里面有很多二次元人物的头像,然后GAN中的generator,在一开始,它里面的参数是随机的,也就是刚开始它也不知道怎么产生二次元人物的头像
在这里插入图片描述
所以刚开始,它也只能产生一些杂序的东西,而这个时候就该discri-minator上场了,它会接收generator产生的图片,它会来判断这张图片是generator生成的图片,还是真实的图片。

在这里插入图片描述

而由于第一代的generator中的参数都是随机设置的,所以说第一代generator生成的图片肯定没有骗过第一代discri-minator,那么第一代generator就会自动进化成第二代generator,第二代的generator能后骗过第一代discri-minator,但是discri-minator也会进化成discri-minator第二代,而第二代discri-minator会判断第二代generator生成的图片是不是真实的图片。如此循环

在这里插入图片描述
那么generator会越来越进化,那么generator产生的图片会越来越真实。综上所述,generator和discri-minator就好像是对抗的关系。

(1)为什么generator无法自己去学习怎样画一个好的二次艳头像,而要依靠discri-minator?
(2)为什么discri-minator这么会批评,那么它为什么不自己画二次元人物头像呢?
在这里插入图片描述
在这里插入图片描述
11.
前提假设:我们要训练最终得到一个generator,使它能产生二次元头像,那么你的手机一些真实的二次元头像,也就是人手工画的二次元头像,然后从收集的二次元database中选取一些头像作为示例。
generator和discriminator的进化过程:(G表示:generator,D表示:discriminator)
(1)首先的初始化G和D
(2)然后开始第一轮的训练
(3)先固定住G,只更新D,先随机产生一些vector,然后把这些vector输入到G中,然后由G产生二次元头像,然后把这些生成的头像,输入给D,然后控制D给这些二次元头像很低的分数,把从database中寻找的图片放在D中,让D给这些图片很高的分数。然后去更新调D的参数
在这里插入图片描述

(4)但上一步完成时,已经训练好了D,那么接下来我们开始固定住D,开始训练G,我们训练G的目标就是让G生成的图片,传入到D中后,D会给一个很高分数,由于上一步中我们是把真实的二次元图片传给D,D才会给高的分数1,所以只有G产生的图片足够真实时,D才会给G产生的图片很高的分数,那么这就达到了训练G的目的。

在这里插入图片描述
(5)在code实现中,G和D其实是合在一起作为一个巨大的network。假设G有5层,D也有5层,那么就是把他们接在一起一共10层,输入的是一个vector给G,而输出的是D的一个数值。而训练G的过程就是固定住D的layer,而训练G的layer中的值,使得D的输出的值越大越好,那么这样就达到了训练G的目的。

在这里插入图片描述
(6)
在这里插入图片描述
(7)对于G和D的训练不是一次性完成的,而是训练G和训练D反复执行。要执行多次,并不是一次性把G训练好,或者一次性把D训练好了。
在这里插入图片描述

二、GAN as structured learning

machine learning就是input一个东西,然后它会给你output另外一个东西
在这里插入图片描述

在这里插入图片描述
3.
下面都是structured learning问题 ,而GAN就是可以用在structured learning问题上的技术
在这里插入图片描述
4.
在这里插入图片描述

为什么structured learning是一个比较具有挑战性的问题呢?李宏毅认为structured learning是一个ONE -shot或者zero-shot learning的问题。假如你现在要做一个分类的问题,那么你对于每一个类别都要给机器一些例子,举例来说:你如要要分类橘子和苹果,那么你就要给机器100张橘子的图片和100张苹果的图片范例,这样你给它一张图片,它才能知道这个是橘子还是苹果。ONE -shot或者zero-shot learning就是,范例很少或者直接没有范例,那你能不能够做的起来?李宏毅认为structured learning可以认为是极端的ONE -shot或者zero-shot learning问题。因为当structured learning在训练时,它所output都是train data里面的类别,但是当他进行测试时,它所output的类别可能是属于test data 但是在train data中一次也没有出现过,或者只出现过一次,那么这个时候就要求structured learning具有一定的智慧,在测试的时候,创造一个它从来都没有见过的类别。

在这里插入图片描述
6.
如果现在的机器要解决structured learning的问题,那么它必须要有规划的概念,有大局观,现在机器要产生一个复杂的物件,而这个复杂的物件是有很多(部件)component组成的。比如对于人脸影像生成,机器仍然是产生一个一个pixel,而这么多的pixel要组成一个人脸。而这个机器在生成这个人脸图像时,得知道知己现在生成的这个pixel是眼睛,这个pixel是耳朵等。
在这里插入图片描述
7.
李宏毅认为GAN是解决structured learning问题的一种解决方法。在传统的structured learning文献中其实是有两大类方法:Bottom Up (自底向上) 和 Top Down(自顶向下)。:Bottom Up :当我们需要产生有个物件,机器是一个一个component的产生,这样的方法缺点是,很容易失去大局观;Top Down:产生完一个完成的物件之后,然后再从整体去看,这个物件产生的好不好。而Generator可以视为是一个Bottom Up方法,而discriminator视为是Top Down的方法。而当G和D结合起来就是Generative Adversarial Network(GAN)网络模型。
在这里插入图片描述

三、Can Generator Learn by itself?(generator能不能自学)

实际上G是能够自学的,以数字识别为例,当你input一个vector经过G就会output一个image数字。
首先你需要收集一些数字的图片,然后自己随便设置每个图片的vector。
在这里插入图片描述
然后你就训练一个G,让这个G可以通过输入一个vector,output一张图片,而这张输出的图片与input的vector所对应的数字图片越接近越好。你只要这样一直训练下去,就可以硬训练出这样一个Generator neural network
在这里插入图片描述
这个和train一个classifier neural network正好是相反的过程,train一个classifier neural network 只是它input的是一个image,output的是一个大一点的vector。而这个vector对应着input的image最有可能是哪个数字。
在这里插入图片描述
而对于generator neural network和classifier neural network可以使用同一种方法去train它们两个,但是对于刚刚我们讲的train generator neural network 时input的vector怎么得到呢?当然你可以说可以随机产生,但是如果随机产生,那么你想train一个好一点的generator就会变得很困难,因为下图中的两个数字1图片,表示的都是数字1,但是这两张图片所对应的vector却相差很大。也就是说在train 成一个input相差很大的vector,output一样的数字,这是很困难的。
在这里插入图片描述
那么我们为了使input不一样的vector,但是结果output是一样的数字,那么在input vector的时候,是不是得让vector和output的数字有一定的关系,也就是,input的vector不能够随意设置了。
但是要保证input的vector和output的数字有一定的关系,那么这个input的vector应该这么设置呢?办法就是:你去train一个encoder neural network。给encoder一个图片,它会output一个vector,而这个vector包含着这个图片的特征。而由encoder output 的vector就当做图片的vector。

在这里插入图片描述

那怎么train这样一个encoder呢?(此处的encoder指的是上面那个encoder)。
在李宏毅之前讲的Auto-encoder中提到,首先将一张图片input到encoder中去,然后encoder会output一个vector,然后再把这个vector传入到一个decoder中去,decoder会output一张图片,而这张图片与encoder输入的图片越接近越好。(在VAE里面讲过)
在这里插入图片描述
3.
而此时decoder就是generator。因为刚刚我们说的就是,给generator一个vector,然后让他产生一个图片,这个图片与真实图片越接近越好。当我们把这个decoder拿出来后,他就会是一个generator,当给这个decoder input一个vector,那么decoder就会output一张image,所以当decoder被单独拿出来以后,他就是一个generator。
在这里插入图片描述
4.
例如:你可以train一个数字产生器(decoder == generator),当你输入一个2位的vecoter,它就会output一个数字image。
在这里插入图片描述
在这里插入图片描述
5.
那么使用Auto-encoder会出现一个什么问题呢?
因为你train data 里面image是有限的,比如说,train出来的generator在看到a vector时,它会output也数字1的image,当input b vector时,它会output另一种方向的数字1,但是当input 0.5a + 0.5b时,按理说generator会output一个竖直的数字1图片,可是实际上,它会output一些很奇怪的图片。
在这里插入图片描述
6.
那怎么解决5产生的问题呢?
李宏毅在machine learning这门课中讲的VAE解决了这个问题。
在讲VAE的时候,VAE的encoder不只是产生一个code(vector),它还会产生vector中每一个dimention的variance(方差)
在这里插入图片描述
在这里插入图片描述

然后从normal distribution中选择sample一下noise出了来,然后把sample出来的noise和variance相乘,再然后把相乘的结果加到code(vector)上。
在这里插入图片描述
然后把加了noise的code(vector)传入到decoder中去,然后decoder根据输入的vector还原出原来的图片。
在这里插入图片描述
那么有了上面的VAE之后,训练出来的decoder(generator),就知道了不仅输入a和b要输出数字,当输入0.5a + 0.5b也要输出数字。甚至输入一个generator从来没有见过的vector,它都会output一个数字,而不会是其他东西。
7.
我们希望generator生成的图片和真实图片越像越好,那怎样来衡量这个像的程度,和不像的程度呢?这个就需要把generator output的image转化成vector,相同位置上的pixel相减,差值就衡量了这两张图像的相似程度。

在这里插入图片描述

如果generator output的图片和target的图片一模一样,那再好不过了,但是在实际中,几乎不可能得到这种情况,generator output的图片一般和target都会有差别。
在这里插入图片描述
那么这个时候,generator势必会有一些取舍,那到底取舍那个位置呢?
比如下图:
当你的target是左上角的数字2时,下面是由4个genrator产生的output,第一排与target的pixel差1个pixel,第二排差6个pixel,但第一排个第二排到底选哪个呢?按照我们人的直觉第一排肯定都不行,第二排其实两个都可以。

在这里插入图片描述
所以在训练过程中,也不一定是要让你的generator的output与你的target越像越好。因为当你让generator的output与target越像越好,那么机器肯定会选取第一排的图片,但实际上第二排的图片更好。

而李宏毅在讲这节课之前就说过structured learning问题是一个复杂的结构,structured learning问题有很多component,而这些component之间的关系是非常重要的。
可能呢?虽然在structured learning问题中,component与component之间的关系很重要,但是在训练一个generator生成一张图片时,我们很难将component与component之间的关系加进去。
例如:现在做图片的生成。Layer L就是generator的最后一个layer。Layer L的output就是一张图片,那么layer L的每一个neural对应于图片里的每一个pixel。而每一个neural的output的数值就是这张图片某一个pixel的颜色的深浅。
假设Layer L-1的值是给定的,也就是它的Layer L-1的output是给定的。那么每一个dimention的output其实是empty。假设neural2产生了一个颜色,它想neural1也产生一个颜色,但是实际上neural1是不会这样做的,他们之间是没有任何关系的。他们之间没有办法能够互相影响。这就是你单独去train一个generator困难的地方。

在这里插入图片描述
但是这个问题也是可以解决的,当你只是单独的考虑一个dimention,你是很难去考虑每一个pixel之间的correlation。但当你多加几个hidden layer ,你就可以把这种correlation考虑进来。所以今天如果你不想用discriminator,只是单纯的想用Auto-Encoder技术来做generator这件事,根据经验,今天你有同样的neural network,同时用GAN train和Auto-Encoder train,往往用GAN train的你可以获得一张图片,但是用Auto-Encoder的哪一个往往你需要更大的neural network你才能产生于GAN接近的结果。所以今天如果你要把corralation考虑进去,你可能需要一个比较深的neural network。
在这里插入图片描述
9.
如下图,绿色是蓝色学习的目标,这个想让通过generator的 input ,经过处理后,output的蓝色点点能够和绿色点点一样的distribution。但是如果是使用()variational)Auto-encoder这样train下去后,你只能得到蓝色的点,因为对于generator来说,判断dimention1和dimention2之间的corralation是很困难的。
在这里插入图片描述

generator不太容易知道在x1很大时,比如当x1到达1,2,3这三个区域时,x2小一点没有问题,x2大一点也没有问题,但是当x2不大不小,落在2区域时,是有问题的,这个对于G来说,是很难判断出来的。
这个呢就是使用variational Auto-encoder可能会遇到的问题。

在这里插入图片描述

四、Can Discriminator generator?(为什么D不能够自己产生图片?)

其实D是可以自己生成image的,但是它生成的image很卡。
D在不同的领域,被叫做不同名字。
在这里插入图片描述
2.
D相较于G有什么优势?
之前讲到,G生成一张image,是通过独立生成一个一个component生成的image,
所以要让G去考虑不同component之间的correlation是很困难的。但是对于D来说,要考虑component之间的correlation就比较容易了。对于D来说,它是接受G产生的图片,然后它通过input这张图片,然后可能很容易的判断出这张图片是高分还是低分,那对于D是怎样做到这件事情的呢?那可能说你的D其实也是一个convolution neural networ,而在convolution neural network中有一个filter,然后呢你的filter有可能会去detect说,有没有pixel周围没有其他pixel,如果有这种pixel,那就给这张图片低分。所以对D来说,去检查一张已经生成的image中不同component之间corralation对不对,对它来说是很容易的。
在这里插入图片描述
3.
那怎样去使用这个D呢?就是穷举X中的所有x,把所有x都input到D里面去,当某一个x输入进D里面去后,取得了一个最高分,那么这个x就是G生成的结果。
但是穷举这个X,这个X是由很多pixel通过组合生成的,要从这么多种组合中找到一个得分很高的组合,那这是很困难的,但是现在我们假设,有一种算法可以很容易做到。
在这里插入图片描述

在3的基础上,这个怎么训练?
训练就是,我们给D很多好的图片,告诉他这些好的图片就是高分的,给他很多烂的图片,然后告诉他这些烂的图片就是低分的。
但是实际上我们手上只有好的example(图片)。这些axample input到D里面去,这个D都应该给这个example高分。但此时你的D只有positive的例子,完全没有反面的例子。但是如果这样去train D,那么只有只要你input任何东西,D都会给它高分。因为它在训练的时候看到的全部都是正面的的东西,完全没有看到过反面的东西。所以说它看到什么东西都会给它高分。所以显然,这并不是我们想要1结果。

在这里插入图片描述

所以说我们需要给D一些negative examples。那么在哪里去找这些negative example就变的很关键了。但是如果今天你找到的negative example比较差,然后你告诉D人画的图片就给高分,你找的这种negative example就给低分,可是如果 再之后你input一张稍微好一点的negative example,那么D就会给它高分。那么这个就不是我们要的。所以现在产生一些好的negative example就变的很重要。只有产生比较好的negative example,才能让D学会去鉴别图片的好坏。但是怎样产生好的negative example呢?这有需要训练一个好的model,而这又陷入了鸡生蛋,蛋生鸡的问题。所以怎样解决这样的问题呢?实际上需要使用iterative的方法来解决这种问题。所以你要怎么训练你的D呢?假设一开始你有一堆positive example和一大堆negative example,而positive example是人画的example。而negative example是rand example的。而在每一次的itration里面,discriminator就是给positive example高的分数,给negative examples低的分数。把D训练好之后,
李宏毅说这时你只要会最下面的公式,就可以把D当做G使用,然后通过D就会生成一系列的图片,然后把生成的图片传入到第一代训练好的D中,然后告诉D些图片是不好的,而那些positive examples是好的,然后重复之前的操作,循环训练D。以此重复这样的操作,就可以训练一个好的D。

在这里插入图片描述
6.
在如像下图所示的二维空间,我们可以把出现real examples的地方的object input 进D中,然后让D给它一个很高的分数,其他区域的object给它很低的分数,但是在实际使用中,我们很难把没有出现过real example的地方吧他的分数都压低。

在这里插入图片描述
7.
所以在实际中的做法如下:
刚才我们说D在训练的时候,是通过itrative去train的。假设一开始你的real data是如下所示

在这里插入图片描述
而你generative的data或者negative data是下图这样的。
在这里插入图片描述
那么接下来。D会去学着,给蓝色的点低分,给绿色点高分。

但是经过训练后,机器可能知道给第一个框的位置低分,给第二个位置的框的位置数据高分,但是对于第三个框,它也不知道该给高分还是低分,就很有可能机器会给第三个框位置的数据高分。甚至给第三个框位置的高分,要高于给第二个框的高分。

在这里插入图片描述

然后上面就是你第一个train出来D,那么你就用train出来的D去产生negative examples。也就是去找出这个D的弱点。
在这里插入图片描述
那么怎样去找D产生的negative examples呢?
下图,由第一代D产生的examples中,我们知道下面方框中的是negative examples。
在这里插入图片描述
所以在下一次的训练中,我们要把上图中方框里面的example input 进D中,并且output 出低分。
在这里插入图片描述
这就好像是D在不断的寻找自己的弱点。我们去找那D产生的examples中,不是real example 且 positive examples,而是那些D产生的是高分,但不是real examples的examples。然后在下一次的train中,把那些由D产生的不是real examples的examples,但确实获得了高分的examples,现在给她低分。
在这里插入图片描述

最后训练到如下图所示,只有是real examples 地方才给它高分。那么这是你的positive examples 和negative examples的distribution就会重合在一起。
当你的positive examples 和negative examples的distribution就会重合在一起时,那么你的train的process就会停下来。那么这个就是discriminator的training。
所以D是可以单独做生成的。
在这里插入图片描述

G和D的对比:
G:做生成很快,它不容易考虑component之间的correlation。它只学到了pixel和pixel之间的相似程度。它学不到大局。
D:D可以考虑大矩,但是如果你想要D生成一个东西,这个会千难万难。
如果你想让D能够生成image,那么你就得解下面方框中的东西,但是如果你要解方框中的东西,那么你就得先假设D是线性的,但是如果你假设D是线性的,这就会限制D的能力。

在这里插入图片描述
9.
所以GAN有什么作用呢?
在之前不知道怎么去解方框1的内容,但是现在可以使用方框2去解。
而现在加入D之后,G的loss不再是pixel之间的相似度,而来自是D的输出,来自有大局观的输出,所以这样也能把G训练成能够产生具有大局观的结果,

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值