GAN 暨生成对抗网络(Generative Adversarial Networks)是由两个彼此竞争的深度神经网络——生成器和判别器组成的。
生成器和辨别器的目标是生成与训练集中一些数据点非常相似的数据点。
GAN 是一个非常强有力的想法。甚至 Yann LeCun 都称赞道这是近 20 年最酷的想法。他希望是自己发现了 GAN 而不是 Ian Goodfellow。
目前,人们利用 GAN 可以完成不同种类的生成任务,它能够生成现实中的图片,三维模型,视频和其他更有价值的成果。
GAN 的生成样例
生成类似于 MNIST 数据库的手写数字图片——甚至连人类都无法区别生成的图片和真实图片
使用 StackGAN 基于文字描述生成图片
使用 DCGAN(深度卷积对抗生成网络)生成人脸
使用 DCGAN (https://github.com/mattya/chainer-DCGAN) 生成动漫人物
利用一张静止的图像预测下一帧图像
生成三维模型
除了生成实物外,你还能基于抽象的想法做算术运算,比如摘掉人脸上的眼镜!
面部的数学运算: DGGAN-code (https://github.com/Newmu/dcgan_code#arithmetic-on-faces)
那么添插图片会怎样呢?
给定两张图片,它能生成从一张图片转化成另一张图片这个过程的所有图片。
还有许多你能
让人印象非常深刻,不是吗?
GAN 背后的理念
举个例子吧,假设我们想让 GAN 生成类似于训练集(如 CelebA 数据库)中的人脸图片
我们生成器的架构可能会像下面这样:
对于一个 DGGAN 生成器而言 , 输入是一个随机法向量并通过反卷积栈输出图像
辨别器
辨别器的输入是一张图片,通过卷积栈后输出这幅图是否为真的概率
我们的整个 GAN 架构将会是这样的:
GAN 架构
「生成器努力生成让辨别器认为是真的假图片。然后当一张图片输入时,辨别器会尽最大的努力试着辨别真的图片和生成的图片」
生成器和辨别器会共同进步直到辨别器无法辨别真实的和生成的图片。到了那时,生成式对抗网络只能以 0.5 的概率猜一下哪张是真实的哪张是生成的,因为生成器生成的人脸图片太真实了。
官方 GAN 论文:
生成模型可以被看作是一队伪造者,试图伪造货币,不被人发觉,然而辨别模型可被视作一队警察,努力监察假的货币。游戏当中的竞争使得这两队不断的改善方法,直到无法从真实的物品中辨别出伪造的。
在理想最优状态,生成器将知道如何生成真实的人脸图片,辨别器也会知道人脸的组成部分。
最优生成器
直观来说,之前在生成器中展示的代码向量将会代表抽象的东西。例如,如果代码向量有 100 维度,可能会由一维自动代表了「面部年龄」或「性别」。
为什么生成器会学习到这种表示呢?因为知道了人们的年龄和性别会帮助你画出更适合他们的人脸图片。
最优辨别器
给定一张图片,辨别器必须找到正确区分真实和生成的人脸的部分。
直观上说,当辨别器中的一些隐藏神经元看到比如眼睛,嘴巴,头发等物体时,他们就会被激活。这些特征对之后的其他任务比如分类是很有用的。
如何训练
我们共同训练生成器和辨别器,让他们变得强壮,通过反复训练防止其中一个网络比另一个网络强大太多。
为什么轮回训练网络使双方共同变强而不是单独训练让他们的性能更强大?
如果其中一个网络太强大,另外一个会因能力太差而导致两个网络性能都弱化。一个网络不知道自己在跟低级的网络竞争而导致其认为自己很高级。自作聪明的网络就会对低级的网络过拟合。
训练辨别器
给它一张训练集中的图片和一张生成器生成的图片,如果得到的是生成图片辨别器应该输出 0,如果是真实的图片应该输出 1。
从技术性的角度:交叉熵的损失可以由最优控制器弥补,小菜一碟!
训练生成器
生成器必须努力让辨别器在得到它生成的图片后输出 1。
现在,这有一个有趣的部分。
假设生成器生成了一张图片,辨别器认为这张图片有 0.4 的概率是真实图片。生成器如何调整它生成的图片来增加这个概率,比如说增加到 0.41?
答案就是:
为训练生成器,辨别器不得不告诉生成器如何调整从而使它生成的图片变得更加真实。
生成器必须向辨别器寻求建议!
直观来说,辨别器告诉生成器每个像素应调整多少来使整幅图像更真实一点点。
技术上来说,通过反向传播辨别器输出的梯度来调整生成图片。以这种方式训练生成器,你将会得到与图片形状一样的梯度向量。
如果你把这些梯度加到生成的图片上,在辨别器看来,图片就会变得更真实一点。
但是我们不仅仅把梯度加到图片上。
相反,我们进一步反向传播这些图片梯度成为组成生成器的权重,这样一来,生成器就学习到如何生成这幅新图片。
我重复一遍,为生成好的图片,你必须向老师展示你的工作,得到反馈!
如果辨别器不帮助生成器的话,那就太残酷了,因为生成器实际做的工作比辨别器更艰难,它生成图片!
这就是生成器如何被训练的。
就像这样,来回训练生成器和辨别器,直到达到一个平衡状态。
如果你很困惑,这是在初期盲目状态下,两个网络努力学习对话的直观感受:
G:我有一张人脸图片,它跟你以前见过的相比,足够真实吗?
D:比较真实但也比较像是你生成的图片。(对真实图片,辨别器产生 0.4 的概率) 我不太确定但我猜你给我的应该是一张生成的图片。
G:你猜对了!是我生成的一张图片。我应该怎样调整来让它更真实呢?
D:让我想一下 (实际上在大脑里在做反向传播运算) 我认为你应该往图片里添加一对眼睛,人脸图片通常会包含眼睛。
(技术上来说:我认为你应该增加第 0 号像素的灰度值增加 1,第 1 号像素的灰度值减少 5 个,..., 第 4095 个像素的灰度值增加 8 个)
G:收到 (反向传播那些梯度给所有的权重)
Dumbness
以上是一段比较初级的对话。双方都很白目。辨别器甚至不确定面部是否应该包含眼睛。它甚至说生成的没有眼睛的图片真实!(一个高级的辨别器对这张图片一定会说不,因为一张人脸图片肯定会包含眼睛!)
经过一段时间的训练,它们会变得越来越聪明,直到他们达到非常高级的最优状态。
这里是两网络在最优高级状态学习时对话的直观感受:
G:我有一张人脸图片,它跟你以前见过的人脸图片相比足够真实吗?
D:这张图片真的很真实 (对真实图片,辨别器会产生 0.5 的概率) 但是这张图片是不是真的,我完全没有头绪。因为显而易见的是,你在生成真实图片上做的太好了。
G:这是我生成的一张图片。我知道这已经是真实的了但是我想要更多,我应该如何调整来使它变的更真实?
D:让我想一下 (实际上大脑里在做反向传播) 我认为你的图片已经有了我认为需要有的部分。我看起来非常真实。显然你的图片包含眼睛,嘴巴,耳朵,头发,图片里是一张年轻男孩的脸。我不认为我有建议的东西。但是如果你想的话,可以把年轻男孩的胡须去掉。
(技术上来说,我认为你第 0 个像素灰度值增加 6,第 1 个像素灰度值减少 7,...,第 4095 个像素灰度值增加 2。)
G:收到 (反向传播那些梯度给所有的权重)
Cleverness
它们变的高级之后,生成器会生成真实的图片,辨别器不再能辨别生成的图片。
它们在无人监督的情况下也都能理解胡须,眼睛,嘴巴,头发,年轻的脸庞。
你已经达到了一种平衡。
如果你持续不断的教导生成器如何使照片更加真实,就会很可能过拟合,就像辨别器会认为一个小男孩根本就不应该有胡子一样。辨别器会产生这样的想法,但是这可能不对。就像你不应太过依赖老师的意见一样。继续训练也不会得到任何东西。
结论
两个网络并不是一直都在斗争,它们不得不协同合作以达到共同的目标。在整个训练过程中,辨别器不得不教导生成器如何在生成的数据上微做调整。同时它也一直都在学习如何做一个更好的老师。
它们共同变强,在理想状态下,会达到一种平衡。
Bonus
若你想直接从 GAN 的发明者那里取一点经,请看这个 Ian Goodfellow 的视频:
以及一个Github:
https://github.com/off99555/machine-learning-curriculum