“道生一,一生二,二生三,三生万物。”这是一个从抽象到具体的过程。“道”,是宇宙万物共有的规则,是一种高度的抽象。

抽象原则(Abstraction Principle))在软件工程(Software Engineering)程序设计语言理论(Programming language theory,PLT)中是一个用来减少程序信息冗余的基本格言。

我们每天都在运用抽象却不自知。例如前段时间我写《每个人的认知都是一个世界》,却没有意识到这是在做抽象。抽象在科学、艺术等各个领域都是重要的思想。本文不是要谈论计算机科学中的“抽象”,而是要从一个更宏观的角度来探讨抽象是什么,从何而来,为什么要抽象,最后再回头讲“道生一,一生二,二生三,三生万物”。

1. 抽象是什么

在汉语中,“抽”意为概括,“象”意为形状。“抽象”就是从具体事物概括出它们共同的方面、本质属性。

1.1 抽象的程度

抽象不是一个是或否的概念,而是一个程度的概念。无法单独评价一个概念是抽象或者不抽象,只能说概念A比概念B更抽象。

在生物学中,以界、门、纲、目、科、属、种几种不同的级别对生物进行抽象。以人为例,就是动物界、脊索动物门、哺乳纲、灵长目、人科、人属、智人种。在“动物界”这个层次上,是程度相当高的抽象,凭借“动物界”的概念,我们脑海中浮现的并不是单一的人类,而是千奇百怪的动物、微生物。

在艺术上,同一个客观物体,可以有不同抽象程度的表达,例如下面这个例子(来自Netflix的纪录片《Abstract: The Art of Design》)。不难发现,越是抽象程度高的内容,越是给人思维发散的机会。看到一颗真实的心脏,脑海中浮现的只是一颗心脏,而一个高度抽象的心脏,却能让人看到千千万万个心脏。

在电子游戏中,早年因为硬件限制,只能用更少的像素点来表达同样的内容,也就形成了我们现在所说的“像素风格”的游戏。这种像素风格事实上也是一种抽象。如今尽管GPU已经能够渲染出足够真实的内容,但“像素风格”仍然有生存空间,正是因为其高度抽象的特点,给玩家的大脑自由发挥的机会。

在计算机图形学领域,有一种叫 Level of Detail (LOD) 的技术。简单讲,为了节省计算资源的消耗,一个物体距离观察者越远,就用越简单的轮廓来概括它,因为在远处的物体本身就看不清,就有了“偷工减料”的空间。这也就是对模型轮廓不同程度的抽象。

1.2 抽象的本质

如果问 $2+1=3$ 的本质是什么,这很难回答。那么加入更多的例子,$3+1=4, 4+1=5$。是的,这是在计数,事实上动物也会计数。而人能抽象出一种更一般化的符号表示,即 $f(x) = x+1$。

要知道抽象的本质,要用得到 $f(x) = x+1$ 同样的方法,在 1.1 中已经提到很多抽象的例子,我们可以寻找这些例子的共性。不难发现,抽象是一个简化的过程,去除噪声,留下本质。留下的本质有时候是事物的主要特征(1.1 中艺术表达心脏的例子),有时候是事物的共性(1.1 中生物分类的例子)。

抽象得到事物的主要特征,或是事物的共性,两者是可以统一起来的。以艺术家画心脏为例,既可以看作是提取了心脏的主要特征,也可以看作是提取了两种事物(1.心脏这个客体; 2.艺术家对心脏的主观印象)的共性。

另外,无论得到主要特征还是共性,采取的方法都是简化,即去除噪声。只是提取主要特征依靠的是经验,提取共性靠的是数据。

抽象已是如此普遍,在数学、物理学、社会学等领域甚至是基本的研究方法。那究竟为何有这样神奇的力量?

2. 抽象的力量

既然说抽象能通过简化得到事物主要特征事物共性两种结果,那就分别举个例子以感受其无边法力。

2.1 抽象出事物主要特征

《An Introduction to General Systems Thinking》一书中以太阳系模型为例子,解释了“简化”的力量。书中的“简化”在本文的语境下,与“抽象出事物主要特征”是同一个概念,并不包括“抽象出事物共性”。

牛顿给了太阳系中物体运动一个合理的解释,并做了太阳系模型。但很多教科书没有体现牛顿之成功中抽象起到的作用。

太阳系是一个复杂系统。对于一个有 $n$ 个实体的系统,需要 $2^n$ 个描述方程。其中包括 $1$ 个场的方程, $n$ 个“孤立”实体的方程,$n \times (n-1)/2$ 个“双实体”相互作用的方程,$n \times (n-1) \times (n-2)/6$ 个“三实体”相互作用的方程……也就是说,方程数量与系统规模是指数关系。太阳系中除了恒星(太阳)、行星(八大行星),还有很多小行星、彗星、矮行星、彗星,已知的小行星就有 $707664$ (截至2016-03-07, NASA的数据)。

对于这么大的太阳系,计算量是无法想象的。《An Introduction to General Systems Thinking》中提出计算的平方律(The Square Law of Computation)。即,经验表明 $n$ 个方程的系统如果无有效简化,计算量一般是 $n^2$ 级别。事实上方程数量和计算量的关系在不同情况下差异很大,但为了简化问题,姑且承认这个“计算的平方律”。

牛顿做的,就是将太阳系抽象为一个简单的力学模型。一个重要假设是:太阳系中除了恒星和行星,其他星球影响极小。这样大大减小了实体数 $n$。另一个重要假设是:唯一重要的相互作用力是万有引力。万有引力只涉及两个实体,于是大大减少了方程,只剩 $1$ 个场的方程,$n$ 个“孤立”实体的方程,$n \times (n-1)/2$ 个“双实体”相互作用的方程。

如果认为 $n=9$ 的话,按上面的计算方程数是 $1+9+36=46$ 个。就当时没有计算机的情况,仍然没法求解。就算只有三个质点,相互之间只考虑万有引力的情况下也没法保证得到解析解,即三体问题(Three-body problem)

牛顿还提出一个重要的假设,太阳系中有一个实体,它比其他的实体重要得多(质量大得多),就是太阳。由于有一个占主导地位的天体,使得其他天体相互之间的万有引力可以忽略不计,这样一来只剩下 $1+9+8=18$ 个方程。

到这里,可能有人会觉得这太蠢了,如此显然的假设需要这样强调吗?说“显然”,那是站在我们的角度,但站在牛顿的角度,那时候还处于望远镜观测的年代,信息极少,太阳在太阳系中心都还是个争论的话题。所有假设的可行性,要在解出方程后,与实际观测数据对比才能证实。就像一只蚂蚁爬过钢琴时一样摸不着头脑,而我们能看到整个钢琴。

可见,抽象在太阳系模型的建立中起到了举足轻重的作用,这就是抽象的力量。

如果与软件工程做对比,上面的简化过程,也就是通过抽象来解耦合。在力学模型中是物体间相互作用力;在软件工程中是模块间的耦合关系。

2.2 抽象出事物共性

近两年人工智能火热,其核心技术是机器学习、深度学习,其本质是通过数学方法从数据中训练得到模型。例如从10000张出现鸟类和没有出现鸟类的图片中,学会判断任意一张图片中有没有出现鸟类。

现在有人认为,这根本不是人工智能,只是拟合数据,是拿统计学骗人。这种观点的问题在于,不承认人学习的方式其实也是拟合数据。人也是通过看大量鸟类才学会辨别鸟类的。

所以说,无论是人学习的本质,还是机器学习的本质,都是抽象出事物的共性。具体来讲,就是从10000张图片中,抽象出鸟类的共性。从人学习的角度来讲,抽象得到的东西,叫做知识。从机器学习的角度来讲,抽象得到的东西,叫做模型。无论是得到知识还是模型,其目的都是为了应对未来从未见过的数据。我们无法通过记忆的方式,来辨别世上所有的鸟类。但我们可以通过抽象得到的知识,辨别世上所有的鸟类。

小学时考试考的是九九乘法口诀表,我们靠的是记忆,只能解决表里的数据。等我们学会了“乘法”,我们能处理无限的情况,靠的是“乘法”这种抽象。

3. 为什么抽象

上面所讲抽象的力量,某种程度上解释了为什么抽象。但还没有直接讲出本质。

我们依赖抽象的核心原因是:人脑算力的有限性。可传达的信息量是有限的,信息存储是有限的,信息的处理是有限的。

过去哲学家们认为,如果我们对物理、化学足够了解,那只要知道宇宙的初试状态,就能预知未来。但问题在于,我们没有这么强的算力。用自然提供的资源制造一台计算机,100%真实的模拟自然,能否达成仍然存疑。

举一个具体例子,我们知道光照的本质是光线折射、反射,但仍然不能在动画、游戏中100%真实的表现物体的光照,因为算力还不足以做光线追踪,于是我们只好用一种简化的方法,叫光栅化。即使现在 NVIDIA 推出 Geforce RTX 2080 Ti,能渲染的像素和模型的精度都是有限的。而自然所渲染的像素是无限的,自然界物体的精度也是无限的,自然从来不需要做四舍五入。与自然的无限相比,我们的算力永远是不足的。

4. 规律的规律,抽象的抽象

是时候回到“道生一,一生二,二生三,三生万物。”

很长一段时间我对思维很感兴趣,但不知道我所好奇的思维究竟指什么。我曾以为,或许是人工智能,因为里面有“神经网络”一类听起来和脑科学有关的东西,如果我们赋予机器思维,不也就了解自己的思维了吗?最后发现不是。我曾以为,哲学可能是,哲学的本意指“爱智慧”,理应探讨思维,最后发现也不是。我曾以为,心理学可能是,我通过一个知名博客 Mind Hacks ,找到很多思维相关的书,作者给博客的副标题就是“思维改变生活”,他对认知科学、神经科学、人工智能、社会心理学都有极大兴趣,但他最后的落脚点是心理学,与我所说的思维不是同一个概念。

直到通过《An Introduction to General Systems Thinking》,了解到一个学科叫做 一般系统论(General Systems Theory,也有直接称作 Systems Theory)。我不敢说它完全就是我所指的思维,但至少很接近了。

4.1 一般系统论

一般系统论是关于任意系统研究的一般理论和方法。它虽源于理论生物学中的生物机体论,但其与哲学密切相关,是处于具体科学与哲学之间,具有横断科学性质的一种基本理论。其主要任务是以系统为研究对象,从整体出发研究系统整体和组成系统整体各要素的相互关系,从本质上说明其结构、功能、行为和动态。

每个学科都有自己的抽象(知识、方法),那么总存在不同学科间抽象的抽象。一个学科内的抽象我们称之为一阶序,而不同学科一阶序的进一步抽象我们称之为二阶序通才能够从一个学科转到另一个学科,穿梭在不同领域间游刃有余的关键就在于他掌握二阶序。

Kenneth Boulding(一般系统论的缔造者)把通才比作来到曼谷会想到匹兹堡的旅行者,因为二者都是城市,都有街道和居民。像旅行者一样,通才消除了自己对陌生之地(陌生的思维类型系统)的恐惧,转向越来越高的一般性,直到所有事物都遵循熟悉而舒适的秩序。一般系统思维中这种逐渐向上的方法,与人们最初产生思维模式的做法一样。

Kenneth Boulding 说:

如果他发现规律时会高兴,那么他发现规律的规律时就会狂喜。如果他认为规律是好的,那么规律的规律就是美味且最值得追求。

某种意义上,二阶序与老子所说的“道”是同一种东西。“道生一,一生二,二生三,三生万物。”

4.2 二阶序的提出有何意义

二阶序的存在对想做通才的人是一个福音。首先它提供了除兴趣之外,做广泛尝试的理由,即为了总结二阶序;其次它又告诉我们,如果你尝试过很多,只要多加总结,那么你能尝试更多。

现代人工智能领域使用的多层神经网络早在上世纪50年代末就被应用到工程实践中。而人工智能在这几年才重新兴起,我认为原因有二:1. 过去数据规模不够 2. 过去计算机算力不够

类似的,人类个体深入理解二阶序的瓶颈也有两个可能:1. 接触的领域不够多; 2. 人脑算力不够强

人脑算力的瓶颈是不值得考虑的。从群体角度,人脑上千年没有进化。从个体角度奢望自己变得更聪明目前也是不实际的。因此我们能做的只是在有限的脑力下,获取更多的数据。差异越大的数据往往抽象越困难,但同时抽象的结果也越接近二次序的真相。

对此,可能会有两个疑问。第一,对一个领域的熟悉已经花费数年时间,那岂不是一生也积攒不了多少数据?

其实前面已经提到,对二阶序的理解越深,掌握新领域的速度越快。很多人有这样的体验:在自己深入掌握某种知识后,掌握其他知识也变得轻松了,即使是不相干的知识。有人会觉得是因为变聪明了,而事实上我们成年之后大脑只是在变笨(如果聪明指算力的话)。这种体验有一个更一般化的合理解释:这是二阶序的作用,一般系统思维接触新领域的过程中是逐渐向上的,就像前文提到旅行者来到新的城市。

每一次在新学科、新领域中的成功,会让我们更相信二阶序,并帮助我们更快的做下一个新的尝试。

第二个疑问,做很多尝试岂不是影响了在专业上的深度?

是的。但这并不完全是“顾此失彼”的结果。很多人会有这样的体验:在熟悉新领域后,再看自己的专业也会有新的感悟。这也是二阶序的作用。一般系统思维接触新领域的过程中是逐渐向上的!

5. 总结

纵观全文,虽然是谈“抽象”,但核心反而不是“抽象”。“抽象”也可以替换成其他词。核心在于这种思想:从例子中找到知识,从数据中获得模型,从具体中得到抽象,这其实是“学习”的本质。

Reference: