神经网络从“飞龙在天”到“亢龙有悔”,只用了几年时间,便迎来了“第二代终结者”。有趣的是,第二代终结者的出现正是为了解决第一代终结者所引发的问题。
异或问题本质上是线性不可分问题。为解决这个问题,人们引入了非线性因素,并利用参数化的学习方法(如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刚出现时,与单层感知器一样,只能处理线性分类问题。两者后来都能处理非线性问题,本质都是对原始数据进行空间变换,使其能够被线性分类。两者对如何做空间变换的路径不同: - 对于神经网络,是通过隐藏层的矩阵运算,使数据从线性不可分转换为线性可分。 - 对于SVM,是通过“核函数”完成这一转换。1995年,Vladimir Vapnik(LeCun在贝尔实验室的同事)等人以“支持向量网络”的名义发布改进后的SVM,很快表现出相较于神经网络的优势:无需调参、速度快、全局最优解,较好地解决了BP算法的问题。因此,虽然第二次神经网络进入低谷没有标志性事件,但普遍认为1995年可以视为转折点。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工具,而不仅仅是“打补丁”(和二十多年前一样)。读者也可能得出自己的“终结者问题”。思考这些问题,并不意味着我们否定深度学习,而是有助于我们进一步拓宽思路。也许,如之前的两次复兴一样,答案并不复杂,需要的只是从常识出发,去发现工程的技巧。
本文节选自《深度学习导论》