GAN 生成对抗网络10-1

GAN的种类
在这里插入图片描述
在这里插入图片描述
一、basic idea of GAN
在这里插入图片描述
GAN主要用于生成数据,如图片数据和文本。如图片生成,我们需要训练一个generator,使得输入一个向量,会输出一张图片,输入不同向量会输出不同图片;文字生成同理。

generotor是一个neural network。
在这里插入图片描述
在这里插入图片描述
输入向量的每个值,实际上是一个特征,更换向量的值,图片的某种特征会随着改变。
在这里插入图片描述
比如上图,第一个向量可能代表头发的长度,倒数第二个向量可能代表头发的颜色,最后一个向量可能代表张开嘴巴的大小。

在这里插入图片描述
在我们训练generator的同时,可能也要训练一个discriminator,discriminator实质也是一个neural network,输出是一个scalar,该值越大,说明生成图片越逼真。
在这里插入图片描述
如图,generator生成图片,经过discriminator,同时真实图片也经过discriminator,discriminator可以鉴别输入图片是真实图片还是生成图片;generator会进化成第二代generator,它想骗过第一代discriminator;同时discriminator也会进化为第二代…直到discriminator无法分辨为止。如此两个network一直相互对抗,因此有了对抗网络这个说法。

在这里插入图片描述
一个和平的比喻:学生和老师的故事…学生生成一系列图片,给一年级的老师看,老师说图片应该有圈圈,于是学生画上眼睛(此时一年级老师觉得很棒,即可以骗过一年级老师)给二年级老师看,二年级老师说图片没有色彩,于是学生加上色彩给三年级老师看,如此往复。
有两个问题:generator为什么不能自己学,而需要discriminator来批评?discriminator为什么那么会批评而不自己做?

在这里插入图片描述
在这里插入图片描述
训练generator和discriminator:
首先随机初始化一个generator和discriminator。在每次迭代运算中进行:
1.固定G(参数不变),更新discriminator。从database中采样出部分真实图片,generator生成图片分别经过discriminator,真实图片标签为0,生成图片标签为1,更新discriminator。
2.固定D,更新G。将vector输入G会生成一个相对没有那么清晰的图片,然后将它输入discriminator,会给出一个相对没有那么高的分数,我们现在的任务是“骗过”当前的discriminator,因此输入应该有一个相对较高的分数。
在实践中,我们通常把中间当作一个特别大的neural network,图片是一个很宽的hidden layer,前和后相对窄一些。
在这里插入图片描述
在这里插入图片描述
二、GAN as structed learning
在这里插入图片描述
structed learning:对于回归问题,输入X,会输出一个数值;对于分类分体,会输出一个类别(one-hot向量)。对于structed learning,输出可能是一个序列、一个矩阵、一个图、一个树等等。
在这里插入图片描述
像机器翻译、语音识别、聊天机器人等都是structed learning。GAN可以用到这些方面,如让聊天机器人说的更好。
在这里插入图片描述
输出矩阵的情况。

structed learning是一个很有挑战性的问题。
在这里插入图片描述
因此,机器必须要有归一化的概念。数据都是由component组成的,比如图像是由像素组成的,一个一个的生成像素,要考虑如何把像素组装起来,会是一张人脸或者是一张嘴巴。
在这里插入图片描述
即要有大局观。
在这里插入图片描述
通常structured learning有两种方法:一种是bottom up的方法,一种是Top Down。Bottom Up的方法通常是一个component一个component这样生成,这样自然缺点是缺少大局观;Top Donw的方法是先生成整个object,再看一下object生成的好不好。因此将二者结合,分别作为generator和discriminator,于是生成了GAN网络。

三、Can Generator learn by itself?
在这里插入图片描述
类比图像分类工作,其实是可以实现的,输入一个vector对应输出一个image。但是这样的pair很难找,比如不同的image代表同样的数字,但是vector是不一样的。
实际上,我们可以训练一个encoder,得到一张image的vector。
在这里插入图片描述
我们可以训练一个encoder:输入一张图片,通过encoder得到vector,再通过decoder得到一张图片,我们要优化的目标是使得两张图片尽可能接近。得到的vector即为我们所需要的。同时我们也可以看出,decoder就是generator。
在这里插入图片描述
对auto-encoder进行采样,可以得到一系列的值,可能越往右,越倾向于出现“棍子”,越往左,越容易出现“圈圈”等等特征。
在这里插入图片描述
但是aoto-encoder会有一个问题,比如输入向量a可能会出现一个“1”,输入向量b会出现另一个”1”,那么取a和b的平均会出现什么呢?可能会出现噪声。(因为NN是非线性的)

在这里插入图片描述
为了解决上述问题,提出VAE(变分自编码器),生成的向量每个值都会对应一个variance和噪声,将m加上噪声和指数下的variance,得到c,使得产生的向量更加稳定。

在这里插入图片描述
在这里插入图片描述
VAE其实做的是让两张图片越像越好,但是这样训练可能会出现如上四种情况,显然第一行的两种情况是不合适的(不像人手写的数字)。
在这里插入图片描述
事实上,对于神经网络,最后一层的输出为图片的每个像素值,它的每个节点之间不会相互影响,因此对于structured learning来说,学习是困难的。因此只有一个generator是难以得到一张好的图片的。
其实只用一个AutoEncoder作为generator来训练,也有办法得到图片,但是需要更深层次的神经网络,即将最后一层本来可能不太相关的值连接起来。因此生成图片我们可以用GAN来训练,也可以用深层次的autoEncoder来训练。

四、can discriminator generate?
在这里插入图片描述
在不同文献上,discriminator有不同的名字,比如evaluation function ,potential function,energy function等等。
其实discriminator是可以做generator的。

在这里插入图片描述
discriminator较generator容易得到周围的信息。比如一个卷积核,如果有左边的离群点,会得低分。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果只用discriminator,我们手里只有真实数据,只给真实数据打标签1显然是不合适的。因此我们需要做一些负样本,比如加入噪声作为负样本,这种方式其实不是很合适的,比如上图中最下面的图片,可能会打0.9分。
那么怎样生成真实的负样本呢?
在这里插入图片描述
如果只有discriminator,要训练discriminator,需要进行迭代。如上图,先随机生成一系列加入噪声的图片,然后进行迭代:学习矩阵D,使得它可以分辨生成的噪声图片和真实图片,并且此时discriminator选出一些它认为清晰的图片,然后拿这些图片作为负样本继续进行迭代。

在这里插入图片描述
实际上image是分布在一个高维空间的,discriminator是很难把数据没有出现的位置都压低(生成数据)。
在这里插入图片描述
比如上图,第一章图中,可能生成的负样本位于真实样本左边,但是右边就会很高,然后生成了右边的数据,再把右边的生成数据压得很低。但是这仅仅是在低维空间中进行展示的,在高维空间中生成数据,一定有不会出现的位置。由于训练过程是迭代的,因此discriminator仿佛在不断寻找自己的弱点。
在这里插入图片描述
当真实数据和generate出来的数据分布重合在一起,训练就结束了。
在这里插入图片描述
以上模型其实就是discriminator,只有discriminator其实是可以生成数据的。
在这里插入图片描述
generator和discriminator比较:
generator比较擅长生成数据,但是它难以考虑component之间的关系,只学到的事物的表象,比如图片是根据逐像素进行模仿的,学不到大局。
discriminator的优点是考虑了component之间的关系,但是它需要解argmax,此时需要假定discriminator model是非线性的,否则没法解,这样就限制了它的能力。
在这里插入图片描述
generator实际替代的是argmax。
在这里插入图片描述
GAN的优点即为generator可以代替argmax函数,discriminator可以产生相关联的component。
在这里插入图片描述
VAE对比GAN生成图片,GAN会生成很清晰的图片,VAE可能会生成比较模糊的图片,因为VAE可能会考虑到mixture之间的关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值