第二代终结者:收敛速度与泛化问题
神经网络从“飞龙在天”到“亢龙有悔”,也只花了几年时间,就又遇到了“第二代终结者”。有趣的是,第二代终结者的出现本身又是为了解决第一代终结者问题而导致的。
异或问题本质上是线性不可分问题。为了解决这个问题,在网络里引入非线性,以及将这些非线性函数组合的参数化学习方法(BP算法等)。但是这样复杂的高维非线性模型,在计算上遇到了很多挑战,基本上都是和链式求导的梯度算法相关的。
首先就是“慢”。训练一个规模不算很大的神经网络花上几天时间是很正常的,在中国就更艰苦了。1998年在读研究生时我得到的第一台计算机是一台“486”,在那上面运行MATLAB的神经网络程序,隐藏层节点都不敢超过20个。为什么这么慢呢?全连接的前馈网络,参数空间维数大幅增加,导致了维度灾难(The Curse of Dimensionality),参数组合的数量呈指数增长,而预测的精度与空间维数的增加反向相关,在20世纪90年代有限的算力支持下,规模稍大的问题就解决不了了。
“万能近似定理”虽然说明了我们可以逼近任意函数,但是并不保证有一个训练算法能够学习到这个函数。虽然后来我们知道,同样的神经元数量,多隐层会比单隐层收敛得更快(虽然单隐层和多隐层在表达力上对于连续函数没区别),但是那时候由于不能解决“梯度消失”的问题(后面还会讲到),很少人会用多隐层。所以,神经网络内在的结构性是不好的。那时候也有很多“打补丁”的方法,比如,通过进化神经网络来寻找最优节点结构,或者自适应步长迭代,等等,但事后看,都是些治标不治本的方法。
维度灾难的另一个后果是泛化问题。比如训练一个手写数字识别器,稍微变化一下图像可能就识别不了了。这个问题的原因是误差求导是在一个高维空间里,目标函数是一个多“峰值”和“谷底”的非线性函数,这就导致了梯度下降迭代终点(“吸引子”)往往不一定是希望找到的结果(全局最优解)。甚至,有些迭代终点根本不是任何目标模式,称为“伪模式”或者“伪状态”。
Hinton在2015年的一个教程里也总结了基于BP的前馈网络的问题。
(1)数据:带标签的数据集很小,只有现在(2015)的千分之一。
(2)算力:计算性能很低,只有现在(2015)的百万分之一。
(3)算法:权重的初始化方式和非线性模型错误。
后来,数据问题和算力问题被时间解决了,而算法问题早在2006年前后就被解决了(即深度学习革命)。
回到1995年,那时大家并没有Hinton在20年后的这些洞见,但是也能意识到神经网络的这些问题很难解决。再一次,“极高的期待导致极度的怀疑”,未能兑现的承诺导致了资金的快速撤离和学术热情的大幅下降。几乎所有的神经网络公司都关门了——至少有300家AI公司,包括Minsky的Thinking Machines(1994)也关门了。
这时候恰好出现了基于统计机器学习的其他竞争方法,导致大家逐渐抛弃了神经网络而转向统计机器学习,如支持向量机(SVM)、条件随机场(CRF)、逻辑回归(LR回归)等。其实这些方法也都和神经网络有千丝万缕的联系,可以证明与某些特定的网络等价,但是相对简单、快速,加上出现了一些成熟的工具,到20世纪90年代后期在美国就成为主流了。
这里只对SVM做一下分析。1963年SVM刚出现的时候,和单层感知器一样,都只能处理线性分类问题。两者后来能处理非线性问题,本质都是对原始的数据进行了一个空间变换,使其可以被线性分类,这样就又可以用线性分类器了,只是两者对如何做空间变换途径不同:
- 对于神经网络,是用隐藏层的矩阵运算,使得数据的原始坐标空间从线性不可分转换成了线性可分;
- 对于SVM,是利用“核函数”来完成这个转换的。1995年,由Vladimir Vapnik(LeCun在贝尔实验室的同事)等人以Support Vector Network的名义发布了改进后的SVM,很快就在多方面体现出了相较于神经网络的优势:无需调参,速度快,全局最优解,比较好地解决了上述BP算法的问题,很快就在算法竞争中胜出。因此,虽然第二次神经网络进入低谷没有一个标志性事件,但是一般认为Vapnik发表“Support Vector Network”这篇文章的1995年可以算转折点。SVM到底算不算神经网络的一种呢?其实线性的SVM和线性的感知器是等价的。两者都是从线性模型到深度学习之间过渡,即:
- 线性模型;
- 线性SVM ⇔ 单层感知器;
- 非线性核SVM ⇔ 多层感知器;
- 深度学习。
只是,SVM以牺牲了一点表达力灵活性(通常核函数不是任意的)为代价,换来了实践上的诸多方便。而神经网络在之后的17年里,逐渐从“主流”学术界消失了,直到跌到了“鄙视链”的最下面。据说Hinton从20世纪90年代到2006年大部分投稿都被会议拒掉,因为数学(相比统计机器学习)看起来不够“fancy”(新潮)。
20世纪90年代中期到2010年左右在整体上被认为是第二个AI冬天,神经网络无疑是其中最冷的一个分支。值得一提的是,这段时间内互联网兴起,连带导致机器学习方法和语义网方法的兴起,算是这个寒冬里两个小的局部春天。不过在这个神经网络“潜龙勿用”的第二个蛰伏期,有些学者依然顽强坚持着,转机又在慢慢酝酿。
为什么深度学习能战胜“第二代终结者”,取得这么好的成绩呢?我想从算法细节、算法哲学、工程成本三个角度谈一些个人看法。
1.从算法细节的角度分析
前面我们提到链式求导带来一系列问题。单隐层全连接造成收敛速度不够快,但是由于“梯度消失”(或对偶的“梯度爆炸”)问题,难以实现多隐层误差反向传播。而且,网络还有泛化能力不好、容易过拟合等问题。
它的解决方法其实并不复杂。首先,用分段线性函数ReLU: f(x)=max(0,x)取代sigmoid激活函数——这个函数甚至不是严格可微的。线性保证了它的导数不会趋近于零,分段线性则保证了我们可以分段逼近一个函数,尽管从理论上这个逼近不平滑,但是工程上够用。
实践表明,ReLU函数在训练多层神经网络时,更容易收敛,并且预测性能更好。这不是从理论推导出来的结果,而是有了实践之后,反过来总结出来的。我们发现单侧抑制一些神经元(ReLU的实际作用)会导致“表征稀疏”,而这反而是好事,既让表示更具有鲁棒性,又提高了计算效率。
这种丢弃信息反而提高效果的工程实践在深度学习的其他一些细节也有体现。比如,“丢弃”算法(dropout)通过每次训练让部分神经元“装死”来避免过拟合,卷积神经网络中引入“池化”(pooling)丢弃一些输入信息反而会指数级减小泛化误差。
以上种种工程技巧,基本原理并不复杂,一旦捅破窗户纸,不免给人“原来如此简单”的感觉。与当初战胜“第一代终结者”也颇有类似之处,就是并非依赖一个高深莫测的新理论,而是依赖一些朴素的“常识”,去从工程上想办法。
那为什么这些看似简单的方法,要过十几年才被接受呢?大概是因为学术界的遗忘周期是15年吧!三代博士过后大家基本就不记得从前了。正所谓“人心中的成见是一座大山”,直到连成见都被遗忘了,才会有新的开始。
2.从算法哲学的角度来分析
总的来说,神经网络的演进一直沿着“模块化+层次化”的方向,不断把多个承担相对简单任务的模块组合起来。BP网络是感知器的层次化,深度学习网络则是多个BP网络的层次化——当然后来也出现了多种非BP网络的深度层次化。Hinton最近提出的“胶囊”(capsule)网络就是要进一步模块化。层次化并不仅仅是网络的拓扑叠加,更重要的是学习算法的升级,例如,仅仅简单地加深层次会导致BP网络的梯度消失问题。
从本质上说,深度学习网络可以比经典的BP网络处理更复杂的任务,在于它的模块性,使得它可以对复杂问题“分而治之”(Divide and Conquer)。无论是多层前馈网络,还是循环神经网络,都体现了这种模块性。因为我们处理的问题(图像、语音、文字)往往都有天然的模块性,学习网络的模块性若匹配了问题本身内在的模块性,就能取得较好的效果。
这可以看成一种连接主义的“动态规划”,把原来全连接网络的训练这种单一决策过程,变成了多阶段决策过程。例如,在多层卷积网络对图像的处理中,会出现不同的层次依次“抽取”出了从基础特征到高层次模式的现象,每一层基于上一层的输入,就相当于很多子任务可以被重用了。所以这种方法也被称为表示学习(representation learning)方法。
这样的好处是多方面的,既极大提高了学习收敛的速度(解决了维度灾难),又可避免那些“不合理”的局部最优解(因为它们在模块性匹配的过程中被自然淘汰了)。
从这个角度去理解,深度神经网络是“优雅”的,在于它简洁而美。一个“好”的模型,通常是“优雅”的。这很难说是什么科学道理,但是就和物理学一样,一个计算机科学的算法,如果它是技术主干道上的一个有深远价值的东西,往往它是“美”的,简洁的,没有太多补丁。一个糟糕的算法,就好像托勒密的“本轮”,一个补丁套一个补丁,或者像在发明抗生素之前治疗肺结核的方法,神秘而不可解释。如之前给BP网络和Hopfield网络打各种补丁的方法,前置各种ad-hoc不变形特征提取器,用进化算法训练网络结构,用局部定位消除虚假吸引子,等等,数学上都高深莫测,但是效果并不好。现在回头看,那些模型都很“丑”。
深度学习把学习分层,不是个数学问题,而是个知识重用问题,每一层自然分解出不同等级的特征,从底层特征到高层特征。这样一下子就把原来打几千种补丁的必要性都消灭了。这个架构是优雅的,也同时解决了收敛速度问题和泛化问题,因为它触及了问题的本质。一个优雅的方法,基本的原理往往是特别好懂的,不用看公式就能懂。
这里多说一句,深度学习模型现在大火的同时,也出现了很多对它的“本轮”补丁,如一些几百层的神经网络模型。搞得这么复杂的模型,通常在技术演进上是旁支。
3.从工程成本角度分析
深度学习的成功,工具系统的可用性是很关键的因素。工具大大降低了运用这些方法的门槛。深度学习被采用,并不一定是因为它效果最好——许多场合可能就和传统方法的最好水平差不多。但是,发挥传统方法的最好水平需要一位有多年经验的“老中医”,而深度学习工具可以让一个刚出道的学生就达到相近或稍差的表现,在语音和图像场景上更可以超出传统方法。这从管理学和经济学上都带来了巨大的好处。
例如2006年Netflix推荐算法大赛,冠军团队利用集成算法,整合了107种算法,最后提高了10个百分点。而2016年,有人用Keras写了一段不到20行的深度神经网络程序就得到了类似的结果。又如基于深度学习的依存文法解析器senna和传统的Stanford parser相比,效果接近,略差一点,但是从建模复杂性上,senna就远远比Stanford parser简单了,senna只用了一个零头的代码量就达到了接近的效果。
以前需要“老中医”来做特征工程,现在交给深度学习来进行表示学习(representation learning),通过深度神经网络中的逐层加工,逐渐将低层的特征表示转化为高层的特征表示。
同样,以前也需要“老中医”来对核函数(kernel)、卷积模板(mask)等强烈依赖经验的计算单元进行选择或者构造,这限制了可能的学习种类。深度学习网络相当于可以从数据中学习kernel或者mask,大大提高了灵活性,降低了对经验的依赖。
又如,在深度学习中广泛采用预训练模型(如最近很火的BERT)。这个想法的本质是知识重用。可复用的预训练模型作为“工作母机”,可以被后续的工程再去针对特定的任务修正和调优。
综上所述,大量深度学习工具的出现,大大降低了神经网络的入门门槛,大大增加了神经网络工程师的供给总量,大大降低了领域专家介入成本,从而有利于控制工程总成本。
不过,现实的问题求解并不是单一工序。任何一个实际问题的解决,都需要工程上的细致的问题分解,并不总是存在“端到端”的方法,多种工具的组合运用是工程不可或缺的。随着深度学习的普及,最近几年毕业的学生,很多甚至不知道深度学习之外的方法了,连传统机器学习都丢掉了,更不用说规则方法了,这对实际解决问题将是有害的。
会有第三代终结者吗?
深度学习如今进入了本轮高潮的第7个年头,正如日中天,在前所未有的海量资金投入时,讨论是不是会有什么因素导致本轮高潮的结束似乎是杞人忧天。有人认为,这一次的神经网络复兴将是最后一次,因为神经网络将不可能再次进入低谷。不过,“一切伟大的世界历史事变……可以说都出现两次”。“极高的期待导致极度的怀疑”这件事已经发生两次了,如今正处在第三次“极高的期待”中,很多名人又开始担心人工智能威胁人类了。为了这一领域的健康发展,我们也应该审视深度学习是不是有其自身的边界,并提前想一想对这些边界的应对。
如之前的分析,第二代终结者问题(链式求导的副作用)恰恰是为了解决第一代终结者问题(非线性分类)而带来的新问题。那终结第三次神经网络高潮(深度学习)的会不会也是为了解决第二代终结者问题而导致的新问题呢?
“暴力美学”问题。当我们加深网络层次并引入模块性的时候,会带来什么副作用呢?现在深度学习反而变得越来越贵,层数越来越多,预训练模型也越来越昂贵,深度学习在很多场景下反而变成了“暴力美学”,成为拼数据、拼GPU的烧钱游戏。但是,其实去非巨头的企业走走就会知道,大多数的领域落地问题,还不能承担这种成本,尤其是很多机构组织的问题解决,必须从低成本小问题开始。“暴力美学”式的深度学习,就只能停留在“头部问题”(即存在大量数据和大量算力的问题)上,而难以解决大多数垂直领域问题。
“炼丹”问题。深度学习的结果越来越难以解释和定向优化,整个系统是个“炼丹”的黑箱。当然,这个问题不是深度学习独有的,是整个“连接主义”方法共同的问题。只是深度学习把这种“炼丹”推到了一个全新的高度,调参的效果往往不可理解,没法解释。但是非常多的应用问题,如医疗和自动驾驶,的确是需要可解释性和定向优化的,这就限制了应用的效果。
递归性序列问题。黑箱问题本身可能还不是致命的,但是它又带来了另一个问题:一些在人看起来很清晰的问题,基于海量的训练数据机器还是学习不好。这类问题通常是一种“递归性生成规则”,最简单的如数字的构成规则,基于这些规则可能生成无穷无尽的序列。基于纯语料对齐技术训练,就很难得到不出错的中英文数字翻译。类似的递归性序列不仅在语言中大量存在,在表格、篇章等结构中也广泛存在。深度学习到底能不能在工程上解决这类语法归纳(grammar induction)问题,还是个待实践的问题。
知识融合问题。这个问题也是近来学术界关注的热点。如何把先验知识或者“知识图谱”(即数据本身的结构性)融合进深度神经网络?各类的向量化方法被提出,语义并不依赖于把符号直接映射到模型世界的个体上,而取决于个体的统计特性。但是除了词向量,其他更复杂的知识结构(例如属性、二元关系和表达式)在工程上依然鲜有成功。在自然语言处理中,外源知识恐怕是难以避免的,目前的向量化方法,似乎还不足以独立完成这个 任务。
深度学习的这些问题(潜在的“第三代终结者”问题),也同样是难以仅仅用拓扑的改良来解决的,例如增加神经网络层数或者再提升数据的量级。可能需要我们进一步提出更先进的网络结构,或者融合其他的AI工具,而不仅是“打补丁”(和二十多年前一样)。读者可能也会得出自己的“终结者问题”。思考这些问题,并不意味着我们否定深度学习,而是有助于我们进一步拓宽思路。也许,如之前的两次复兴一样,答案并不复杂,需要的仅仅是从常识出发,去发现工程的技巧。
以上内容摘自《深度学习导论》的中文版序
神经网络(包括深度学习)是最好的第一种算法和最后一种算法。当你对一个问题一无所知,请用神经网络。当一个问题已经被明确可解,神经网络总是可以帮你达到已知的最优结果。在两者之间,神经网络和其他算法一样优秀或者糟糕。神经网络模型在实践有效后通常都会经历简化,甚至部分“白箱”化。这在工程上是几乎一定会发生的。总之,它是一个“最不坏的选择”。
我们可以做到的是实事求是,一切从实践出发,一切从工程出发,去理解约束,理解落地细节,抓住本质。我们也会经历知其然、知其所以然,到知未然的认识深化过程。对神经网络这样一种颇为复杂的工具,比较和实践都是不可或缺的。
Charniak的这本书就是可以帮助您达到这一点的优秀参考书。它是一本实事求是的教材,它也是一本以工程为导向的指南,以Python和Tensorflow为实践工具,可以带你以清晰的逻辑进入实战,去领略基础的深度学习算法如CNN、RNN、LSTM、GAN等。这本书只是一个开始,正如本文前面所述,神经网络是一个有深厚历史渊源的学科,在未来还有很多其他的进阶话题等着对此有兴趣的读者去探索。