目前有时间的时候学习一下gan的知识,但是时间也不多,这里记录一下所学,不要太期待喔,完全是学习李宏毅老师课程的笔记,由于是新手,欢迎大家交流指错。
引言GAN已经作为一种思想来渗透在ML的其余领域,做出了很多很Amazing的东西。被Yann LeCun评价为近十年最有趣的idea,所以相关研究方向的同学gan成了一个必须要学的思想和方法。
GAN中包括两个最基本的组件,其中一个就是Generator,对于Image Generation过程来说,你给它一个向量,它输出一个图片(image)。
input: vector
output: image
如下所示:
![aaf25506cdcdc4fe6c3cd8f91a6315c1.png](https://i-blog.csdnimg.cn/blog_migrate/b32e7d94ee65b576555328e6d5f3d4ca.jpeg)
对于Sentence Generation来说,你给它一个向量,它输出一个句子(sentence)。
input: vector
output: sentence
如下所示:
![941fd5534422e8ced3d1028879d7e768.png](https://i-blog.csdnimg.cn/blog_migrate/a7bbce8d1dea19abad36910fe9859340.jpeg)
其中我们以image generation过程来仔细说明一下其中过程原理!
实际上Generator就是一个NN网络,输入是一个vector,它的输出是一个高维的向量,比如image是16*16,那么它的输出就是256维的向量。
如图所示:
![51e04a704ca036330ed13ce1c1e2c768.png](https://i-blog.csdnimg.cn/blog_migrate/8187a74a4535532d8ee2314735f5fed5.jpeg)
其中,输入向量的每一个维度都可以代表输出image的某些特征,比如说第一维度的值,代表着image人物的头发长短。
那么我们在调大input vector的第一维的值的时候,我们可以看到生成的image的头发变长,如下图所示:
![5dfd6e45a220c2b9868bd9aa52f94188.png](https://i-blog.csdnimg.cn/blog_migrate/c704e8a33d8b8cf95632ff5d7cc254f7.jpeg)
比如说,input vector某一个维度的值大小代表生成image的头发颜色蓝色深浅,调大后,生成的image头发变得更蓝一些:
![099494da3d22e713af5f8d0471ae25ac.png](https://i-blog.csdnimg.cn/blog_migrate/0c4d9185cbab375d48bab49e007f4844.jpeg)
或者说,input vector某一个维度的值大小代表生成image的口张开的大小,调大后,生成的image人物中口张的更大一些:
![62f6800344442219eddeb5b59d51c48f.png](https://i-blog.csdnimg.cn/blog_migrate/424dd91de8bdf566be845e9b3f07134a.jpeg)
总而言之,GAN中的Generator就是一个神经网络,丢给它一个输入向量,输出也是一个向量。
在不同的任务中,生成的东西不同,输入向量的每一个维度都代表着输出image的特定特征。
Basic Idea of GAN(Discriminator)讲完了Generator之后,我们来看GAN的另一个组件,Discriminator。Discriminator也是一个NN网络,它的输入是Generator的输出或者是真实的image...,输出是一个标量,代表接受的输入的quality有多好,数值越大,代表越好,数值越小,代表越差。
如下图:
![bd2661f48cf092a17c4e34f615b50202.png](https://i-blog.csdnimg.cn/blog_migrate/6bea6e22923b90bb8267ed839e2920ef.jpeg)
比如给它输入是真实的image,那么经过Discriminator之后应该是输出的标量值很大,代表送入给它的image的质量很高。
![2c915bbce0e67da2782adc03c440016b.png](https://i-blog.csdnimg.cn/blog_migrate/bd138730a158b034c37ce355d4a6f888.jpeg)
比如给它输入是差的image,那么经过Discriminator之后应该是输出的标量值很小,代表送入给它的image的质量很低。
![0365bba95cb9a4b1100597170bb64e02.png](https://i-blog.csdnimg.cn/blog_migrate/320b1769ce2dc265db0ba7eca1b0fdd3.jpeg)
下面我们来介绍一下最基本的gan的训练算法,不够严谨,但是容易接受。
首先,跟任何网络训练一样,我们需要初始化生成器G,和判别器D的参数
![a325cae6e785c1770a5c3d992b5ba4a3.png](https://i-blog.csdnimg.cn/blog_migrate/688cb49e6eb8b263b2bcaddd90654640.jpeg)
形式化公式就是如下:
![ddc0d50de80702031dfc87608031bf5b.png](https://i-blog.csdnimg.cn/blog_migrate/09db2e65bbd11af03a2bb5417a1fb40f.jpeg)
1、然后在每一轮中,首先固定住G,训练D,具体怎么训练呢?
我们任意选取一些向量,送给G,同时从database中挑选出一些数据,使得判别器学会从database挑选出真实的图片打分高,任意选取向量从G中生成的图片,打分低。这样就是在训练判别器:
![1b30d049cc6e45bdf01961124d550a6b.png](https://i-blog.csdnimg.cn/blog_migrate/e07429c32f01f36c6255fc65b614c2d8.jpeg)
形式化公式如下:
![ce3570afa1881dc54210e579574c83c0.png](https://i-blog.csdnimg.cn/blog_migrate/364c853e590af71446d5038c68569163.jpeg)
稍微解释一下图片中的公式,训练判别器就是希望它对于真实的图片打分高,生成的图片打分低。而公式中是最大化那个式子,分解来看完全对应文字的解释:
对应真正的图片打分高,也就是最大化如下公式,公式如下:
2、第二步是固定判别器D,训练生成器G,我们还是任意给定一些向量,这些向量送给G,生成一些图片,然后喂进判别器进行判别。
首先我们的目的是使得生成器能够生成非常真实的图片,对于真正真实的图片来说,判别器的打分是高的,那么也就是说,我们需要训练生成器,使得通过生成器生成出来的图片让判别器打分高,尽可能的迷惑判别器,这样通过生成器生成出来的图片就是接近“真实的”,土话说就是跟真的好像啊。
![e5146e2494804b9705eb6069fd5a14e3.png](https://i-blog.csdnimg.cn/blog_migrate/842ae5849548c596b640e24e65699ea1.jpeg)
形式化公式如下:
![8829b5141513a7a2ab86daf305027090.png](https://i-blog.csdnimg.cn/blog_migrate/8854832d838c5f7f0fe4f53b372ec1cb.jpeg)
公式解释为:最大化使得判别器对于生成器生成的图片打分。
这里需要注意的是训练生成器的时候,一定要固定判别器的参数,因为在实际实现中,生成器和判别器会构成一个大网络,如果不固定判别器的参数去训练生成器的话。
因为目标是使得最后的得分高,网络这个时候仅仅更新最后一层的参数就能让最后的输出标量非常大,很显然这不是我们希望的,如果固定了判别器后面几个layer,训练前面生成器的参数就能正常学习。
实例最后李宏毅老师给出了他自己用gan生成二次元头像的实例,下面分别给出训练了不同轮次的生成结果,给大家一个直观的感觉:
![172e02e13ee5c046224bbbe7762c7bfd.png](https://i-blog.csdnimg.cn/blog_migrate/967de285e3f721370d94ed91478f2cde.jpeg)
![05d681c26e13257997b675f8ca68e09b.png](https://i-blog.csdnimg.cn/blog_migrate/312702fb225186bc4b7a606635324769.jpeg)
![c7acfb890a72411c8ce79f5835e3cdbf.png](https://i-blog.csdnimg.cn/blog_migrate/c705b25c622443bce8e6e86dcfd86e4c.jpeg)
![9d68ea3610605a77a86184ac7aa8b27a.png](https://i-blog.csdnimg.cn/blog_migrate/eb1e1b2b332a076c3f97000d13bd890d.jpeg)
可能不少人会有疑问,就是生成一些牛逼的图像有什么用,模型再厉害,我拿一个照相机照出来的难度会比你差,这里解释一下,如果仅仅只能生成见过的图片,确实没有什么厉害的地方,但是如果可以“合理”的生成没有见过的图像,是不是就很有意思呢?如下图,中间的图片就是训练集中重来没有出现:
![1fb86590864527ceba33b41f80c3b1f5.png](https://i-blog.csdnimg.cn/blog_migrate/186b30c2bbbfe41349a5bb72b4196462.jpeg)
它居然自己学到了,在中间参数的时候,头像的转向等等特质,非常的amazing
视频资料如下:
https://www.bilibili.com/video/av23316535from=search&seid=13825323076277645807
—完—为您推荐
“12306”的架构到底有多牛逼?
中国程序员34岁生日当天在美国遭抢笔记本电脑,追击歹徒被拖行后身亡,为什么会发生此类事件?
阿里如何抗住90秒100亿?看这篇你就明白了!
60个Chrome神器插件大收集:助你快速成为老司机,一键分析网站技术栈
深度学习必懂的13种概率分布