(五)神经网络
神经元模型
我们来看什么是神经网络,这是芬兰赫尔辛基技术大学或理工大学的Kohonen教授给出的定义,该定义发表在1988年《神经网络》杂志创刊号上。定义指出,神经网络是由具有适应性的简单单元组成的广泛并行互联的网络,其组织能模拟生物神经系统对真实世界物体做出的交互反应。后一句相对不那么重要,最重要的是前一句。然而,对于我们这门课程来说,所讨论的神经网络是神经网络范畴中的一小部分。未来你们会看到很多人都在谈论神经网络,数学家可能将其视为动力系统,研究其收敛性、稳定性及不动点等;自动化和自动控制专家则将其视为控制器,研究神经控制器的行为。而我们主要关注的是将神经网络视为学习算法时,如何通过数据学习出模型。
所以更重要的是,我们可以说研究的是神经网络学习,它属于连接主义学习机制。从定义来看,神经网络有两个要素:第一是简单单元,第二是广泛并行互联的网络,因此它是一个网络结构。对于任何神经网络模型,这两点都是最重要的。
首先,我们来看神经元模型,即简单单元。所谓的简单单元,到目前为止,在生物神经系统中最常用的神经元模型仍然是1943年芝加哥大学的McCulloch和Pitts提出的模型,该模型一直沿用至今,即使在深度学习的时代,我们仍然主要使用这一模型。这个模型非常简单,它刻画了生物神经系统中的一个现象:一个神经细胞会接收到来自其他细胞的信号,这些信号通过突触增强并到达该细胞,它们传递的是电位。当到达该细胞的累积电位高于一个阈值时,细胞就会被激活,并向外传递一个信号。现在,我们将这个细胞视为一个模型,从其他地方传来信号X,这些信号通过连接被放大,乘以权重w,到达该细胞后,就变成了所有信号X与权重w的乘积之和。如果乘积之和比较大,超过阈值θ,细胞就会被激活,并产生一个输出,这个输出由函数f处理。所以,所谓的神经元模型就是一个简单的数学函数,其中X是来自其他神经元的信号,w是突触的放大倍数,所有信号加起来并与阈值θ比较,如果高于阈值就用函数f处理一下,产生输出y。那么,在学习阶段,我们要学的是什么呢?就像我们之前提到的线性回归等线性模型一样,我们要学的是权重w和阈值θ。
线性模型不是w转置乘x加b吗?加b和减θ是等价的,正负号被吸收进去了。所以,要学习的还是w和b,这一点与线性模型相同。每个神经元本身,如果不考虑f,就是个线性模型,去掉f,就成了线性模型。
现在有了f,就能处理非线性的东西了。我们知道f需要做某种变化,这个f就是激活函数,有时我们也这样写激活函数activation function.有些地方,我们也把它翻译成响应函数,甚至挤压函数。响应函数没问题,给我一个x,我产生一个输出,我在响应你。挤压为什么这样叫呢?我们来看看上图,前面已经讲过线性模型,做分类时,我希望这个东西,让我激活我就输出1,不激活就输出0,但这个东西性质不好,我们要找个替代函数,所以通常我们用,在很多书上把这个叫sigmoid函数,sigmoid的意思其实就是S型。所以sigmoid函数不是指一个函数,而是一大类函数,所有能写成这个形式的函数都可以叫sigmoid函数。我们最常用的是这个函数,大家还记得这是什么函数吗?不记得的话我们再回顾一下,讲对立回归的时候我们用联系函数,这个函数太有意思了。这个函数为什么特别有意思呢?如果我们把它认为是f(x),它有个非常有趣的性质就是:f(x)的导数等于f(x)乘以1减f(x)。你们回去推一下,下节课我们讲bp算法会用到,求导变成函数自己乘以1减f(x),你知道f(x)表达了一个我正还是负的可能,f(x)可以理解为正的几率,1-f(x)可以理解为负的几率。它恰恰还对正几率的一个乘积,你看这个函数有意思,非常优美。
我们最常用的就是这个函数,那这个函数你记得有这个很好的性质,那还有一点呢,它是把两端的输出挤压到了零和一之间,你可以想象成横坐标x,可以从负无穷到正无穷,但是y就到了0到1之间,那所谓的挤压是什么意思呢?你看负无穷到正无穷的输入,我挤压到了0到1这个小小的输出之间,所以它也把它叫做挤压函数,是这么一个东西。我们的神经元模型。你看里面是个线性的部分,再加上外面一个非线性的激活函数,处理非线性的激活函数是0到1损失的一个替代函数,你可以有各种各样的函数代进去。好了,这是神经元,那网络是什么呢?
当然这是把很多东西连起来的一个结构,最常见的结构,就是我们这样的一个结构,我们把这样的结构叫多层网络,多层很容易理解,一层、两层、三层、四层,我们还有个叫前馈。前馈是指什么呢?这中间不存在同层的连接,也不存在跨层的连接,简单的说,现在这个网络里面它没有环这样的结构。前馈是指网络中各层之间只有单向的链接,没有同层或跨层的连接,即网络中没有环路。
这是从下面往上传,下面的输入为x1、x2、...、到xn,注意是X它是一个样本。一个样本的不同维度输入到不同的节点上。假设要解决的问题有十维输入,即有十个输入神经元;假设输出有两个类,则可以有和两个结点,第一个表示第一类,第二个表示第二类。甚至也可以用了一个节点表示,大于0.5是一个类,小于0.5是另一个类,这也可以,这是不同的表达方式,但通常我们用每一类用一个结点来表达,这是输出神经元。输入输出都确定了,中间部分叫隐层神经元,有时也叫隐含层。这就是一个多层前馈网络,中间没有自己到自己的信号,每一层中也没有横过来的信号,都是从前往后输出信号,整个预测过程是这样进行的,所以叫多层前馈网络,这是我们最常用的网络。
这样的网络有几层呢?看起来有三层(输入层、隐藏层、输出层),但实际上输出神经元的这一层没有f,这一层得到的x直接放进去,中间层有f,输出层有f,如果从有f的含义来说,就只有两层,功能神经元带f的,我们把它叫功能层。所以可能说它是三层网络,也可能说是两层网络,这就有歧义了。
有没有消除歧义的表达呢?有,叫单隐层,就没有歧义了,它只有一个隐层;另外,还有双隐层,有两个隐层。我们现在神经网络最常见的结构叫多层前馈网络(BP神经网络)。如果里边的每一个神经元都是刚才提到的mp神经元,那就得到了一个多层前馈神经网络,它是这么一个多层前馈的网络结构,再加上放进去的神经元的模型,这就是一个多层前馈神经网络。
万有逼近能力
这样的神经网络,其能力有多强呢?我们要讨论的是所谓的万有逼近性,即universal approximator。“universal”是通用的意思,这里译为“万有”,即无所不包。它指的是什么呢?只要有一个隐层,假设这个隐层可以包含无限多的神经元,为何这么说呢?确定神经元的个数很麻烦。输入层,输入向量有多少维,就有多少个神经元;输出层,有多少个输出类别,就有几个神经元。而中间层是不确定的,我们能否知道其最优神经元个数?不可能,若知道,就得到了确定性的最优解。因此,我们不知道中间层具体有多少神经元。现在假定其神经元个数随意,那么它能达到什么性能呢?只要有一个包含足够多神经元的隐层,多层前馈神经网络就能以任意精度逼近定义在紧集上的任意连续函数。通常我们面临的都是定义在紧集上的情况,不可能是发散的。也就是说,它能以任意精度逼近任意复杂度的连续函数。
任何计算过程,当输入x时,输出不就是f(x)吗?它就是一个函数,而且如果要求在x空间中任意一点都有值,且这个空间是连续的空间,那不就是连续函数吗?所以,任何计算过程其实都是在做这样的连续函数,只是复杂度可能是各种各样的,甚至是任意复杂度。因此,从这个角度上来说,任何函数逼近问题都可以用单隐层神经网络来解决,而且事实上,我们可以推断出任何一个图灵可计算的问题,都可以找到一个神经网络作为其求解器。这个性质非常强大,称为万有逼近性。有了这条性质之后,我们就知道,无论神经网络面对什么问题。都可以用它来解决,但如何找到其解是另一回事,这涉及到如何设置隐层神经元个数。通常的做法是试错,多设几个或少设几个。通常来说,问题特别复杂时,要多设一些;问题简单时,要少设一些。这就是一般的理解:问题复杂,模型复杂度要高一点,神经元个数要多一点;问题非常简单,神经元个数就少一点。
大家能明白了吧?神经网络性质很好,具有万有逼近能力,所以什么问题它都能解。但这里有一个误解,很多人认为神经网络具有万有逼近性是其所独有的优良属性,这是错误的。具有万有逼近性这个条件是我们能把一个模型作为机器学习中的模型的前提。很多东西具有万有逼近性,比如傅里叶变换、泰勒级数展开等。为什么对神经网络我们要证明它具有万有逼近性?这是因为之前大家怀疑神经网络能否做到这一点的。由于神经网络在数学上确实难以得到更好的结果,当时有人质疑其能力,而决策树能从信息熵最小化中看到其优越性,支持向量机也有理论保证能找到满足要求的间隔。对于神经网络,观察其训练过程会发现,整个训练过程是一个复杂的过程,因此我们不确定它能达到何种程度。所以需要这样一个证明来表明它具有万有逼近性,即解一定存在。但找到解是另一回事,而神经网络具有这种能力并不意味着它能超越其他方法。这种理解是错误的,因为最简单的傅里叶变换也具有万有逼近性,而傅里叶变换作为学习模型显然是很弱的。因此,大家需要理解的是,由于神经网络的数学基础相对薄弱,在机器学习过程中我们不太放心,所以需要这样一个性质来保证解已经存在,我们只需去找到它。
缓解过拟合
神经网络中如何缓解过拟合?在机器学习中,我们一直在与过拟合作斗争。通过经验风险最小化,使用一堆数据将训练误差降至零,这是可以做到。每种算法和技术都有控制过拟合的方法。在神经网络中,决策树采用早点停止划分;支持向量机是引进正则化,这两种都可以做,我们通常采用early stopping。通常的做法是,当连续n轮的变化小于给定的阈值c时,就停止训练。
比如,我们观察神经网络的训练过程,如果上一轮的误差较低,而下一轮的误差增加,就停止训练。但在现实中,由于存在小的扰动,误差可能略有增加,这时需要观察一段时间,如果误差没有有效下降,就可以停止训练。这种思路并非单步判断,单步判断过于严格。另外,当训练误差降低而验证误差升高时,是一个明显的过拟合预兆,因此我们也需要考虑。两种情况是不一样的,前者是考虑训练误差的变化,后者是考虑训练误差和验证误差之间的一致性。如果训练误差仍在下降,但验证误差已经上升,也可以停止训练。然而,早停可能会导致欠拟合的风险,就像决策树早剪枝一样。
还有另一种方法,即通过正则化来解决过拟合,这是统计学习兴起后引入神经网络的一种控制过拟合的思想。正则化已成为机器学习中的一个基本思路。在神经网络的发展初期,人们很少看到这种控制过拟合的方法,当时主要依赖启发式的早停策略。统计学习兴起后,统计学中的技巧被引入到其他领域,如核技巧和正则化思想。在神经网络中,我们可以通过考虑模型复杂度来实现正则化。模型复杂度通常会导致严重的过拟合问题。还记得我们为什么会过拟合吗?就是因为我们学到了数据集中不该学的东西,一些特例。为什么会学到这些数据集中很特别的东西呢?还是因为我们的学习能力太强了。如果学习能力不那么强,这些东西还学不到。因此,我们其实一直在控制模型的复杂度。在神经网络中,我们一开始要确定的是经验风险,即从样本1到样本m的误差。在推导BP算法时,我们只考虑了这一项。现在,我们再增加一项
。记得在统计学习中,最后讲正则化时,我们提到了一项是关于结构的,另一项是关于经验风险的。而
这一项就是关于风险的,我们需要再引入一项关于结构的内容。关于结构,我们需要思考什么样的神经网络可能有较大风险会过拟合。最常提及的是
这个正则画像,它是对权重的一种范数。简单来说,如果范数较小,情况会好一些;如果范数较大,新的损失函数值会变大,这意味着在达到相同目标时,我们希望权重较小。这实际上类似于使用多元函数时,多元函数的系数会较小,各项之间相比差别不会特别大,比较平滑。我们通常认为,只有避免过于平滑,才能避免过拟合。过拟合实际上是什么?就是数据存在严重抖动。我们可以认为,真正要学的是趋势,这是一般性原则。当考虑这些样本点并试图学习时,就可能出现过拟合。我们要学的是这个趋势,虽然它可能并未精确穿过所有点,但它更平滑。我们应追求平滑,减少各项之间的差别。这就是直观上的理解。
将这一理念加入后,就得到了新的损失。现在,我们将其用作之前的E来推导BP算法,使用链式求导来更新参数,得到更新法则,然后继续后续操作。因此,这是BP神经网络用来控制过拟合的最重要技术。
神经网络简史
我们简单回顾一下神经网络的发展历程。这并非新事物,实际上在上世纪40年代,M-P模型在1943年被提出,并一直沿用至今。其中还有一个非常著名的赫布学习规则,即如果两个单元A和B被激活,它们之间的连接就会加强。大家会发现,在我们后续的学习算法中,如果传递了某个信息并需要调整时,如果某个值变大,那么调整就会朝变大的方向进行。这是赫布学习规则的一个简单应用。
在1956年到1969年期间,是神经网络发展的第一个繁荣期。在此期间,提出了许多内容,比如现在经常提到的感知机,感知机是在1958年被提出的,但多层感知机并非此时提出。感知机中只有一层功能单元,我们上节课讲到的激活函数f就是功能单元,通常位于隐层。当只有一个隐层时,隐层和输出层都包含功能单元。感知机模型仅有一层功能单元,后来才出现了多层感知机。
回到1969年,那时神经网络非常繁荣。回顾历史,1956年人工智能成为一门学科,从那时起,关于人工智能的发展路线就存在不同观点。前面提到过,以卡内基梅隆大学的布德西蒙和阿拉尼韦尔以及斯坦福大学的“人工智能之父”约翰·西瑟斯为代表,走的是符号化路线,在当时占据主流。而神经网络方面,以MIT的闵斯基为代表,他是1969年的图灵奖获得者,他制作了第一个神经网络的仿真器,走的是连续建模、竖直建模的道路。但在当时,离散建模成为主流,连续建模遇到了巨大障碍。最大的障碍是由闵斯基自己提出的,他在1969年写了一本书,名为《感知机》,这本书在当年他获得图灵奖时出版,影响力巨大。书中他提出了一个重要论断,在当时看来,由于我们使用的神经网络都是一层功能单元,因此他指出只有一层功能单元的网络只能做线性分类,无法处理非线性问题。大家想一想,只有一层功能单元,实际上做的就是线性模型。因此,闵斯基指出其他非线性问题无法处理。例如,我们讲过的支持向量例子中的异或分类问题,它是一个非线性分类问题,但感知机无法处理。明斯基当时断言,要想解决这种非线性问题,必须有多层网络。但多层网络之后如何训练这样的模型,当时还看不到希望。这个论断绝对是正确的,多层网络才能处理非线性问题,但多层之后如何训练呢?
当时均采用感知机规则,当时的感知机规则训练不了多层的东西,不涉及多层结构,因此这是悲观论调。然而,由于其地位极高,此悲观论调导致整个领域陷入所谓的冰河期。在作出此论断后,美国和前苏联在接下来15年内均停止了对此研究方向的资助。因此,全世界从事该研究方向的人员中,99%都改行了,影响巨大。在冰河期坚持下来的三个研究组,在神经网络复兴时成为了全球领军人物或代表性人物。其中,Kohonen教授在芬兰赫尔辛基理工大学,他之前曾提及神经网络定义。另一个离我们较近的研究组由Amari,其日本名叫“甘利俊”,他领导的团队叫RIKEN。此外,还有Gross kerg在波士顿大学。这三人分别来自芬兰、日本和波士顿大学。Kohonen的最重要的贡献是SOM神经网络,Gross kerg最大贡献是竞争学习,竞争学习思想在今天的深度神经网络模型中广泛应用,这是一种非常通用的思想。由此衍生出许多算法,如Art算法族。甘利俊从数学和几何方面对神经网络进行了深入探讨。这三个组坚持下来,在当时被认为是神经网络领域全世界最重要的三个领军人物。他们非常不容易,在早年能够坚持下来。
到了1984年,神经网络又开始了一次复兴,这次复兴的源头是1983年,加州理工学院的hopfield教授,他是一位物理学家,他做了什么呢?他用神经网络解决了TSP问题,即流动推销员问题,这是一个典型的NP完全问题。目前我们并没有多项式时间复杂度的算法来解决它。他用神经网络来解决这个问题,这个神经网络现在被称为hopfield神经网络。但后来,人们又把它称为自关联auto encoder。当时,用神经网络解决旅行推销员问题取得了很好的效果,这在当时已经是非常了不起的一件事了,因此这件事立即引起了轰动。
1986年,BP算法被重新发明出来,这个算法可以用来训练多层网络,并且直到现在都是最流行的神经网络训练算法。应该说的是,1986年是BP算法被重新发明的时间,到了这个阶段,全世界都在谈论神经网络,这有点像今天全世界都在谈论深度神经网络的情况。
我们前面学支持向量机直到,1994年支持向量网络这篇文章发表,1997年Toolstan Jukins用支持向量机做文本分类,取得了当时最好的性能。所以大家开始发现支持向量机在很多问题上能做到和神经网络差不多甚至更好,但并非在所有问题上都比神经网络好。那为什么它后来冷下去了呢?因为支持向量机这一套统计学习理论有比较坚实的统计学习理论为指导,能告诉你什么时候好,什么时候不好,什么时候可能出问题,而神经网络主要靠摸索。这时有一个性能差不多,但清楚得多、有理论支撑的东西,大家当然就都过去研究SVM了,神经网络就冷下来了。在很长时间里,会议中只要提到神经网络,相关文章就能被投稿,这是沉寂期。
到了2012年,深度神经网络在ImageNet计算机视觉竞赛中比当时最好的技术高出十多个百分点,一下子热起来了。一直到今天大家都在讨论深度学习。
所以神经网络的历史很有趣,大家可以看,这里面有一个基本交替的模式,热13年左右,冷15年左右,这个模式是否还会继续?我们不知道,大概是这样。这里面还是有一些原因,但这些原因我们探讨过,都没有确定性的结论。比如有一个很重要的原因,大家看一看我们西瓜书第一章,可能你们有时不一定会注意到,80年代神经网络的热潮和当时内存条技术的发明、80x86系列芯片的出现有很大关系。当然,后来我们用到的GPU等也有很大关系。所以一定程度上可以看,神经网络这类技术主要涉及的计算是梯度计算,非常容易利用新增的计算能力。计算性能提升之后,它是最早能用上的。但理论不清楚已经持续了半个多世纪,这个问题始终没有解决。所以一旦出现一个性能差不多,但理论比较清楚的,大家马上就会投入到另一边去,然后又等着下一步计算能力的大幅度提升。存在这种趋势,但这只是猜测,并无确定性结论。
然而,重要的是,在每个艰难时期坚持下来的人都非常了不起。比如这三个研究组,它们在相当长时间里引领了学科发展。在这个时期,也有几个人坚持下来,其中几位年龄已大,而当时相对年轻一点的,坚持下来的主要是这三位,特别是Geoffrey Hinton,因为另外两人,加上另一人,都算是hinton的学生或学生的学生。hinton在1986年神经网络的上一次热潮中重新发明了BP算法。hinton是相关领域的作者,在hopefield工作后,他形成了一个非常著名的小组,即PDP小组,我在书中也简单提到了。拿不到经费,招不到学生,甚至有学生要去找他,读他的课,系主任都直接说,你不要跟他,不然以后找不到工作。但非常不容易,所以这个时候坚持下来,19年后他们获得了图灵奖。但这件事从学科发展历史上来看还是比较特别的,因为大家知道图灵奖是非常偏重于理论的奖项,而深度神经网络到今天为止并没有理论基础,那它为什么能得奖呢?这和工业界的应用关系非常大。大家回顾计算机科学的历史,有两件事情在出现很短的时间之后就会席卷整个工业界。一件是1973年之后,关系数据库模型efcode被提出,在此之前都是网状层次数据库模型,code提出数据库之后,短短几年时间里,全世界所有数据库都变成了关系数据库,所以其发展特别快。深度神经网络也是这样,2012年、2014年之后,短短的时间里,所有工业界全都开始使用深度神经网络。所以它是由于应用上的巨大成功反过来推动了理论界的认可。这个路线和一般的不太一样,一般的都是先在理论上有很重要的工作,比如像lesonevenant教授在八十年代奠定了计算学习理论,但后来20年机器学习大发展,才反过来得到这样的认可。所以这个路线不太一样。
但无论如何,这种精神非常可贵,而且谁也未预料到他们这么快就能得奖。这是简单历史事实,旨在说明科学发展总是螺旋式上升。30年河东,30年河西,一定要坚持,切勿盲目跟从热潮,否则只是为他人抬轿子。特别是将来可能从事学术研究的学生,要认准一条路并一直前行。例如,Hinton坚持了半个世纪,非常了不起。
深度神经网络的发展
深度学习是经过多年发展,近几十年、上百万研究者做出贡献,将冷门领域研究热化的结果。给大家看一个图,卷积神经网络应用广泛,现已成为基本模型。许多新模型都在其基础上发展。那么,它本身是如何发展的呢?
信号处理中的卷积在1903年就已出现在文献中,但很多人做深度神经网络时,会追溯到1962年诺贝尔奖获得者研究猫视觉皮层的工作。这其实是人们做事时喜欢找依据,如果数学上能说清楚,就会用数学来证明,说不清楚就找个靠山,比如诺贝尔奖的工作能启发自己。但其实追究起来,猫视觉皮层的研究和深度学习中的卷积有严格关系吗?并非如此。但大家喜欢追溯到哪呢?
一个非常重要的工作是1982年,日本人福岛邦彦在神经网络中引入了卷积,这是卷积首次进入神经网络。到了1989年,图灵奖得主Yann LeCun将BP算法引入训练网络,这就是我们所说的卷积神经网络。1995年,Fukushima和Yann LeCun共同对其进行了完整描述并发表。1998年,他们进行了支票手写字符识别,这是首个见报的比较成功的应用。但如果要说当时支票手写识别是否用得最好,答案是否定的。当时用得最好的是AdaBoost算法,那是一种集成学习算法。但这也是一个很好的结果。2006年,Hinton通过无监督逐层训练构建生成模型。到2009年,学者Lee将该方法引入训练卷积神经网络,实现逐层训练。再到2012年,八层CNN在ImageNet竞赛中广泛应用。
从卷积首次进入神经网络,到用于Imagenet竞赛获胜,经过了30年。如果算从卷积神经网络算法成型,到现在引入无监督逐层训练,导致能够构建很深的卷积神经网络,也经过了20年。经过这么多年,才得到现在用得比较好的模型,所以探索时间是非常长的。