第二卷:寒武纪的来临--算力觉醒与物种大爆发
1、NP问题的解决范式
在描述数学问题的方法中,我们常用P和NP问题这种分类。
P (Polynomial time)问题,代表的是“容易解决”的问题。比如:计算
123
×
456
,计算机可以在极短时间内算出答案。它指一个算法的运行时间(或步骤数)不大于问题规模n的多项式倍数,在这种情况下,无论n的规模有大(多复杂的问题)都是可以算得出来的。
而相对的,NP (Nondeterministic Polynomial time)问题,则代表的是“容易验证”的问题。这类问题的计算难度无论大小,只要容易验证的,都属于NP问题。NP问题又根据求解难度和是否容易验证,分为NP-Hard和NP-Complete。NP-Hard是指在求解难度上,最难的那类问题,而NP-Complete则是指那些在难度上是NP-Hard,而且容易验证的问题。这三类问题的关系的示意图是这样的。
P和NP问题关系的示意图
NP问题的求解困难的核心本质是组合爆炸。用搜索的角度来看NP,解题的核心困难在于搜索空间的大小与搜索效率之间的极端矛盾。这类问题就像是在一个几乎无限大的迷宫里找出口,虽然你手里有一张能瞬间验证“这是否是出口”的地图(多项式时间内验证解,P问题),但你却没法在合理的时间内走完所有的路。
再具体一点看,之所以没办法在合理时间走完所有的路的原因有三点:
可以选择的路线太多
没有指向到终点的路标
走错了回头的成本太高
从智能的角度来看这三个原因分别对应着直觉判断能力、逻辑推理能力和记忆能力。虽然求解NP-Complete问题的方法,只存在于图灵的想象中,现实中的数学规律根本不支持我们去求解它,但是人类总是希望不断的挑战复杂,现实生存的压力也在迫使着人类向着复杂问题的领域进发。所以在现实中即使找不到解决NP-Complete问题的统一解法,也必须尝试对某些具体的NP-Complete问题求解。久而久之,人类总结出了一些解决问题的范式。计算智能的发展路径就是沿着解决这三点困难,一步一步发展的。
第一种范式叫做“近似”。这种范式主要针对的是第一类选择路线太多的问题。仔细分析一下,选择路线过多的主要原因在于组合爆炸,神经网络的层数越多,迷宫的岔路口越多,这种组合情况带来的总体数量就越大。近似的核心要义就是“差不多就行了”,用提前停止的方法减少层数,从而减少路线的数量。
第二种范式叫做“松弛”。这种范式主要针对的是路标问题。在数学上难以求解,在现实中找不到路,最核心的原因其实是丧失了连续性。当经验是连续的,可以通过之前的经验来参考,当函数是连续的,可以通过求导来寻找其表象后面的规律(函数描述的是事物的当前状态,函数的导数描述的是事物变化的趋势)。一旦失去了连续性,数据变得离散,路标就消失不见了。松弛的本质就是将离散的数据变成连续的,从而让消失的路标重新出现。
第三种范式叫做“试错”。这种范式针对的主要是走错路回头的成本问题。当然,这种成本理论上是无法彻底消灭的,能消灭的是重复犯错的成本。试错的本质就是设计一套机制,将模拟结果和真实结果不断的比较,然后调整模拟的方法,持续不断的缩小两者之间的差距。反向传播就是这个范式的一种具体实现方法。
2、辛顿的“大缝合术”
辛顿解决梯度消失问题的方案,就是来自于这三种范式的“缝合”。辛顿用他的大缝合术创造了一个弗兰肯斯坦式的怪物“玻尔兹曼机”,这个玻尔兹曼机将梯度消失这堵墙壁撞开了一道又一道巨大的裂痕。
让我们具体的看一下,这个在整个人工智能发展历史上享誉盛名的玻尔兹曼机的创作过程吧。
在第三章,我们介绍了在Hopfield网络的原型基础上,辛顿把玻尔兹曼分布(也叫吉布斯分布)缝合进来,让网络形成了抖动。这在一定程度上,解决了在梯度消失的情况下随机性的引入。他把这种随机性的引入,命名为温度参数。这个参数也在日后,成为整个神经网络中的核心参数之一,它决定了整个网络输出的稳定性程度。但这并不是玻尔兹曼机的全部。
玻尔兹曼机是全连接设计,它的各个层之间的神经元节点也都是互相连接的。这个网络结构非常完美,理论上能模拟任何概率分布。但是因为全连接,所以训练它需要进行吉布斯采样(一种达到吉布斯分布的数学方法),这种方法的计算极为耗时,为了达到热平衡,可能需要算到宇宙毁灭。辛顿为此颇为苦恼。这个问题,早在PDP小组时期,就一直困扰着他。
当时,PDP小组的物理学家保罗·斯莫伦斯基(Paul Smolensky)提出了簧风琴模型(Harmonium)。簧风琴是一种乐器,这种乐器的发声原理是通过演奏者踩动踏板,风箱压缩空气,产生持续的气流。这股气流通过金属簧片,导致簧片在狭窄的槽口中高频振动,从而发出声音。当演奏者按下一个和弦C-E-G的时候,气流同时流过这三个簧片,每个簧片都在振动。这些振动在风箱和共鸣箱内互相干涉、互相叠加,最终形成悦耳的声音。
保罗·斯莫伦斯基(Paul Smolensky)
斯莫伦斯基认为认知过程就是在大脑中寻找“最大和谐度”的过程,这个过程和簧风琴产生音乐的过程是一样的。所以他认为,神经网络也应该设计成这样的结构。他认为神经元应该被严格分为两层,像气流一样的感知数据和像簧片一样的知识原子。簧片一样的知识原子之间并不互相连接,数据之间也不直接对话,它们的交互放在层间。
这个理念深刻的影响了辛顿,这被他和PDP小组整理在《并行分布处理》中,被称为“分布式表征”,作为一个严谨的计算概念提了出来。Harmonium作为分布式表征的物理形态,被辛顿改了个和玻尔兹曼机相关的名字,以证明它是玻尔兹曼机的一个变种,从此Harmonium就变成了受限玻尔兹曼机RBM。但是此时,RBM的训练方法还没找到合适的。直到辛顿又一次的“移情别恋”的失败尝试之后。
辛顿是个怀疑论者,他遇到挫折时不是那么的固执,而总是会换个思路。而这种换个思路,往往会从另外一个角度绕回来解决他之前暂时放下的问题。他对RBM的训练方法,就来源于他的另一次失败的尝试。
1990 年代中期,虽然辛顿大力推广了反向传播,但内心深处对它是存疑的。作为一个对生物学有着深厚的造诣的学者,他只要想到大脑并不存在反向传播这一机制,就如鲠在喉,心中有着说不出的别扭。此时,从美国加州的索尔克生物研究所来了一位博士后研究生,名字叫彼得·达扬(Peter Dayan),师从计算神经科学的开山鼻祖特伦斯·塞诺夫斯基 (Terry Sejnowski)。他研究的是多巴胺神经元的放电模式。1993年,他来到多伦多大学,在辛顿的实验室,开始研究神经网络。
彼得·达扬(Peter Dayan)
此时,整值神经网络的寒冬,辛顿正陷入“大脑里没有反向传播”的自我否定之中。但彼得·达扬的到来,彻底把他拉出了怀疑的困境。达扬告诉辛顿,他在神经科学领域的最新研究表明,大脑中的多巴胺神经元,会向全脑广播一个全局标量信号,这个信号代表了 Error = \text{实际} - \text{预期}。虽然大脑不能像 BP 那样通过突触链式回传误差,但它可以通过多巴胺的弥散,向所有相关的神经元广播一个误差信号。这让辛顿确信,BP 这种利用误差修改权重的方法在生物学是真实存在的。
那段时间,他们两个的话题几乎都是生物学相关的内容。他们曾经不止一次的谈起德国物理和生理学家亥姆霍兹,尤其是他的名言:“知觉是无意识的推断”。
当时亥姆霍兹提出这句话时,是为了解释视错觉。
他认为,落在人的视网膜上的只是二维的光斑。在现实世界里,产生这些光斑的,是一个三维的、有物理规律的世界。大脑的推断过程必须进行反向推理,已知二维光斑的这个结果,反推三维物体这个原因。这个反推过程极快,人根本感觉不到自己在做几何计算。这就是“知觉是无意识的推断”的字面意思。
这句话让辛顿和达扬产生了顿悟:如果要造一个像大脑一样的机器,这个机器必须包含两个部分。一个负责模拟世界如何产生光,一个负责根据光反推世界。
为了纪念这个顿悟,他们把他们设计的一个包含两套神经网络连接的网络,称为亥姆霍兹机。这个机器由两套完全独立的网络组成,就像一个人的两重人格,第一个网络是识别网络,是自底向上的,它的任务是感知,看到图像推断是什么原因产生了它,在网络中的表现就是填充隐藏变量。另外一个网络是生成网络,它的任务是想象,根据网络中的隐藏变量,生成一张图。
这两个网络的训练方法,是他们两个最天才的想法之一,这个训练方法被称为Wake-Sleep 算法。他们先让网络处于苏醒状态(Wake),此时机器能看到真实的训练数据,用识别网络把数据变成隐藏层的特征表示。识别网络的训练目标是,让这个网络更容易产生这种数据。
然后,让机器进入睡眠状态(sleep),此时让生成网络,从随机噪声开始,产生一个幻象。他们把这个过程比喻为做梦。因为这个幻象是机器自己生成的,所以机器是能找到做梦的源头数据的。利用这个梦和它的源头数据,去训练识别网络,让识别网络能够还原这些生成幻象的特征。
这里面最大的问题就是,生成网络的权重和识别网络是独立的,这就导致生成网络生成的内容可能都是光怪陆离的垃圾,但识别网络却还要不断的学习这些没有用的东西。这就使得整个网络的训练效率很低。另外由于整个网络由两部分构成,需要同时优化两个相对独立的目标,所以整个网络很难收敛。但当时他们还并没有意识到亥姆霍兹机从架构上就是错误的。
最终让她们两个意识到问题的是这样一个思想实验。这被辛顿称为“解释推脱”现象。有一个场景是:假设“地震”和“卡车路过”都能导致“房子晃动”。当你感觉到“房子晃动”时,这两个原因的概率都上升。但如果你突然证实了是“卡车路过”,那么“地震”的概率应该瞬间下降。但是在亥姆霍兹机的机制下,是根本无法实现这种因果竞争的升降的。所以他们果断的放弃了这个实验性质的亥姆霍兹机。
但是辛顿的这套训练方法最终保留了下来,它和Harmonium的二分图结构完美融合,把两个网络的权重揉在一起,让生成和识别用同一套权重,最终形成了CD-K算法。
但是在当时的情况下,Harmonium的训练难度依然很高,基本上是个NP问题。此时辛顿开始利用第一种范式“近似”。他不再追求最优解,因为太浪费时间,他选择只走一步的CD-K算法,成功的让Harmonium,也就是受限玻尔兹曼机训练了起来。
辛顿用大缝合术,缝合了Hopfield网络、玻尔兹曼分布,Harmonium和亥姆霍兹机,形成了一个巨大的弗兰肯斯坦RBM,这个缝合怪开始向着梯度消失发起冲锋,墙壁被撞出一条条裂缝,但还并没有倒塌。
3、深度学习之道的确立
受限玻尔兹曼机缝合之后,辛顿做了一个大胆的尝试。他打算把多个RBM再一次缝合起来,形成一个深层网络,从而彻底规避深度问题。没错,我们的辛顿同学又一次选择了秦王绕柱式的打法,既然搞不定深度,那么就不搞。
他的具体做法是,逐层训练网络。首先他先训练第一层RBM-1,把原始数据喂给它,训练好,锁死它的权重。然后把RBM-1里提取的特征,也就是隐藏层的输出,当作第二层RBM-2的输入数据。以此类推,一层层的训练。这样就彻底避免了深度问题,因为只有一层,所以完全不会出现梯度消失问题。
当他把这堆RBM集合在一起,就组成了DBN。当时辛顿叠了三层RBM,加上最上面的输入层和最下面的输出层,一共五层网络。这在当时只有几百MB显存的时代,已经是个极深的网络了。
下面就到了见证奇迹的时刻了,辛顿开始把这个DBN网络叠起来之后,开始使用监督微调对整个网络的任务进行调整,此时用反向传播算法开始对整个DBN网络进行微调。神奇的是,这个网络并没有出现梯度消失,并且在手写数据识别任务上,达到了98.75% 的准确率。这个准确率超过了当时学术圈的霸主SVM,但是并不如当时五层网络的CNN。
可是,CNN是个判别式模型,它的目的就是为了分辨图像的类别的,它是“功利”的。它并不关心“猫”长什么样,它只关心“猫”和“狗”的区别在哪里。它在找决策边界,只是为了分类。而RBM是个生成模型,它试图理解数据的构造。它不关心分类,它只关心如何完美地重构输入的数据,然后辛顿用微调的方式,让RBM组合成的DBN强行让这个学会画画的画家来做分类工作。
如果同时让CNN和DBN来识别伪钞,可能的情况是这样的。CNN的使用方法,给他看一堆真钞和假钞,告诉他“这个水印不对是假的”。他会迅速的学会了看水印。DBN的使用方法,先教会他印钞票。当他精通了印钞的每一个细节后,你再给他一张假钞,他一眼就能看出哪里不对劲,哪怕那个错误是他从未见过的。
另外一个不同之处就是,CNN内部天生固化了一个规则:“这世界上的数据,相邻的元素一定是有关系的。”这个规则在图像、音频、视频、围棋棋盘等领域相当管用。但是,当CNN遇到违背这个规则的数据时,就不再管用了,它将无法理解这些数据。
这就是为什么DBN在专业任务上不如CNN,但是却引起了行业的震动的原因。它不仅证明了深层网络会有更好的效果,更是证明了深层全连接的网络是可以训练的。
更重要的是,DBN训练时的一些方式,真正的影响了整个神经网络发展的范式,DBN的先做通读百科全书式的无监督学习,再根据具体的任务进行微调的两段式训练法,成为了现代大语言模型的基础训练范式。即使是后来的Transformer在架构上已经改变了很多,但是训练的灵魂却依然继承了DBN之道。
DBN的逐层特征抽象,也确立了表征学习的核心地位,它告诉后来的网络设计者,神经网络的本质不是分类器,而是一个特征提取器。这一思想直接导致了后来“迁移学习”的流行——我们可以把一个在大规模数据上训练好的网络(特征提取器)拿来,切掉最后那层,用到另一个完全不同的任务上。
最重要的是,从此生成式网络,开始逐渐挤开判别式网络,站到了C位。它是基于能量的概率分布模型 P(X)。它试图理解数据的“构造原理”,而不仅仅是“边界”。它是现代生成式 AI 的曾祖父,是它,搭好了大模型的脚手架。在这个脚手架的基础上,人们开始发明各种新的破墙道具,梯度消失这堵坚固的墙壁上的裂纹开始变成了破洞。春天的暖风,开始从外面吹进来了。