机器学习--05GAN生成式对抗网络--生成图片

简介

之前我们学习的网络模型都是一些,输入一个x然后得到一个函数y,现在要进入一个新的主题==》把network当作一个generator(生成器)来用,做当生成来用,特别之处在于我们输入数据的时候除了x还要输入simple distribution(生成z当作输入),每次使用network的时候这个z都是随机的,要求是distribution必须足够简单,这样会因为z的不同而y也变的不同了,从而y就是complex distribution这样的网络就是generator。而x和z要怎么组合可以是x向量和z向量拼接也可以是这两个向量相加得出。

如何来训练generator?为什么要训练generator?给机器一个输入要机器来预测接下来的操作,不过这个预测可能有几种情况(不是唯一答案,不同人可能有不同的想法),这个时候添加z让机器的输出是有概率的,不再是单一的输出,是一个概率分布(高维向量)。我们想要找到一个模型,但是同样的输入有多种可能的输出,而这些不同的输出都是正确的,这就是创造能力,比如绘画、多种答案。

模型Unconditional generation

generator(生成器)模型有很多种,但是最常用的就是==》GAN(Generative Adversarial Network)。

例子:让机器生成动画人物的头像,使用的模型是Unconditional generation(没有输入x,只有输入z,z是从normal distribution中取出来的向量)。给模型输入一个z(可能是一个向量,可能是一个值),通过模型输出我们想要的分布(一个很高维的向量),分布里面就有我们想要的结果。

在GAN里面除了训练模型gernerator以外,还要训练discriminator(本身也是一个函数-神经网络,输入是一张图片,输出是一个数值,输出越大表示输入的这张图片就越像一张真实的动画头像,两个网络模型--discriminator和gernerator(可以是CNN,也可以是transformer)=》变成一个大的模型)。GAN的概念是什么?为什么要多一个discriminator?generator不断更迭,而discriminator也不断更迭(理解为两种生物对抗的演化)。

步骤

比如我们是要用画出一个人物头像,那么generator怎么学习画出这个人物呢?第一代的generator的参数是随机的,输出的可能不是我们想要的结果,然后第一代的discrimination就是要分辨由generator产生的输出图片和真正的图片存在的不同,然后discrimination就发现generator的结果不是我们要的,此时generator得到discrimination传递过来的结果,于是自己就发生更新,所以第二代的generator就调整参数再生成新的结果(已经满足第一代的要求了),但是第二代discrimination也会进行更新,然后进行分辨第二代生成的结果是否满足正真图片的要求以此迭代下去,直到discrimination觉得generator满足要求。

具体generator和discrimination是如何运作的?

第一步:它们两个都是网络模型,都要有初始化参数,然后固定generator只训练discrimination,因为初始化参数都是随机的,并且不训练generator,所以把generator结果给discrimination模型,此时generator模型输出的结果是很不让人满意的;然后再从数据集中把真正二次元的图片样本和刚刚从generator模型得到的结果一起输入给discrimination去训练,它训练的目标是要分辨真正的二次元图片和generator所产生图片的差异,所以对于discrimination要做的可能就是一个分类问题;

第二步:刚刚训练完discrimination,我们把discrimination给固定住,然后再训练generator,还是给generator一个向量然后它会得到一个图片输出,训练的过程就会调整自己的参数,目的是让训练完之后generator产生的图片能骗过discrimination,让discrimination认为这次generator产生的图片和真正的图片是一样的,generator产生的输出当作discrimination的输入,然后训练discrimination。但在最后几层不会训练discrimination也就是不会调整它的参数,之后的步骤就是上面两步的循环迭代,但是都是从上一代继承过来的,不好重新设置不然太花时间了。

如下图我们把Generator和Discriminator两个网络当作一个大网络,中间隐藏层中会出现和图片一样大小的宽度深度等。所以这个网络就看起来是一个向量得到一个图片。

参数更新

为什么它们的互动能生成真正的图片==》训练的目标是什么?通过generator在训练(还是以往的框架gradient descent调参数、minimize降低loss函数值)的时候我们到底要minimize或者maximize什么东西?

首先从分布中取出一部分向量作为G的输入,它的输出作为Pg(复杂的distribution)的输入,然后还有一个完全是由真正数据作为输入而训练产生的Pdata(真正的distribution),所以我们希望Pg和Pdata是越接近越好。

那如何使得divergence变小呢(就是要真正的结果和训练出来的结果要越接近越好)?其实就是更新G中的参数。GAN有办法让它越小越好==》只要我们知道从discrimination和generator这两个网络中训练数据出来就有办法得到divergence,Pdata从真正数据中随机选择一些就行,G(generator)的输入向量是从normal sample中选择的向量然后得到Pg。然后把这些真数据和训练得到的数据一起给discrimination训练,目标就是看到真正数据给高的结果,看到训练数据就给低的结果。训练discrimination的式子maxV(D,G)(这个式子就和divergence有关)能判断这些数据相似不相似(如果相似就很难分开也就说明它们越接近,反之亦然),从而调整Pdata和Pg,这样我们更加不就用知道完整的Pdata和Pg的函数是什么样子就能得到divergence。

所以要经过generator找最小,经过discrimination找最大,两个一起优化参数,它们的互动就是找到minimize和maximize。

GAN训练技巧:

在模型训练的时候,Pg和Pdata选择的数据(sample)可能重叠的范围很小,所以不管两个结果是什么样子可能都会造成divergence变为log2,但其实它们两个已经很相近了,但是由于重叠范围小的原因我们查看divergence(理解为loss函数)的时候不能发现,所以我们就不能知道GAN模型训练的到底好不好。也就是因为GAN训练的时候两个模型相互互动来计算,所以GAN的模型可能不好训练的。

所以介绍一下GAN训练时的一些小技巧==》WGAN:改变divergence的计算方法,存在Pg和Pdata,目的是把Pg更好的变为Pdata(如下图就是把P的形状变的和Q一样),把Pg所有的调整方法进行穷举,然后找到一个调整最高效的方法(也就是移动最少就能达到最好的效果),所以经过训练的时候可以看到loss(距离)越来越好,而不是像上图使用JS一样不管距离远近计算结果都是log2。

如何来训练WGAN,目前最好的可能是SNGAN来训练。

评估

即使有以上的方法,但是对于GAN来说还是很难去训练,因为generator和discrimination两个的相互促进的,只要有一方出现了问题,那么整个模型就不训练了,所以我们期待的是每次训练的时候loss都会下降,如果有一次没有下降那么可能整个训练就进行不下去了。之前讲的都是拿GAN来做图片生成,其实拿GAN来做文字生成是最难的,在文字生成模型里面的decoder在GAN里面其实就是generator,然后它生成的文字再给到discriminator来判断是模型生成的文字还是真正的文字。更新参数的时候使用gradient descent来提升decoder的网络性能可能做不到,因为对于gradient descent更新的参数影响到输出结果可能只有小小的改变,这对于文字的最大概率来说可能不会产生影响(输出的向量中输出每个文字的概率大小,最大概率的就是要输出的文字),这个时候改为用Reinforcement Learning(强化学习RL),但是RL也很难来训练。当然也有其他网络能实现生成图片比如VAE、FLOW等网络,他们没有像GAN一样是由两个小网络组合成一个大网络的,但是他们一样很难训练。

如何评估generator的好坏:如果是图片==》可以是对生成出来的图片放到一个模型上让它判断这是不是一个人脸;对于一般的生成的结果我们可以这样来判断--把所有generator输出的结果放到分类系统中,分类系统的输出结果如果很集中那么输入的图片可能比较真实的图片。但是也有可能输入的图片很多都是相同的图片(训练的结果,可能是discrimination没有办法来区分-->即使到了今天还是有这个问题没有好的办法来解决);也有可能不能出现真实图片中含义的信息,生成的图片出现了特征丢失(也没有解决)。但是如果分类太过集中是否所有图片又是相同的呢?所以有使用两种检查方法来判断网络目前到底好不好。

单个模型是看单个图片是否集中,多个模型所有图片是否平均

当然这些措施也并没有完全解决GAN的问题:比如存在这种情况Generated产生的数据和真正的数据一模一样,但是对于上面的评测来说是很好,不过这些数据已经就存在了为什么还要G来生成所以这是不合理的……等等,所以评估一个GAN做的好不好也是一个大型问题。

模型Conditional Generation

有x和z的输入,不仅有文字生成图,也可以有图生成图的应用。也有让一个图片的脸动起来等。

应用

GAN运用到unsupervised learning(无监督学习)==》之前讲解都是supervised learning(就是说对于每一笔资料我们都有标签说明),而unsupervised learning是说没有标注资料的情况下进行训练,比如应用到真人图片转二次元图片。如下图,做法就是原先GAN的方法,但是还要加上一步就是要让输出的图片再转回G的输入,让这两个越接近越好,这就是Cycle GAN。

当然也有其他的做法如Disco GAN、starGAN、StarganVC等等……

当然也能把这些技术做文字风格转换、语言转换、文字语言转换(自监督)等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值