深度|神经网络和深度学习简史(第一部分):从感知机到BP算法

导读:这是《神经网络和深度学习简史》第一部分。这一部分,我们会介绍1958年感知机神经网络的诞生,70年代人工智能寒冬以及1986年BP算法让神经网络再度流行起来。


深度学习掀起海啸


如今,深度学习浪潮拍打计算机语言的海岸已有好几年,但是,2015年似乎才是这场海啸全力冲击自然语言处理(NLP)会议的一年。——Dr. Christopher D. Manning, Dec 2015


整个研究领域的成熟方法已经迅速被新发现超越,这句话听起来有些夸大其词,就像是说它被「海啸」袭击了一样。但是,这种灾难性的形容的确可以用来描述深度学习在过去几年中的异军突起——显著改善人们对解决人工智能最难问题方法的驾驭能力,吸引工业巨人(比如谷歌等)的大量投资,研究论文的指数式增长(以及机器学习的研究生生源上升)。在听了数节机器学习课堂,甚至在本科研究中使用它以后,我不禁好奇:这个新的「深度学习」会不会是一个幻想,抑或上世纪80年代已经研发出来的「人工智能神经网络」扩大版?让我告诉你,说来话长——这不仅仅是一个有关神经网络的故事,也不仅仅是一个有关一系列研究突破的故事,这些突破让深度学习变得比「大型神经网络」更加有趣,而是一个有关几位不放弃的研究员如何熬过黑暗数十年,直至拯救神经网络,实现深度学习梦想的故事。


机器学习算法的百年历史

深度|神经网络和深度学习简史(第一部分):从感知机到BP算法_第1张图片
线性回归

 

首先简单介绍一下机器学习是什么。从二维图像上取一些点,尽可能绘出一条拟合这些点的直线。你刚才做的就是从几对输入值(x)和输出值(y)的实例中概括出一个一般函数,任何输入值都会有一个对应的输出值。这叫做线性回归,一个有着两百年历史从一些输入输出对组中推断出一般函数的技巧。这就是它很棒的原因:很多函数难以给出明确的方程表达,但是,却很容易在现实世界搜集到输入和输出值实例——比如,将说出来的词的音频作为输入,词本身作为输出的映射函数。


线性回归对于解决语音识别这个问题来说有点太无用,但是,它所做的基本上就是监督式机器学习:给定训练样本,「学习」一个函数,每一个样本数据就是需要学习的函数的输入输出数据(无监督学习,稍后在再叙)。尤其是,机器学习应该推导出一个函数,它能够很好地泛化到不在训练集中的输入值上,既然我们真的能将它运用到尚未有输出的输入中。例如,谷歌的语音识别技术由拥有大量训练集的机器学习驱动,但是,它的训练集也不可能大到包含你手机所有语音输入。


泛化能力机制如此重要,以至于总会有一套测试数据组(更多的输入值与输出值样本)这套数据组并不包括在训练组当中。通过观察有多少个正确计算出输入值所对应的输出值的样本,这套单独数据组可以用来估测机器学习技术有效性。概括化的克星是过度拟合——学习一个对于训练集有效但是却在测试数据组中表现很差的函数。既然机器学习研究者们需要用来比较方法有效性的手段,随着时间的推移,标准训练数据组以及测试组可被用来评估机器学习算法。


好了,定义谈得足够多了。重点是——我们绘制线条的联系只是一个非常简单的监督机器学习例子:要点在于训练集(X为输入,Y为输出),线条是近似函数,用这条线来为任何没有包含在训练集数据里的X值(输入值)找到相应的Y值(输出值)。别担心,接下来的历史就不会这么干巴巴了。让我们继续吧。

虚假承诺的荒唐


显然这里话题是神经网络,那我们前言里为何要扯线性回归呢?呃, 事实上线性回归和机器学习一开始的方法构想,弗兰克· 罗森布拉特(Frank Rosenblatt)的感知机, 有些许相似性。


深度|神经网络和深度学习简史(第一部分):从感知机到BP算法_第2张图片
Perceptron


心理学家Rosenblatt构想了感知机,它作为简化的数学模型解释大脑神经元如何工作:它取一组二进制输入值(附近的神经元),将每个输入值乘以一个连续值权重(每个附近神经元的突触强度),并设立一个阈值,如果这些加权输入值的和超过这个阈值,就输出1,否则输出0(同理于神经元是否放电)。对于感知机,绝大多数输入值不是一些数据,就是别的感知机的输出值。但有一个额外的细节:这些感知机有一个特殊的,输入值为1的,「偏置」输入,因为我们能补偿加权和,它基本上确保了更多的函数在同样的输入值下是可计算的。这一关于神经元的模型是建立在沃伦·麦卡洛克(Warren McCulloch)和沃尔特·皮兹(Walter Pitts)工作上的。他们曾表明,把二进制输入值加起来,并在和大于一个阈值时输出1,否则输出0的神经元模型,可以模拟基本的或/与/非逻辑函数。这在人工智能的早期时代可不得了——当时的主流思想是,计算机能够做正式的逻辑推理将本质上解决人工智能问题。


深度|神经网络和深度学习简史(第一部分):从感知机到BP算法_第3张图片


另一个图表,显示出生物学上的灵感。激活函数就是人们当前说的非线性函数,它作用于输入值的加权和以产生人工神经元的输出值——在罗森布拉特的感知机情况下,这个函数就是输出一个阈值操作

 

然而,麦卡洛克-皮兹模型缺乏一个对AI而言至关重要的学习机制。这就是感知机更出色的地方所在——罗森布拉特受到唐纳德·赫布(Donald Hebb) 基础性工作的启发,想出一个让这种人工神经元学习的办法。赫布提出了一个出人意料并影响深远的想法,称知识和学习发生在大脑主要是通过神经元间突触的形成与变化,简要表述为赫布法则:


当细胞A的轴突足以接近以激发细胞B,并反复持续地对细胞B放电,一些生长过程或代谢变化将发生在某一个或这两个细胞内,以致A作为对B放电的细胞中的一个,效率增加。


感知机并没有完全遵循这个想法,但通过调输入值的权重,可以有一个非常简单直观的学习方案:给定一个有输入输出实例的训练集,感知机应该「学习」一个函数:对每个例子,若感知机的输出值比实例低太多,则增加它的权重,否则若设比实例高太多,则减少它的权重。更正式一点儿的该算法如下:


  1. 从感知机有随机的权重和一个训练集开始。

  2. 对于训练集中一个实例的输入值,计算感知机的输出值。

  3. 如若感知机的输出值和实例中默认正确的输出值不同:(1)若输出值应该为0但实际为1,减少输入值是1的例子的权重。(2)若输出值应该为1但实际为0,增加输入值是1的例子的权重。

  4. 对于训练集中下一个例子做同样的事,重复步骤2-4直到感知机不再出错。


这个过程很简单,产生了一个简单的结果:一个输入线性函数(加权和),正如线性回归被非线性激活函数「压扁」了一样(对带权重求和设定阈值的行为)。当函数的输出值是一个有限集时(例如逻辑函数,它只有两个输出值True/1 和 False/0),给带权重的和设置阈值是没问题的,所以问题实际上不在于要对任何输入数据集生成一个数值上连续的输出(即回归类问题),而在于对输入数据做好合适的标签(分类问题)。



康奈尔航天实验室的Mark I 感知机,第一台感知机的硬件 


罗森布拉特用定制硬件的方法实现了感知机的想法(在花哨的编程语言被广泛使用之前),展示出它可以用来学习对20×20像素输入中的简单形状进行正确分类。自此,机器学习问世了——建造了一台可以从已知的输入输出对中得出近似函数的计算机。在这个例子中,它只学习了一个小玩具般的函数,但是从中不难想象出有用的应用,例如将人类乱糟糟的手写字转换为机器可读的文本。


很重要的是,这种方法还可以用在多个输出值的函数中,或具有多个类别的分类任务。这对一台感知机来说是不可能完成的,因为它只有一个输出,但是,多输出函数能用位于同一层的多个感知机来学习,每个感知机接收到同一个输入,但分别负责函数的不同输出。实际上,神经网络(准确的说应该是「人工神经网络(ANN,Artificial Neural Networks)」)就是多层感知机(今天感知机通常被称为神经元)而已,只不过在这个阶段,只有一层——输出层。所以,神经网络的典型应用例子就是分辨手写数字。输入是图像的像素,有10个输出神经元,每一个分别对应着10个可能的数字。在这个案例中,10个神经元中,只有1个输出1,权值最高的和被看做是正确的输出,而其他的则输出0。


 深度|神经网络和深度学习简史(第一部分):从感知机到BP算法_第4张图片

多层输出的神经网络

 

也可以想象一个与感知机不同的人工神经网络。例如,阈值激活函数并不是必要的; 1960年,Bernard Widrow和Tedd Hoff很快开始探索一种方法——采用适应性的「自适应(ADALINE)」神经元来输出权值的输入,这种神经元使用化学「 存储电阻器」,并展示了这种「自适应线性神经元」能够在电路中成为「 存储电阻器」的一部分(存储电阻器是带有存储的电阻)。他们还展示了,不用阈值激活函数,在数学上很美,因为神经元的学习机制是基于将错误最小化的微积分,而微积分我们都很熟悉了。


如果我们多思考一下 「自适应(ADALINE)」,就会有进一步的洞见:为大量输入找到一组权重真的只是一种线性回归。再一次,就像用线性回归一样,这也不足以解决诸如语音识别或计算机视觉这样的人工智能难题。McCullough,Pitts和罗森布拉特真正感到兴奋的是联结主义(Connectionism)这个宽泛的想法:如此简单计算机单元构成的网络,其功能会大很多而且可以解决人工智能难题。而且罗森布拉特说的和(坦白说很可笑的)《纽约时报》这段引文的意思差不多:


海军披露了一台尚处初期的电子计算机,期待这台电子计算机能行走,谈话,看和写,自己复制出自身存在意识…罗森布拉特博士,康奈尔航空实验室的一位心理学家说,感知机能作为机械太空探险者被发射到行星上。

 

class="video_iframe" height="502.5" width="670" frameborder="0" data-src="https://v.qq.com/iframe/preview.html?vid=r0182j269h5&width=500&height=375&auto=0" allowfullscreen="" scrolling="no" src="https://v.qq.com/iframe/player.html?vid=r0182j269h5&width=670&height=502.5&auto=0&encryptVer=6.0&platform=61001&cKey=IkMDyXFkSMl63khAFdc6sNlQzjEBBf/R0rT5a+vyiFES5e9vFo4VivVDwMKdeTtY" style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; display: block; z-index: 1; width: 670px !important; height: 502.5px !important; overflow: hidden;">

这种谈话无疑会惹恼人工领域的其他研究人员,其中有许多研究人员都在专注于这样的研究方法,它们以带有具体规则(这些规则遵循逻辑数学法则)的符号操作为基础。MIT人工智能实验室创始人Marvin Minsky和Seymour Paper就是对这一炒作持怀疑态度研究人员中的两位,1969年,他们在一本开创性著作中表达了这种质疑,书中严谨分析了感知机的局限性,书名很贴切,叫《感知机》。


他们分析中,最被广为讨论的内容就是对感知机限制的说明,例如,他们不能学习简单的布尔函数XOR,因为它不能进行线性分离。虽然此处历史模糊,但是,人们普遍认为这本书对人工智能步入第一个冬天起到了推波助澜的作用——大肆炒作之后,人工智能进入泡沫幻灭期,相关资助和出版都遭冻结。


深度|神经网络和深度学习简史(第一部分):从感知机到BP算法_第5张图片
感知机局限性的视觉化。找到一个线性函数,输入X,Y时可以正确地输出+或-,就是在2D图表上画一条从+中分离出-的线;很显然,就第三幅图显示的情况来看,这是不可能的

人工智能冬天的复苏


因此,情况对神经网络不利。但是,为什么?他们的想法毕竟是想将一连串简单的数学神经元结合在一起,完成一些复杂任务,而不是使用单个神经元。换句话说,并不是只有一个输出层,将一个输入任意传输到多个神经元(所谓的隐藏层,因为他们的输出会作为另一隐藏层或神经元输出层的输入)。只有输出层的输出是「可见」的——亦即神经网络的答案——但是,所有依靠隐藏层完成的间接计算可以处理复杂得多的问题,这是单层结构望尘莫及的。 


深度|神经网络和深度学习简史(第一部分):从感知机到BP算法_第6张图片

有两个隐藏层的神经网络 


言简意赅地说,多个隐藏层是件好事,原因在于隐藏层可以找到数据内在特点,后续层可以在这些特点(而不是嘈杂庞大的原始数据)基础上进行操作。以图片中的面部识别这一非常常见的神经网络任务为例,第一个隐藏层可以获得图片的原始像素值,以及线、圆和椭圆等信息。接下来的层可以获得这些线、圆和椭圆等的位置信息,并且通过这些来定位人脸的位置——处理起来简单多了!而且人们基本上也都明白这一点。事实上,直到最近,机器学习技术都没有普遍直接用于原始数据输入,比如图像和音频。相反,机器学习被用于经过特征提取后的数据——也就是说,为了让学习更简单,机器学习被用在预处理的数据上,一些更加有用的特征,比如角度,形状早已被从中提取出来。



传统的特征的手工提取过程的视觉化

 

因此,注意到这一点很重要:Minsky和Paper关于感知机的分析不仅仅表明不可能用单个感知机来计算XOR,而且特别指出需要多层感知机——亦即现在所谓的多层神经网络——才可以完成这一任务,而且罗森布拉特的学习算法对多层并不管用。那是一个真正的问题:之前针对感知机概括出的简单学习规则并不是适用于多层结构。想知道原因?让我们再来回顾一下单层结构感知机如何学习计算一些函数:


  1. 和函数输出数量相等的感知机会以小的初始权值开始(仅为输入函数的倍数)

  2. 选取训练集中的一个例子作为输入,计算感知机的输出

  3. 对于每一个感知机,如果其计算结果和该例子的结果不匹配,调整初始权值

  4. 继续采用训练集中的下一个例子,重复过程2到4次,直到感知机不再犯错。

这一规则并不适用多层结构的原因应该很直观清楚了:选取训练集中的例子进行训练时,我们只能对最终的输出层的输出结果进行校正,但是,对于多层结构来说,我们该如何调整最终输出层之前的层结构权值呢?答案(尽管需要花时间来推导)又一次需要依赖古老的微积分:链式法则。这里有一个重要现实:神经网络的神经元和感知机并不完全相同,但是,可用一个激活函数来计算输出,该函数仍然是非线性的,但是可微分,和Adaline神经元一样;该导数不仅可以用于调整权值,减少误差,链式法则也可用于计算前一层所有神经元导数,因此,调整它们权重的方式也是可知的。说得更简单些:我们可以利用微积分将一些导致输出层任何训练集误差的原因分配给前一隐藏层的每个神经元,如果还有另外一层隐藏层,我们可以将这些原因再做分配,以此类推——我们在反向传播这些误差。而且,如果修改了神经网络(包括那些隐藏层)任一权重值,我们还可以找出误差会有多大变化,通过优化技巧(时间长,典型的随机梯度下降)找出最小化误差的最佳权值。


深度|神经网络和深度学习简史(第一部分):从感知机到BP算法_第7张图片
反向传播的基本思想 


反向传播由上世纪60年代早期多位研究人员提出,70年代,由Seppo Linnainmaa引入电脑运行,但是,Paul Werbos在1974年的博士毕业论文中深刻分析了将之用于神经网络方面的可能性,成为美国第一位提出可以将其用于神经网络的研究人员。有趣的是,他从模拟人类思维的研究工作中并没有获得多少启发,在这个案例中,弗洛伊德心理学理论启发了他,正如他自己叙述:


1968年,我提出我们可以多少模仿弗洛伊德的概念——信度指派的反向流动( a backwards flow of credit assignment,),指代从神经元到神经元的反向流动…我解释过结合使用了直觉、实例和普通链式法则的反向计算,虽然它正是将弗洛伊德以前在心理动力学理论中提出的概念运用到数学领域中!

 

尽管解决了如何训练多层神经网络的问题,在写作自己的博士学位论文时也意识到了这一点,但是,Werbos没有发表将BP算法用于神经网络这方面的研究,直到1982年人工智能冬天引发了寒蝉效应。实际上,Werbos认为,这种研究进路对解决感知机问题是有意义的,但是,这个圈子大体已经失去解决那些问题的信念。


Minsky的书最著名的观点有几个:(1)我们需要用MLPs[多层感知机,多层神经网络的另一种说法)来代表简单的非线性函数,比如XOR 映射;而且(2)世界上没人发现可以将MLPs训练得够好,以至于可以学会这么简单的函数的方法。Minsky的书让世上绝大多数人相信,神经网络是最糟糕的异端,死路一条。Widrow已经强调,这种压垮早期『感知机』人工智能学派的悲观主义不应怪在Minsky的头上。他只是总结了几百位谨慎研究人员的经验而已,他们尝试找出训练MLPs的办法,却徒劳无功。也曾有过希望,比如Rosenblatt所谓的backpropagation(这和我们现在说的 backpropagation并不完全相同!),而且Amari也简短表示,我们应该考虑将最小二乘(也是简单线性回归的基础)作为训练神经网络的一种方式(但没有讨论如何求导,还警告说他对这个方法不抱太大期望)。但是,当时的悲观主义开始变得致命。上世纪七十年代早期,我确实在MIT采访过Minsky。我建议我们合著一篇文章,证明MLPs实际上能够克服早期出现的问题…但是,Minsky并无兴趣(14)。事实上,当时的MIT,哈佛以及任何我能找到的研究机构,没人对此有兴趣。

 

我肯定不能打保票,但是,直到十年后,也就是1986年,这一研究进路才开始在David Rumelhart, Geoffrey Hinton和Ronald Williams合著的《Learning representations by back-propagating errors》中流行开来,原因似乎就是缺少学术兴趣。


尽管研究方法的发现不计其数(论文甚至清楚提道,David Parker 和 Yann LeCun是事先发现这一研究进路的两人),1986年的这篇文章却因其精确清晰的观点陈述而显得很突出。实际上,学机器学习的人很容易发现自己论文中的描述与教科书和课堂上解释概念方式本质上相同。


不幸的是,科学圈里几乎无人知道Werbo的研究。1982年,Parker重新发现了这个研究办法[39]并于1985年在M.I.T[40]上发表了一篇相关报道。就在Parker报道后不久,Rumelhart, Hinton和Williams [41], [42]也重新发现了这个方法, 他们最终成功地让这个方法家喻户晓,也主要归功于陈述观点的框架非常清晰。


但是,这三位作者没有止步于介绍新学习算法,而是走得更远。同年,他们发表了更有深度的文章《Learning internal representations by error propagation》。


文章特别谈到了Minsky在《感知机》中讨论过的问题。尽管这是过去学者的构想,但是,正是这个1986年提出的构想让人们广泛理解了应该如何训练多层神经网络解决复杂学习问题。而且神经网络也因此回来了!第二部分,我们将会看到几年后,《Learning internal representations by error propagation》探讨过的BP算法和其他一些技巧如何被用来解决一个非常重要的问题:让计算机识别人类书写。(待续)


你可能感兴趣的:(深度学习)