忙了三个多月的秋招终于接近尾声,得开始看点学术类的东西了,没办法,要毕业啊。想来想去还是觉得有必要写个GAN 的专栏记录自己在GAN 方面的学习历程。一方面,可以通过总结的方式来加深自己的理解;另一方面,也可以及时给自己反馈,规划下一步的学习目标。
这个专栏的文章里基本上不会出现比较晦涩难懂的概念或者复杂的数学公式推理,更多的是我个人在学习GAN 过程中对它的一个理解、相关知识点的整理和从网上各处搜来的插图以及相关连接,想要深入研究某个概念或者方法的同学可以去相应的连接找。后面如果涉及到实验的话,也可能会有一些代码。这个想法倒是不错,就是不知道实施起来能做到什么程度了。
1. GAN 与左右互搏
近几年,深度学习在图像、语音、自然语言等领域大放异彩,得益于模仿人类大脑神经连接的结构模型。至于为啥效果这么好,谁知道呢,反正好用就行了。深度学习的模型分为生成式模型和判别式模型两方面,目前深度学习的主要成果都是集中在判别式模型。生成式模型需要观测现实世界的统计样本,学习其内在统计规律,由于需要大量的先验知识、建模复杂等方面,发展缓慢。
GAN 是在2014 年提出的一种生成式模型,其全称是生成式对抗网络。GAN 使用两个神经网络进行对抗性训练来让生成模型逐渐取得良好的表现,绕开了传统生成式网络的缺陷。其实GAN 的思想很简单,就像老还童被困在桃花岛地洞里创造出的那一套左右互搏术。左右手做出不同的动作,互相打架,GAN 中的两个网络就是这里的左右手,分别称为生成模型(G)和判别模型(D)。
2. 多层感知机
知道了GAN 的主要思想以后,接下来面临的一个问题就是它的生成模型和判别模型各自是什么结构。原始的GAN 的G 和D 都是多层感知机,所以这一部分的内容就来讲讲多层感知机,在讲这个之前首先要看一下感知机。
(1)感知机
感知机最早出现于20 世纪50 年代末,可视为最简单的前馈神经网络(可以简单的理解为数据从前往后走)。机器学习算法中最典型的一个应用场景就是分类问题,所以我们这里都以分类为例来介绍相关的模型和结构。从上图可以看到,通过将输入向量的每一位乘上不同的权重然后相加即可得到一个结果,然后我们根据这个结果对输入的数据进行分类。
机器学习算法都是可学习的,所以我们需要给机器提供一个参考让它可以自行学习,从一开始的啥都不知道变成无所不知。这里讲的参考我们通常称它为目标函数,也就是说我们会给算法提供一个函数,让它尽可能地去优化这个函数,取到最小的值,如此一来就可以达到学习的目的,在感知机中,目标函数表示如下:
通过大量数据的学习以后,模型具备了较好的分类能力,这个时候我们可以让它来帮我们对大量的未知数据进行分类。此时,我们输入任意一条数据,得到的输出结构及分类的标准如下:
观察结果我们可以的看到,从几何学的角度来讲,u 的值的分布是在一条直线上的。结合下图,我们不难发现感知机有一个很致命的缺点:无法解决线性不可分问题,哪怕是最简单的异或情况。因为这个问题,这个伟大的发明被搁置了十几年,直到20 世纪80 年代有人提出可以用多层感知机来解决线性不可分问题。可见,正如罗胖在《逻辑思维》中所说的,伟大的事物会被发明两次,第一次是从无到有,第二次是大规模应用。不过纵观神经网络的发展史,似乎不止被发明了两次,咳咳,扯远了……
(2)多层感知机
既然一层不行,那我搞多层行不行嘞,由这个想法就产生了多层感知机:
可以看到,多层感知机这个名字还是满贴切的,在感知机的基础上多了若干层隐层。但是通过观察右边的公式我们可以发现,虽然公式长了很多,但是依然是由三个线性结构的子部分组成,也就说,它相对于感知机的提升充其量只是多了几条直线而已,结果依然无法处理线性不可分的问题。那为什么说多层感知机解决了这个问题呢?主要还是得益于下面要讲的激活函数。
3. 激活函数
常用的激活函数有很多种,这里不详细介绍,想要看的去这个链接:形象的解释神经网络激活函数的作用是什么?
这里主要看一下为什么激活函数可以辅助多层感知机解决线性不可分的问题,从上图可以看到激活函数大都是非线性结构,通过将激活函数施加在多层感知机的隐层上最终可以产生非线性分类方案,解决线性不可分的问题,此时,我们就可以得到类似下面的分类结果了:
PS:其实这里我有一个问题就是relu 激活函数的具体作用是什么,它似乎不是为了解决线性不可分问题,因为它本身也是一个线性结构。
4. 反向传播
上面有提到过机器学习算法的学习过程是通过优化目标函数来实现的,那这个过程放在多层感知机中又是如何实现的呢?
这里主要讲一下思路,详细内容可以参考这篇文章:多层感知机:Multi-Layer Perceptron
上图是一个典型的多层感知机结构,通过神经网络的前馈计算可以得到以下结果:
而我们此处用到的目标函数如下:
通过将y 的值带入目标函数可以得到一个完整的E,然后对E 求偏导可以得到W 和b 的更新策略:
5. Dropout
神经网络模型在训练的过程中一个很典型的问题就是过拟合,过多的神经元抓住了太多的局部细节而对训练数据具有较高的识别准确度,但是对测试数据的识别准确度较低。目前一个通用的解决方案就是使用Dropout 算法来选择性地丢弃一些神将元,降低模型与训练数据的拟合度。这是目前深度学习的一个基本算法,不是GAN 特有的东西,但是觉得有必要顺道提一下。这个算法也比较好理解,不多说,详细内容参考连接:深度学习中Dropout原理解析
6. GAN 的目标是什么
上面提到感知机和多层感知机都是通过优化目标函数来进行学习,GAN 也是如此,那在GAN 中的目标函数是什么,判别模型和生成模型又是如何学习的呢,于是就引出了下面的公式:
- Pdata 是真实数据分布
- Pz 是噪声分布
- G(z) 是生成模型根据随机噪声z 生成的模拟真实数据的假数据
- D(x) 是判别模型判断真实数据为真的概率
- D(G(z)) 是判别模型判断造假数据为真的概率
那前面的minmax 也就是GAN 中常提到的极小极大博弈是怎么回事呢?对于D 来说,它希望能够正确识别所有的数据,即判断真实数据为真,判断生成模型生成的数据为假,所以它希望让上面那个式子的取值尽量的大。但是对于G 来说,它希望自己造假的数据能够欺骗过D,所以它希望上面那个式子的取值尽量的小。两者交替进行更新,在博弈中达到传说中的纳什均衡,说实话,我也不太知道这个纳什均衡是什么意思,粗略地讲,就是G 的功力深厚到足以产出D 分辨不了的假数据,就像《无双》里的郭富城。
7. GAN 的优缺点
(1)优点
上面也有提到,传统的生成式模型发展十分缓慢,主要是因为以下两个困境:
- 对真实世界的建模需要大量的先验知识,建模的好坏直接影响生成式模型的性能
- 真实世界的数据往往非常复杂,拟合模型所需要的计算量往往非常巨大,甚至难以承受
而GAN 通过两个网络互相博弈的方式绕开了以上的问题,这是GAN 的优点。
(2)缺点
缺点只是相对而言:
- 因为GAN 是通过G 和D 的博弈来达到最终让人满意的结果,所以G 和D 如何能更好地同步训练是一个必须解决的问题
- G 在训练的过程中可能倾向于生成更多评分高但相似的数据,而缺少多样性,这就是所谓的模式塌陷问题
- 缺乏一个标准的评价体系
8. GAN 的应用
(1)图片生成:包括根据轮廓生成照片、根据白天图像生成对应夜景等
(2)图像复原:图像超分辨率重建以及残角图像修复、去除遮挡物等
(3)风格迁移和视频预测
(4)自然语言和语音等相关领域