关于深度学习的一点思考
周志华,南京大学教授,计算机系主任,南京大学人工智能学院院长,欧洲科学院外籍院士,美国计算机学会 (ACM)、美国科学促进会 (AAAS)、国际人工智能学会 (AAAI) 、国际电气电子工程师学会 (IEEE) 、国际模式识别学会 (IAPR)、国际工程技术 (IET/IEE) 等学会的会士,实现了 AI 领域会士大满贯。
导读:周志华教授从深度神经网络的深层含义说起,条分缕析地总结出神经网络取得成功的三大原因:
有逐层的处理
有特征的内部变化
有足够的模型复杂度
并得出结论:如果满足这三大条件,则并不一定只能用深度神经网络。
各位嘉宾,各位朋友大家下午好!
很高兴今天下午来参加京东的这个活动,各位最近可能都听说过我们南京大学成立了人工智能学院,这是中国C9高校(编辑注:C9高校是指北京大学、清华大学、复旦大学、上海交通大学、南京大学、浙江大学、中国科学技术大学、哈尔滨工业大学、西安交通大学共9所高校)的第一所人工智能学院。我们会和京东在科学研究和人才培养方面开展非常深度的合作。具体的合作内容过一段时间会陆续地告诉大家。今天参加这个活动,谢谢伯文(编辑注:指周伯文博士,京东集团副总裁,京东AI平台与研究部负责人)的邀请,在跟伯文沟通的时候谈到今天讲些什么呢?伯文说,今天的会议会有很多对技术前沿感兴趣的专家,所以希望我分享些我们对技术前沿的一些思考。所以,我今天就跟大家分享些我们对深度学习的一点点思考,仅供大家一起来讨论。
我们知道今天人工智能很热,人工智能背后掀起的热潮技术之一就是深度学习,当我们谈到深度学习的时候,在各种应用场景中都应用到它,包括图像、视频、声音和自然语言处理等等,但是,如果我们问一个问题,什么是深度学习?可能大多数人差不多都会认为,深度学习就等于深度神经网络。
我给大家看一个例子。有一个非常著名的学会是国际工业与应用数学学会,他们有一个报纸叫 SIAM News。去年 6 月份的头版上有一篇文章,它里面的重点说的就是深度学习是什么?它(深度学习)是机器学习的一个子域(subfield),这里面要用深度神经网络。
所以,基本上,如果我们要谈深度学习的话,我们必须谈深度神经网络,或者必须从深度神经网络说起,神经网络并不是一个新生事物,它在人工智能界已经研究了半个多世纪。以往的话,我们一般会用这样的神经网络,就是中间有一个隐层或者两个隐层。在这样的神经网络当中,它的每个单元是个什么东西呢?其实,网络中的每个单元是一个非常简单的计算模型,如下图左下角所示,这个计算模型在半个世纪以前人们就已经总结出来了。给定一些输入,它们通过连接和放大,到达一个细胞之后,它的加和不超过一个阈值,就被激活。说穿了,它就是这么一个非常简单的公式,深度神经网络就是很多这样的公式通过嵌套和迭代得到的一个数学系统。
我们今天用到深度神经网络的时候,其实指的是什么呢?其实是指这个网络的层数很深很深,很多层,大概是多少呢,给大家看一组数据:2012年,ImageNet竞赛的冠军,用到的是8层;2015年,用到的是152层;2016年用到的是1207层;这是一个非常庞大的系统,把这样的一个系统训练出来,难度是非常大的。但是呢,我们有一个非常好的消息,神经网络中的计算单元的激活函数是连续的、可微的,比如说,我们在深度神经网络中,可能会用Sigmod函数,有了这么一个性质之后,我们会得到一个非常好的结果。这个结果就是现在我们可以很容易计算系统的梯度。因此就可以很容易用著名的 BP 算法(注:反向传播算法)来训练这系统。
今天通过这样的算法,神经网络已经取得了非常多的胜利,但实际上在学术界大家一直没有想清楚一件事情,就是我们为什么要用这么深的模式?可能今天有很多人会说深度学习已经取得了很多的成功,但它一个很大的问题就是理论基础不清楚,我们理论上还说不清楚它到底怎么做?为什么会成功?这里面的关键是什么?其实我们根本不知道该从什么角度去看它。因为如果我们要做理论分析的话,首先应该有一点直觉,你到底因为什么有用,在这条路上往前走才能有关键的结果。
关于深度神经网络为什么能深,其实这件事情到今天为止学术界都没有统一的看法。在这里面给大家讲一个我们前一段时间给出的论述,这个论述其实是从主要模型的复杂度的角度来讨论的。
我们知道一个机器学习模型的复杂度实际上和它的容量有关,而这个容量直接决定了它的学习能力,所以说学习能力和复杂度是有关的。其实我们老早就知道,如果我们能够增强一个学习模型的复杂度,它的学习能力就能够提升,那么怎样去提高复杂度呢?
对神经网络这样的模型来说有两条很明显的途径,一条是我们把模型变深,一条是我们把它变宽,但是如果从提升复杂度的角度,变深会更有效。当你变宽的时候你只不过增加了一些计算单元、增加了函数的个数,而在变深的时候不仅增加了个数,其实还增加了嵌入的层次,所以泛函的表达能力会更强。所以从这个角度来说,我们应该尝试变深。
我们知道一个机器学习模型的复杂度实际上和它的容量有关,而这个容量直接决定了它的学习能力,所以说学习能力和复杂度是有关的。其实我们老早就知道,如果我们能够增强一个学习模型的复杂度,它的学习能力就能够提升,那么怎样去提高复杂度呢?
对神经网络这样的模型来说有两条很明显的途径,一条是我们把模型变深,一条是我们把它变宽,但是如果从提升复杂度的角度,变深会更有效。当你变宽的时候你只不过增加了一些计算单元、增加了函数的个数,而在变深的时候不仅增加了个数,其实还增加了嵌入的层次,所以泛函的表达能力会更强。所以从这个角度来说,我们应该尝试变深。
给定一个数据集,我们希望把数据集里的东西学出来,但是有时候可能把这个数据本身的一些特性学出来了,而这个特性却不是一般的规律。当把学出来的错误东西当成一般规律来用的时候,就会犯巨大的错误,这种现象就是过拟合。为什么会把数据本身的特性学出来?就是因为我们的模型学习能力太强了。
所以以往我们不太用太复杂的模型,为什么现在我们可以用这样的模型?其实有很多因素,第一个因素是现在我们有很大的数据,那么比如说我手上如果只有 3000 多数据,学出来的特性就不太可能是一般规律。但是如果有三千万、甚至三千万万的数据,那么这些数据里的特性本来就是一般规律,所以使用大的数据本身就是缓解过拟合的关键条件。
第二个因素,今天有很多很强大的计算设备,所以才能够训练出这样的模型,同时通过领域里很多学者的努力,我们有了大量关于训练这样复杂模型的技巧和算法,所以这使得我们使用复杂模型成为可能。
按照这个思路来说,其实有三件事:第一,我们今天有更大的数据;第二;有强力的计算设备;第三,有很多有效的训练技巧。
这导致我们可以用高复杂度的模型。而深度神经网络恰恰就是一种很便于实现的高复杂度的模型。所以这么一套理论解释,如果我们说它是一个解释的话,它好像是能告诉我们为什么我们现在能用深度神经网络。为什么它能成功?就是因为复杂度大。
在一年多之前,我们把这个解释说出来的时候,其实国内外很多同行也很赞同这么一个解释,因为大家觉得这听起来蛮有道理的,其实我一直对这个不是特别满意,这是为什么?其实有一个潜在的问题我们一直没有回答。如果从复杂度解释的话,我们就没有办法说为什么扁平的或者宽的网络做不到深度神经网络的性能?因为事实上我们把网络变宽,虽然它的效率不是那么高,但是它同样也能起到增加复杂度的能力。
实际上我们在 1989 年的时候就已经有一个理论证明,说神经网络有万有逼近能力:只要你用一个隐层,就可以以任意精度逼近任意复杂度的定义在一个紧集上的连续函数。
其实不一定要非常深。这里面我要引用一个说法,神经网络有万有逼近能力,可能是有的人会认为这是导致神经网络为什么这么强大的一个主要原因,其实这是一个误解。
我们在机器学习里面用到的所有模型,它必须具有万有逼近能力。如果没有这个能力,根本不可用。所以最简单的,哪怕傅立叶变换,它就已经有这个能力,所以这个能力不是神经网络所特有的。那我们在这儿要强调的一件事情是什么?其实我只要有一个隐层,我加无限度的神经元进去,它的能力也会变得很强,复杂度会变得很高。但是这样的模型无论在应用里面怎么试,我们发现都不如深度神经网络好。所以从复杂的角度可能很难解决这个问题,我们需要一点更深入的思考。
所以我们要问这么一个问题:深度神经网络里面最本质的东西到底是什么?今天我们的答案可能是要做表示学习的能力。以往我们用机器学习,首先拿到一个数据,比如这个数据对象是一个图像,我们就用很多特征把它描述出来,比如说颜色、纹理等等,这一些特征都是我们人类专家通过手工来设计的,表达出来之后我们再去进行学习。
而今天我们有了深度学习之后,现在不再需要手工设计特征,把数据从一端扔进去,模型从另外一端出来,中间所有的特征完全通过学习自己来解决,这是所谓的特征学习或者表示学习,这和以往的机器学习技术相比是一个很大的进步,我们不再需要完全依赖人类专家去设计特征了。
有时候我们的工业界朋友会说,这里面有一个很重要的叫做端到端学习,大家认为这个非常重要。其实这一件事情要分两个方面来看:一个方面当我们把特征学习和分类器学习联合起来考虑,可以达到联合优化的作用,这是好的方面;但另一方面,如果这里面发生什么我们不清楚,这时候端到端的学习不一定真的好,因为可能第一部分往东,第二部分往西,合起来看往东走的更多一些,其实内部有一些东西已经抵消了。
实际上机器学习里面早就有端到端学习,比如说做特征选择,但这类方法是不是比其它特征选择的方法要强?不一定,所以这不是最重要的,真正重要的还是特征学习或者表示学习。
我们再问下一个问题,表示学习最关键的又是什么?对这件事情我们现在有这么一个答案,就是逐层的处理。现在我们就引用非常流行的《深度学习》一书里的一张图,当我们拿到一个图像的时候,如果我们把神经网络看作很多层的时候,首先在最底层我们看到是一些像素的东西,当我们一层一层往上的时候,慢慢的有边缘,再往上有轮廓等等,在真正的神经网络模型里不一定有这么清晰的分层,但总体上确实是在往上不断做对象的抽象。
而这个特点,我们现在认为这好像是深度学习真正成功的关键因素之一,因为扁平神经网络能做很多深层神经网络所做的事,但是有一点它做不到:当它是扁平的时候,就没有进行一个深度加工,所以深度的逐层抽象可能很关键。那如果我们再看一看,大家可能就会问,其实逐层处理这件事,在机器学习里也不是一个新东西。
以前有很多逐层处理的东西,比如说决策树,它就是逐层处理,这是非常典型的模型。这个已经有五六十年的历史了,但它为什么做不到深度神经网络这么好呢?首先它的复杂度不够,因为决策树的深度,如果我们只考虑离散特征,其最深的深度不会超过特征的个数,所以它的模型复杂度有上限;第二整个决策树的学习过程中,它内部没有进行特征变化,始终是在一个特征空间里面进行,这可能也是一个问题。
大家如果对高级一点的机器学习模型有所了解,你可能会问,现在很多 Boosting 模型也是一层一层往下走,为什么它没有取得深度学习的成功?我想问题其实差不多,首先复杂度还不够,第二,更关键的一点,它始终在原始空间里面做事情,所有的这些学习器都是在原始特征空间,中间没有进行任何的特征变换。
深度神经网络到底为什么成功?里面的关键原因是什么?我想首先我们需要两件事,第一是逐层地处理,第二我们要有一个内部的特征变换。而当我们考虑到这两件事情的时候,我们就会发现,其实深度模型是一个非常自然的选择。有了这样的模型,我们很容易可以做上面两件事。但是当我们选择用这么一个深度模型的时候,我们就会有很多问题,它容易 overfit,所以我们要用大数据,它很难训练,我们要有很多训练的 trick,这个系统的计算开销非常大,所以我们要有非常强有力的计算设备,比如 GPU 等等。
实际上所有这些东西是因为我们选择了深度模型之后产生的一个结果,他们不是我们用深度学习的原因。所以这和以往我们的思考不太一样,以往我们认为有了这些东西,导致我们用深度模型,现在我们觉得这个因果关系恰恰是反过来的——因为我们要用它,所以我们才会考虑上面的这些东西。
而另外还有一点我们要注意,当我们要有很大的训练数据的时候,这就要求我们必须要有很复杂的模型。假设我们有一个线性模型的话,给你 2000 万要的还是 2 亿的样本,其实对它不是太大区别,它已经学不进去。而我们有了充分的复杂度,其实我们看到恰恰它又给我们使用深度模型加了一分。
由于这几个原因,我们才觉得可能这是深度学习里面最关键的事情。所以这是我们现在的一个认识:第一我们要有逐层的处理;第二我们要有特征的内部变化;第三,我们要有足够的模型复杂度。
这三件事情是我们现在认为深度神经网络为什么能够成功的关键原因,或者说这是一个猜测。如果满足这几个条件,我其实可以马上想到,不一定真的要用神经网络,神经网络是选择的几个方案之一,我只要同时做到这三件事,别的模型也可以,并不一定只能用深度神经网络。
我们就要想一想,我们有没有必要考虑神经网络之外的模型?其实是有的。因为大家都知道神经网络有很多缺陷。
第一,凡是用过深度神经网络的人都知道,你要花大量的精力来调它的参数,因为这是一个巨大的系统。这里面会带来很多问题,首先当我们调参数的时候,这个经验其实是很难共享的。有的朋友可能说,我在第一个图像数据集之上调数据的经验,当我用第二个图像数据集的时候,这个经验肯定可以重用的。但是我们有没有想过,比如说我们在图像方面做了一个很大的神经网络,这时候如果要去做语音,其实在图像上面调参数的经验,在语音问题上可能基本上不太有借鉴作用,所以当我们跨任务的时候,经验可能就很难有成效。
而且还带来第二个问题,我们今天都非常关注结果的可重复性,不管是科学研究、技术发展,都希望这结果可重复,而在整个机器学习领域里面,深度学习的可重复性是最弱的。我们经常会碰到这样的情况,有一组研究人员发文章报告了一个结果,而这结果其他的研究人员很难重复。因为哪怕你用同样的数据、同样的方法,只要超参数的设计不一样,你的结果就不一样。
我们在用深度神经网络的时候,模型的复杂度必须事先指定,因为在训练模型之前,神经网络是什么样就必须定了,然后才能用 BP 算法等等去训练它。其实这就会带来很大的问题,因为在没有解决这个任务之前,我们怎么知道这个复杂度应该有多大呢?所以实际上大家做的通常都是设更大的复杂度。
如果在座各位关注过去三四年里深度神经网络、深度学习领域的进展,你可以看到很多最前沿的工作在做什么事呢?其实都是在有效地缩减网络的复杂度。比如说 ResNet 网络,还有最近大家经常用的模型压缩等,其实我们想一想不都是把复杂度变小,实际上是先用了一个过大的复杂度,然后再降下来。
那么我们有没有可能在一开始就让这个模型的复杂度随着数据而变化?这一点对神经网络可能很困难,但是对别的模型是有可能的。还有很多别的问题,比如说理论分析很困难,需要非常大的数据,黑箱模型等等。
那么这些能不能用来构建深度模型?能不能通过构建深度模型之后得到更好的性能呢?能不能通过把它们变深之后,使得今天深度模型还打不过随机森林这一些模型的任务,能够得到更好的结果呢?
那我们自己就受到这样的一个启发,我们要考虑这三件事,就是刚才跟大家分析得到的三个结论:第一要做逐层处理,第二是特征的内部变换,第三我们希望得到一个充分的模型复杂度。
我自己领导的研究组最近在这一方面做了一些工作,我们最近提出了一个
深度森林的方法。
在这个方法里面我今天不跟大家讲技术细节,它是一个基于树模型的方法,主要是借用集成学习的很多想法。其次在很多不同的任务上,它的模型得到的结果和深度神经网络是高度相似的,除了一些大规模的图像等等。在其他的任务上,特别是跨任务表现非常好,我们可以用同样一套参数,用在不同的任务中得到不错的性能,就不需要逐任务的慢慢调参数。
还有一个很重要的特性,它有自适应的模型复杂度,可以根据数据的大小自动来判定该模型长到什么程度。它的中间有很多好的性质,有很多朋友可能也会下载我们的开源代码拿去试,到时候我们会有更大规模分布式的版本等等,要做大的任务必须要有更大规模的实现,就不再是单机版能做的事。
但另一方面,我们要看到这实际上是在发展学科思路上一个全新的思路探索,所以今天虽然它已经能够解决一部分问题了,但是我们应该可以看到它再往下发展,前景可能是今天我们还不太能够完全预见到的,所以我这边简单回顾一下卷积神经网络,这么一个非常流行的技术,它其实也是经过了很长期的发展。
最早信号处理里面关于卷积的出现,其实是有一个多世纪了,但是现在深度神经网络的历史是从 1962 年两位诺贝尔奖得主关于生物视觉皮层的研究开始。但是不管怎么样第一次在神经网络里引入卷积是 1982 年,在此之后他们做了很多的工作,1989 年引入 BP 算法,那时算法就已经成型了,到了 1995 年第一次对 CNN 有了一个完整的描述,在 1998 年对美国支票的识别取得了很大的成功,在 2006 年提出了通过无监督逐层训练深层模型,到了 2009 年这个技术被引到 CNN 里,我们可以做深度的 CNN,2012年深度的 CNN 被用在 ImageNet 比赛中,直接掀起了一波深度学习的浪潮。
我所做的工作的最重要的意义是什么呢?以前我们说深度学习是一个黑屋子,这个黑屋子里面有什么东西呢?大家都知道它有深度神经网络,现在我们把这个屋子打开了一扇门,把深度森林放进来,我想以后可能还有更多的东西。所以这是这个工作从学术科学发展上的意义上,有一个更重要的价值。
最后我想用两分钟的时间谈一谈,南京大学人工智能学院马上跟京东开展全面的、深入的在科学研究和人才培养方面的合作。
关于人工智能产业的发展,我们要问一个问题,我们到底需要什么?大家说需要设备吗?其实做人工智能的研究不需要特殊机密的设备,你只要花钱,这些设备都买得到,GPU 这些都不是什么高端的禁运的商品。第二是不是缺数据?也不是,现在我们的数据收集存储、传输、处理的能力大幅度的提升,到处都是数据,真正缺的是什么?
其实人工智能时代最缺的就是人才。因为对这个行业来说,你有多好的人,才有多好的人工智能。所以我们现在可以看到,其实全球都在争抢人工智能人才,不光是中国,美国也是这样。所以我们成立人工智能学院,其实就有这样的考虑。
可能我们投资风口里面有一些词,今年还很热,明年就已经不见了,这些词如果我们追究一下,它里面科学含义到底是什么?可能没几个人说的清楚,而人工智能和这些东西完全不一样,是经过 60 多年发展出来的一个学科。
高水平的人工智能人才奇缺,这是一个世界性的问题,我们很多企业都是重金挖人,但实际上挖人不能带来增量,所以我们要从源头做起,为国家、社会、产业的发展培养高水平的人工智能人才。
|