生成式对抗网络GAN(Generative Adversarial Network)

network作为generator生成更加复杂的distribution,应该怎么做?这是我们这节课要讨论的问题

generative model适用于哪些场景呢?

简单来说,就是输出需要一些"创造力"的时候,例如绘画,聊天机器人等

在normal distribution中vector的数量并不多,可能50-100左右,但是可以生成具有相当大维度的图片

discriminator可以用来判断输出的图片的好坏,对GAN的输出结果进行评价

generator会根据discriminator不断修改自己的输出能力,但是discriminator也会不断提升自己的判断能力,最终形成了对抗的样子,也就是adversarial

下面详细介绍这两个network的训练过程

首先对两个模型进行初始化,先用一些简单的vector作为generator,然后用一些正确的图片输入用于discriminator,**discriminator就是训练用来判断正确图片与生成图片的不同(**可以使用分类方法:好的作为1不好的作为0,也可以作为回归问题来做),该步骤是固定G更新D

第二部:固定D,更新G,让生成器去欺骗已经学好的D

之后重复以上两个步骤:

我们的目标是尽量减少PG和Pdata之间的差异,可以用Div实现

我们在进行divergence需要先获得生成器生成的sample和真实数据的sample

下面就是discriminator的任务,将真实值Pdata的得分改成越大越好,将生成器生成的值PG得分越小越好 ,下面的V函数就相当于cross entropy前面加了负号,那么cross entropy越小,V函数的值越大,所以也要尽量缩小cross entropy的值,计算交叉熵时,真样本靠近1,假样本靠近0,得出的值越小,而计算图中的V时,真样本靠近1假样本靠近0,计算得出的值反而越大

详细解析:为什么要采用这样的写法来计算V

下图可以直观的展示divergence和discriminator生成之间的关系:

之前我们总是想找到divergence的表示方法,现在发现maxV(D,G)就和divergence有关,所以可以直接替换

不同的divergence如何设计他们对应的objective function?但是一般来说即使把divergence训练的很好了,但是GAN的总体模型效果可能还是不行

训练GAN的一些小tips:

一,JS divergence可能带来什么问题?

有两个局限:1,真实值和生成值可能都是高纬度中的很小的一部分,重叠部分可能被忽略不计 2,我们在sample的时候如果数量不够也可能导致重叠的部分很少

两个分布如果没有重叠算出的结果永远是log2,如果没有重叠,分类器的训练结果正确率总是得到100%,没有任何意义

由此我们换一个计算divergence的方式,引入wasserstein distance

这个概念类似于推土机,P是我们生产的,Q 是我们需要靠拢的真实值,wasserstein distance就是这两个中间相差的距离

有时候P和Q会变得更加复杂,所以我们需要穷举所有情况来找到最好的

回到之前的例子:

WGAN:用wasserstein distance代替JS divergence

计算公式如下,注意其中的D不可以是很复杂的function,需要是一个比较平滑的function,因此我们对Dfunction做了限制

那么使得D function函数更平滑的方法有哪些呢?

WGAN要求判别器(critic)满足 1-Lipschitz连续:梯度的范数不能超过1,保证Wasserstein距离可以被正确估计。下面三个都是用来强制满足这个约束的方案:

SN方法目前看训练效果最好,但是不是有WGAN就一定特别好train

GAN为什么这么难训练?

因为只要其中一者不再进步,训练结果没有改善,另外一者也跟着停下来无法改善,generator 和 discriminator需要相互匹配

GAN在处理Sequence问题会遇到的问题:

如果Decoder发生了微小的变化,但是由于generator每次是选择最大值,产生的微小参数变化可能并不会影响最终的输出,所以最后discriminator的得分也就无变化,这样无法去微分,和我们之前所说的梯度消失的问题类似

所以很长一段时间用GAN来生成Sequence文字是非常困难的

更多的生成模型:

但是一般还是GAN产生的结果最好

其他可能的解决办法:直接输入图片向量,但是向量顺序要按照特殊的方式排列,进行训练,最终直接输出图片,相关的文章如下:

那么我们如何来评定一个generator的好坏呢?

方法一:对于人脸

可以用生成generator去辨识人脸,例如对于有一千张人脸的数据集,一个辨识出九百张,一个辨识出三百张,可以看到辨识出九百张的效果更好

方法二:对于多张图像内容的图片

可以使用图像分类器对结果进行分类,**如果分类的结果越陡峭不平坦(**说明生成图像特征明显很好分类),说明生成图片的效果越好

但是方法二需要警惕一种Mode Collapse现象的发生:

这种现象是指生成图像开始围绕一个图像打转,多样化越来越弱,目前还没有特别好的方法,一般出现mode collapse现象就会停下来使用之前训练好的model

还有一个可能的问题被称作------Mode Dropping

那么如何来查看生成图片的多样性呢?

同样可以借助imager classifier来进行统计,对生成的图片进行分类然后取均值,如果结果平坦则是正常,如果出现陡峭的结果则是不正常,某一类别出现很多次说明生成图片结果相似

我们可以用IS来判断生成图片的质量,但是人脸由于只有一个类别,并不适合哟用这个方法来判断

但是quality我们一般是针对一张图片进行CNN分类判断,生成的组别越陡峭说明效果越好,diversity是所有图片分类取均值,结果越平坦效果越好

FID可以弥补上面所说无法辨识人脸的情况,它的特点在于把输入到softmax之前的向量进行判别

我们在生成人脸时可以同时看辨识人脸的数量和FID值,这样可以使结果更准确

有时候FID很低,人脸分数也不错,但是GAN的效果还是不行,因为和真实数据的人脸一摸一样,我们需要的是新生成的人脸,这时候我们就需要计算两者的相似度

conditional generator GAN

例如文本生成图片,我们要输入文字,和sample的Z一起输入,当然它本身也要有相关的标签库

在conditional GAN中generator和discriminator两者应该如何设计?

generator的输入会增加附属条件x,那么discriminator就不能把图片质量作为判断生成好坏的单一指标,还要看是否满足x条件,如果两者都满足才能得到高分,所以如果出现文字和图片成对的资料就给1分,如果不匹配就给0分

还有一种情况就是生成的图片很好但是文字不匹配,这种情况也不能打高分,我们在一开始训练discriminator时就要告知这一细节

其他应用:

图片生成图片

图像产生图像的处理流程:

GAN在unsupervised(无监督)数据上的应用------Cycle GAN

我们想要将显示的人脸转化为二次元的人脸,但是没有成对的训练数据,那么应该怎么做呢?

前面的模型都是在成对的数据的条件下完成的、

如果只是使用一个generator,生成一个二次元图像我们无法验证准确率有多高,因为没有成对的数据给我们检验,这种情况在使用一个generator,将生成的二次元图像恢复成现实图片,这样可以实现检验,形成cycle,同样y也要进行类似的检验处理

类似的模型:

多种不同形式的数据相互转化:StarGAN

其他的示例模型:文字循环转换

不同形式数据转换的其他应用:

相关推荐
ZZHow10241 小时前
神经网络与深度学习笔记_Day1
人工智能·pytorch·笔记·python·深度学习·神经网络·机器学习
天天代码码天天1 小时前
拍了一大堆照片,哪些糊了?我用 C# 做了一个离线筛选助手
人工智能
DolphinDB智臾科技1 小时前
数智筑基·算启未来 ——2026 AI+金融基础设施前沿创新对话 共探金融智能化发展新路径
人工智能·金融
在所不辞兄1 小时前
【人工智能驱动的电催化研究-01】人工智能是什么?AI、机器学习、深度学习和神经网络之间有什么区别?
人工智能·深度学习·神经网络·机器学习·有限元仿真·电化学·电催化
xsd202411181 小时前
VLX-VR:帮你从视频里找出 SOP 的隐藏风向
人工智能
loulanyue_1 小时前
AI Agent记忆从不是向量库:Oracle拆解读写分离与记忆晋升门,终结无脑存聊天的伪智能——读Wojtek Pluta演讲
数据库·人工智能·oracle
A7bert7772 小时前
【MobileSAM部署至RK3588】环境适配→转换RKNN→开发板部署
c++·人工智能·深度学习·目标检测·ubuntu
Ada's2 小时前
【公司系列】001:墨芯科技
人工智能·科技