生成式对抗网络(Generative Adversarial Networks,GAN)
主要通过模型中两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出
判别模型的任务就是判断一个实例是真实的还是由模型生成的;生成模型的任务就是生成一个实例来骗过判别模型,两个模型相互对抗,最后会达到一个平衡,即生成模型生成的实例与真实的没有区别,判别模型无法区分输入数据是生成的还是原始真实的数据
把GAN想象成是伪造大师和鉴宝专家之间的博弈,生成模型(generator)就相当于伪造大师,判别模型(discriminator)相当于鉴宝专家。Generator目的就是把假古董造的更像真的一样,从而骗过鉴宝专家;鉴宝专家则需要不断提高自己的鉴宝能力,尽可能的做出正确判断
生成模型G是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下。在GAN中,可以理解为输入一个vector,生成一个图片、语音、文本等有结构的输出
判别模型D是一种对未知数据与已知数据之间关系进行建模的方法,在GAN中,可以理解为判别器建立了训练数据与生成器输出的数据的关系,按训练数据的标准为生成的数据打分
以图像的生成为例:
- G负责生成图片。接收一个随机的噪声z,通过z生成图片G(z);
- D负责判别一张图片是不是“真实的”。输入是一张图片x,输出D(x)表示x为真实图片的概率,如果为1,代表是真实图片的概率为100%,而输出为0,代表不可能是真实的图片。
知道了生成器和判别器是什么,那么他们是怎么配合工作来推动GAN的学习的呢?
以学习画二次元人物头像为例:
- 第一步:我们最开始画人物头像只知道有一个头的大致形状,用笔也不行,画出来的一片糊,老师搭眼一看,垃圾!噼里啪啦给我们10个大嘴巴子,老师的快乐+10,我们的快乐-10;
- 第二步:我们痛定思痛,努力学习,画出的头像好多了,甚至还能看到水灵灵的大眼睛,老师参考一下二次元美图:鼻子呢!噼里啪啦给我们9个大嘴巴子,老师的快乐+9,我们的快乐-9;
- 第三步:我们进步了!老师又学习了一会二次元美图说:“我觉得不行”,噼里啪啦给我们8个大嘴巴子,老师的快乐+8,我们的快乐-8;
就这样一步一步,老师觉得我们画的头像和真正的二次元美图一样美的时候,就不再抽我们大嘴巴子,我们终于出师了,是一个合格的生成器了!(这里的老师就是判别器,判别器也是需要学习的,虽然老师水平高,但他不学习也不一定知道什么是美丽的二次元头像)
生成器和判别器通过零和博弈来学习:
零和博弈(zero-sum game),又称零和游戏,是博弈论的一个概念,属非合作博弈
它是指参与博弈的各方,在严格竞争下,一方的收益必然意味着另一方的损失,博弈各方的收益和损失相加总和永远为“零”,可以说自己的幸福是建立在他人的痛苦之上的,二者的大小完全相等,因而双方都想尽一切办法以实现“损人利己”
在上面的例子中,老师(判别器)抽我们(生成器)大嘴巴子,抽的越多他的快乐越多,我们的快乐越少,我们通过和老师博弈改变双方的快乐,但快乐数值的总和一直都是零,这就是判别器和生成器的零和博弈,这种博弈的关系也是GAN中“Adversarial”的由来
GAN算法流程
-初始化generator G 和discriminator D
-每一次迭代过程中:
- 固定 G, 只更新 D 的参数。从你准备的数据集中随机选择一些,再从 G 的output中选择一些,现在等于 D 有两种input。接下来,D 的学习目标是, 如果输入是来自于真实数据集,则给高分;如果是 G 产生的数据,则给低分,可以把它当做一个回归问题或分类问题
- 固定住 D 的参数, 更新 G 。将一个向量输入 G, 得到一个output, 将output扔进 D , 然后会得到一个分数,这一阶段 D 的参数已经固定住了,G 需要调整自己的参数使得这个output的分数越大越好,希望能骗过判别器