本课程是针对李宏毅教授在Youtube上上传的机器学习课程视频《Introduction of Generative Adversarial Network (GAN)》的学习笔记。
Introduction
某人在Quara上的问题:非监督学习领域最近有没有什么突破性的进展呢?
Lecun大神亲自回答:对抗训练可能是有史以来(since sliced bread,有一个好东西出现的意思)最酷的东西。
又有人问:最近在深度学习领域最近有没有什么突破性的进展呢?
Lecun大神答:Generative Adversarial Network (also called GAN), it’s the most interesting idea in the last 10 years in ML in my opinion。
- How to pronounce “GAN” (2333)
Outline
Basic Idea of GAN
我们通常用GAN来生成某些东西,即需要一个生成器(Generator),他可以是一个神经网络(NN),或者任意一个函数。
那生成器怎么生成东西呢?我们会喂给生成器一个向量,这样它就会给定一个我们想要的输出。至于输出什么就取决于我们需要什么。比如我们需要输出图片,那么实际上生成器就应该输出一个能表示图片的矩阵。也可以让生成器输出一句话/sequence。
如下图:我们用二次元人脸生成作为例子。
输入给生成器的向量的不同维度代表了输出结果的某些特征。比如假设第一个维度代表了人物头发的长度,那么其值越大,生成的人物的头发就越长。或者假设倒数第二维决定头发是不是蓝色;或者假设最后一个维度代表嘴巴是张开的还是闭着的。
GAN的突出部分在于:它还引入了另一个角色–判别器(Discriminator)。
判别器本身也是一个NN。当将一个图片输入判别器,它会输出一个标量(scalar),表示该图片有多大可能性是人画出来的,值越大表示它认为这张图片越可能是人画的,反之则认为是机器生成的。
能不能比较准确地判别取决于判别器学得好不好。
那为什么我们会需要判别器呢?
Ian Goodfellow(GAN的作者)给了一个很符合直觉的比喻:
印假钞的犯罪者会尽量制作和真钞尽可能想象的钞票(生成器),而警察会尽力去判别哪些钞票是真的,哪些是假的(判别器),而针对警察鉴别能力的提升,犯罪者也会不断针对性地提高印假钞的技术,使得警察无法鉴别真钞和假钞,即骗过警察。
这里,李老师也举了一个例子:
枯叶蝶可以很好地伪装成一个枯萎的树叶的样子,但它的祖先其实并不是这样,而是和普通的蝴蝶一样颜色五彩缤纷,还很鲜艳。但是枯叶蝶一直有一个天敌鸟,天敌鸟会认为彩色的明显是蝴蝶,不会是枯叶的那种棕色的。于是由于物竞天择,枯叶蝶进化了一代,变成了棕色,但是不久后,天敌鸟也学到了,它进一步了解到,蝴蝶是不会有叶脉的的。于是又由于物竞天择,枯叶蝶生成了叶脉纹路,进化成了今天的样子。而,天敌鸟也跟着进化…两者的进化不断交替,不断升级…
在这个例子中,枯叶蝶扮演了生成器的角色,而天敌鸟扮演了判别器的角色。
那生成器和判别器的互动是怎么进行的呢?
如下图,一开始,生成器NN的参数是随机的,给它输入,它一般会产生很混乱、不符合期望的图片。而我们会给它喂人造的图片(real images),让它学习人画的图片是什么样子的,有哪些特征?然后判别器就来判断:某张图片是生成器生成的,还是人画的。
比如,可能第一代的生成器(v1)很弱,只能生成黑白的图片,而人造图片都是彩色的,所以判别器只需要看图片是黑白还是彩色就能准确判断。
那么接着,生成器就会有针对性地进化到第二代(v2),进化的方向是能够骗过当前的判别器,比如第一代的判别器靠颜色来判断,那生成器就会开始也生成彩色图片。
而判别器发现它会被生成器伪造的的彩色图片骗过后,它也会开始有针对性地进化,即开始尝试发现真实彩色照片和生成器伪造彩色照片之间的差别,比如说可能伪造的照片都没有嘴巴,而真实的照片都有。于是,判别器开始根据有无嘴巴来判断。
那么,接着,生成器也继续进化(v3),开始画嘴巴…两者如此互相交替循环地针对对方的新能力进行进化,互相角力,促使彼此都做得更好。(这也就是对抗生成网络中的“对抗”(adversarial)一词的由来)
- 那为什么不能说生成器和判别器是合作互相促进呢?
答:其实也可以,只是说法问题。我们再看下面的例子:
把生成器看做学生,判别器看做老师。老师知道什么样的人物画是好的,什么样的不好,而学生就要和老师学习判别的能力。
那么一年级的学生(v1)什么都不会,画的东西给一年级老师看,一年级老师指出来不行,没有眼睛。
然后学生学了一年画眼睛后,把画给现在的二年级的老师看,以为二年级的老师会表扬他画得好,结果二年级的老师说,不行,没有嘴巴。
然后学生又学了一年画嘴巴….
这样,学生画的越来越好,老师也变得越来越严格。
这样,我们又有了两个新的问题:
- 为什么生成器不能自己照着真实图片学,非要判别器和它对抗呢?
- 为什么判别器不自己做呢?(自己画好的东西)
接下来,我们将逐渐尝试回答上述两个问题。
老师自己用GAN做的成果:
- update 100次:
- update 1000次:生成器学到了要产生眼睛
- update 2000次:生成器学到了要产生嘴巴
- update 5000次:生成器学到了动漫人物要有水汪汪的大眼睛
- update 10000次: