李宏毅GAN学习笔记—— 简介

2019-07-23  本文已影响0人  魏清宇

以图片生成为例

算法过程:

先固定G,训练D

首先初始化D和G的参数,然后进入迭代过程,在每一次迭代中,先固定G,训练D,然后在固定D,训练G,每次迭代中重复这个过程,以一次迭代过程为例,如上图所示,第一步固定G,训练D:首先G根据随机输入的向量得到一组图片,由于向量是随机输入的,所以得到的图片质量会很差,然后固定G,从真实数据库中采样,获得真实图片,然后此时就得到两组图片,一组是G生成的假图片,一组是从数据库中得到的真图片。根据这两组图片对D进行训练,目标是使D对真实图片的评分高,而对G生成的图片的评分低。然后进入第二步,对G进行训练。

固定D训练G

在第二部中,对G进行训练的目标就是使其“骗过”D,生成让D识别不出来的假图片,即让D对G生成的图片打高分,此时输入是随机向量,然后通过G产生一个图片,然后D对其进行识别并评分,在这里,整个系统构成了一个大的神经网络,G+D表示这个大神经网络中的层数,其中G的输出就是其中一个高维隐含层,整个训练过程就是固定D,对G包含的前几层进行训练,可以通过梯度下降等方法进行训练,目标就是是的输出数值越大越好。

        蓝色部分是对D进行训练,让D对database中的图片评分越高越好,对G生成的图片评分越低越好。首先是在数据库中采样m个向量,作为正例;第二行表示根据一个分布随机采样m个向量;第三行表示根据在第二行分布中获得的样本,在G中生成m个负样本,可能是m个假图片;第四行开始根据目标函数进行训练,目标是让D对正样例评分越高越好,即为目标函数的第一项,D(xi)表示对在数据库中取得的样本x进行打分,打分越高越好;第二项表示对G产生的图片,评分越低越好,D(\tilde{x}^i ) 表示D对G生成的图片进行打分,则打分越低越好,则1-D(\tilde{x}^i ) 越大越好则整个第二项越大越好,加起来整个目标函数越大越好,则就是对目标函数取最大值,通过梯度下降法进行训练。

        红色部分是对G进行训练,G的目标是骗过D,即让D对G生成的图片评分越大越好。第一行表示随机采样,将样本输入到G中就会得到一些图片。第二行表示对G进行训练,是D对G产生的图片评分越高越好,G(z^i )表示G通过随机输入生成的图片,D(G(z^i ))表示D对G生成的图片进行打分,目标就是是这个打分越高越好,所以整体训练目标是是目标函数最大,同样可以通过梯度下降进行训练。

注意:以上算法只是举了一个例子,在真是问题中,可以根据需要调整采样方式,目标函数,以及训练方式。

一个例子

上图下方变量表示输入(实际上输入是几十维的,这里的二维只是举例),(0,0)的输入可能表示左边的人脸,(0.9,0.9)可能表示右边一列的人脸,通过不断调整输入,G可以产生从左到右变化的人脸。这一过程可以由GAN通过训练自己得到。

Structured learning

传统的机器学习

        传统的机器学习可以表示为一个函数,即,找一种x与y之间的对应关系,在给定输入x的情况下,能输出y:如回归,输出一个数值,分类问题,输出一个类。而结构学习是输出一个序列,一个矩阵,一张图片之类的带有结构关系的输出。如下图所示:

结构学习

上图输入一个句子,进行翻译,输入一张黑白图,产生一张彩色图,甚至输入一段文字,输出一张图片等,都是结构学习,结构学习问题是具有挑战性的,因为在进行学习的时候,机器需要更具有“智能”,有一种大局意识,规划意识,如在产生图片的时候,他要考虑到图片的布局,而不是单纯的输出一个个向量,在进行翻译的时候,要对整句话有规划,不能简单地输出一个个字符。

结构学习的挑战——全局意识 GAN——结构学习的方法

传统的结构学习方法一种是基于成分的学习方法,这样会忽略component之间的关系,效果较差,另一栋是从整体来对输出进行评估,实际效果也不理想。而GAN则是将两者结合起来,Generator完成component水平上的工作,Discriminator完成整体评价的任务,因而就产生了GAN。

两个问题:为什么G不能自己学习?

G的过程

G要做的就是给定向量,生成一个图片,如果能自己学习的话,G应该是通过对不断的输入向量-图像对进行训练学习,最后能实现给定向量输出图片,那么向量—图像对怎么获得呢,有人可能会想,向量随机生成就可以了,给定随机生成的向量,输出指定的图形,但是图像之间的相似性无法通过向量之间的区别进行捕捉,比如同样是一,一个是左偏的,一个是有偏的,他俩是存在相似性的,但是如果表示他们的向量是随机生成的话,可能就无法表示这种规律。而且,进行机器学习的时候需要存在大量的样本,分类器才能将不同的样本分成不同的类,每一类包含大量具有共同特征的样本,但是在G的训练中,可能每一类只有一个图片,类似于在进行分类的时候有很多类,每个类中可能只有一个图片,而且训练集和测试集中的图片不重合。G可能生成之前完全不存在的图片。在这个时候,一种根据图像获得向量的方法就是auto-encoder:

auto-encoder

Auto-encoder由一个编码器和一个解码器构成,编码器编码规则,将一个图片编码成一个向量,解码器根据规则将向量解码为图片,两个同时训练就可以在输入一个图片的情况下尽可能输出相似的图片(本人没有了解过auto-encoder,以上解释仅是对课程粗浅的理解,如有错误请见谅),而Generator就是起到了解码器的功能。

解码器与Generator auto-encoder的不足

根据auto-encoder得到一个向量对应一张图片,如上图向量a对应左斜的1,b对应右斜的1,但是如果把他们平均一下呢,他并不会产生正的有,因为NN Genarator是非线性的神经网络,实际产生的并不一定是数字。

VAE

为了让auto-encoder产生图片,在输出时不止产生code(向量),还会产生每一纬的变量,从一个分布里采样一些noise,将Noise和变量相乘,然后加到code上,将合成后的code输入到decoder里,让其还原原来的图片,有了这个技术,则机器在看到code+噪音的时候,也会产生合理的结果,而不会产生None,使训练的结果更具稳定性。但是这种训练方法还是会出现一些偏误,可能会出现和原始输入有区别的图片,这时如何对结果进行选择显得十分重要,

如上图所示,单纯的使输入与目标越像越好,则机器可能会选择第一排的图片,因为前两张只错了一个像素,但是从事实来看,后两张图片才更像人手写的数字。这就是机器忽略了输出的每一纬度每一个component之间的相关性。

如何解决

如果不用GAN,还是用auto-encoder的话,理论上来说可以通过加深网络的层数来实现得到和GAN一样的结果。

如何用Discriminator来生成image G与D的特点
上一篇下一篇

猜你喜欢

热点阅读