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