独立研究员-美国纽约
Email:[email protected]
2022年1月25日
✯ 感谢我妻子对我的一贯支持。
摘 要
计算复杂性是计算机科学的核心之一。计算复杂性和物理性质有类似之处:一个问题的计算复杂性规定了该问题的基本性质,即难易程度,如果复杂性超过X定程度,计算就成为实际上不可能。现代密码学就建立在此原理之上。但是,另X方面,有非常多的问题具备很高复杂性,但我们又不得不面对它们。事实上,很多人工智能所面对的问题都如此。这就提出了一个重大问题:对待这些具有高度复杂性的问题,有没有更好的方法?我们认为,智能科学里面的思想和方法可以应用于这些问题,帮助我们超越计算复杂性。本文中我们试图理清这里面的各种关系,为此提出了非特例计算,针对特例的计算,计算体的智能,能动搜索等定义。我们还提出并且讨论了试错,能动和智能的方法。数组等分问题是一个著名的NP-完全问题,我们用此问题作为案例,来说明本文的思想。
Keywords: 计算复杂性,试错,机器的能动,智能,计算体,非特例计算,针对特例的计算,数组等分问题
最好的好人,都是犯过错误的过来人;一个人往往因为有8点小小的缺点,将来会变得更好。
—黑格尔
生命的力量,尤其是心灵的威力,就在于它本身设立矛盾,忍受矛盾,克服矛盾。
—莎士比亚
思想等等是主观的东西,做或行动是主观见之于客观的东西,都是人类特殊的能动性。这种能动性,我们名之曰“自觉的能动性”,是人之所以区别于物的特点。
—毛泽东
计算技术和计算理论,从图灵的时代算起,已经有快90年的历史。这期间,一切都迅猛发展,从硬件到软件,从理论到实际应用,从科学到工程,再到今天的人工智能热潮,处处显露计算技术 和理论的内在活力。但是,万变不离其宗,计算技术和理论的终极关心仍然是:究竟什么是理论 上可以计算的?究竟什么是实际上可以计算的?怎样才能扩大我们实际的计算能力?怎样才能 把这种能力应用于工程和科学问题,包括人工智能的问题?
而这些问题的一个焦点就在于计算复杂性。计算复杂性是当今计算机科学的最核心部分,它研究计算一个问题需要用多少时间和用多少存储空间。通常,计算问题是有尺度的,例如矩阵的 大小,待分解的整数的位数,自动驾驶的环境复杂度,视觉识别的精度,等等。计算的复杂度随问题的尺度增长而增长,可能增长得比较慢,一般用多项式增长来表达这种增长,也可能增长 得很快,一般用指数级增长来表达。一般认为复杂度指数级增长的问题是非常困难的。最典型的例子就是大正整数的因素分解。这就是指数级增长的,是极端困难的计算问题,而这种情况 就成了加密信息的理论基础。
计算复杂度高的问题无疑是非常困难的,然而,我们并不能对这些问题置之不顾,我们不得不 面对这些问题。人工智能与这些具备高度计算复杂性的问题更是密不可分的。一方面,在人工智 能的各种计算中,不可避免地会遭遇这些具备高度复杂性的问题。如人脸识别就是一个NP-完全问题[12]。另一方面,当我们面对这些困难问题,就不得不试图超越计算复杂性,这就要求我们采用智能的方法来实现超越。非常可能,生物体正是在面对高度计算复杂性时,才逐渐发展 和提高了自身的智能。在此意义上,当我们面对高度计算复杂性时,出于必需而采取各种已知的智能方法,或者开发出新的智能方法,正是发展人工智能的必然途径。
超越计算复杂性是非常困难的事情,更是非常有争议的事情。是否采用智能方法就可以超越计算复杂性?目前并没有坚实的理论来支持,当然也没有确定的理论来截然否定。因此,我们在本 文中试图对此做初步探讨。我们试图清理出一个讨论框架,以方便进一步探索。事实上,促使我们在这个方向上做研究,在很大程度上是因为:当我们在研究数组等分问题在P vs NP问题中 的作用时[1],我们发现数组等分问题中有的特例看起来非常困难,但是其实容易解,但是又的 确存在一些非常难解的特例(正如Scott Aaronson所讲的那样,在P和NP之间,有一个无形的但 是又非常隐秘曲折的分界,非常让人困惑[10])。当我们面对这些困惑一再思考后,我们逐渐发 现,智能若隐若现于其中。
在本文,我们提出这样的思路:对那些具备高度计算复杂性的计算问题,我们应该采取具备智 能的方法去处理,这样就有可能仅用较少的资源去解决高难度的问题。我们还提出一种有可能实现这样的智能的框架,即试错规程+能动搜索。我们还把此思路用于数组等分问题。这个问题 是著名的Karp 25个NP-完全问题之一,它可以帮助我们理清这里的思路。事实上,正是在思考 这个问题时,我们才逐渐发展出本文的思想。
本文中,在第2节,我们首先讨论了计算的极限,特别是规定了非特例计算和针对特例的计算,并且从两者的关系讨论了计算复杂性给出的限制。在第3节,我们讨论超越计算复杂性和智能, 规定了计算体的智能。在第4节,我们提出超越计算复杂性的一种框架,那就是试错规程和能动搜索。在第5节,我们用数组等分问题为例,来说明我们的论点。最后,我们做一些更广泛的讨论。
计算机科学中的一个核心组成部分是计算理论。在发展的早期,计算理论特别专注于可计算性 等理论问题上,即研究什么是可以用计算机来计算的。在可计算性逐步得以理清后,计算复杂性就逐渐成为了计算理论的核心。这就是说,计算理论不再特别关注是否可以计算,因为那已 经有了明确的理论去理解,而是集中注意力到计算的难度究竟有多大。可计算性和计算复杂性是两个密切相关联但是又非常不同的事情。Scott Aaronson对此事有一个很好的评论:“On the one hand, the new task is “easier”because we’ve restricted ourselves to questions with only finitelymanypossibleanswers,eachofwhichiseasytoverifyorruleout.Ontheotherhand,the task is “harder” because we now insist on a fast procedure: one that avoidsthe exponential explosioninherentinthebrute-forceapproach.”[10]就是说,计算复杂性从一方面讲比可计算性简单,因为计算复杂性是在明确了可计算后才讨论的。但是另一方面又更具挑战,因为不再 仅仅停留在是否可计算,而是要找到明确的复杂度的极限。
我们可以说,计算复杂性的确给计算建立了一个极限。这个极限甚至可以看作是一种物理极限。[1]事实上,如所周知,现代密码学就建立在计算复杂性形成的超级难度上面。
基于计算复杂性,任何计算必然会产生的对资源的需求,可以是对存储资源的需求,也可以是 对处理器循环的需求。但是,怎么对待计算的极限,却可以有不同的方式,而不同的应对方式,会产生了不同的对资源的需求。
我们可以先考虑一个非常简单的案例。乘法是最简单的计算,复杂度也很低。例如,4567x2341, 如果采用普通的乘法规则,就需要做16次个位数的乘法,12次个位数的加法。乘法规则适用于 任何乘法,因此这些要求适用于任何两个4位数的乘法。但是,如果我们的问题是4567x2300呢?我们当然也可以采用16次乘法12次加法来完成计算。不过,显然我们可以采用更简洁的方法, 仅需要8次乘法4次加法就可以完成计算。这是因为我们充分利用了此特殊问题的内在的特性, 即2300里面的0,因此我们仅需要用少得多的计算量。
从这个简单的案例,我们可以看到两种应对处理方式。一种是,对一类待计算的问题中的所有 待计算的特例,都采用同一个明确的固定的程序来计算;另外一种是,对一个待计算的特例,如 果可能的话,采用适合这个特例的程序来计算。如同前面的案例显示的那样,后一种方式需要 的资源就要比前一种方式节省很多。
[1]根据资料,图灵在和维特根斯坦在1939年的讨论中,就触及了此点。维特根斯坦说,数学和物理无关。图灵则反对说,数学证明的难度就是物理的。这就说明,图灵对于计算难度其实具备物理特性有了猜测和初步理解。
我们再看一个更接近实际的案例。有一个数组:Ω={63,48,932,266,671,47,110,82,39},我 们希望等分此数组,即把此数组分成两个数组,并且两个数组的和相等。一般的,可以适用于任何数组的计算就是穷举搜索,即搜索所有可能的分组。这个数组的长度是9,那么就需要规 模为28次搜索,计算量相当大(至少是对手工而言)。但是,我们也可以针对这个特例来求解。 我们这样考虑,先随意分两组:Ω1 = {63, 48, 932, 266},Ω2= {671, 47, 110, 82, 39}。很容易看 到,前面的数组的和大,后面的小。那么,我们就来做一些调整,使得前一个数组的和变小, 后一个变大。调整后数组为:Ω1 ={63,48,932,110},Ω2 ={671,47,82,39,266}。仍然是前面大后面小。但是,这次可以看到比较清楚,再做一调整,就得到:Ω1 ={63,48,932,47,39},Ω2= {671,82,266,110}。现在两个数组的和相等了。这样做计算量就小了很多。
就是说,当面对一个特例时,尽可能地去寻找和利用该特例里面的各种关系,使得可以使用更 少的资源来完成计算,这就是针对特例的计算。因此,问题自然出现,针对特例的计算是否就一 定可以节省资源?这需要我们仔细分辨和讨论。我们先做一些规定。
定义 2.1 (非特例计算和针对特例的计算) 假设一类计算问题,其问题特例形成一个集合W ,计 算程序C作用于集合中的特例w ∈ W ,记为C(w)。如果有一个固定的明确的计算程序C,对任 何w ∈ W ,C(w)都可以计算出正确结果,我们就称计算程序C为覆盖W的非特例计算。如果一 个计算程序Cw 是针对特例w的,即,Cw (w)能够计算出正确结果,而且可以做到使用的资源尽可 能少;但是,如果u ∈ W,u≠w,则Cw (u)有可能不能计算出结果(不停机),或者计算结果不 正确,或者资源消耗大很多,那么我们就称计算程序Cw是针对特例w的计算。
在前面的定义中,肯定有更加形式化、更严谨的方法来表达。但是,现有的定义中的表达对我们目前的讨论来讲,应该足够了。
当我们面对一类计算问题,迄今为止,主流的努力都是试图找到非特例的计算程序。这有其合 理性,因为在有了非特例的计算程序后,思考就简单了,对任何一个待计算的特例,仅需要“代 入”就足够了,不需要做什么特别的思考,而且总是可以获得正确的结果。简化思考,以及总是 正确,正是人们追求的东西。如果面对比较容易的问题,或者资源不成为问题,这样追求完全合理。但是,如果面对的是高度复杂性的问题,这样的追求就不合适了。面对给定的特例,尽可能利用此特例中的一切能够加以利用的特点,如对称、弱点、规律、模式、等等,使得消耗的资源尽可能减少,才更加合理。这就是说,面对高度复杂性的问题,我们应该追求针对给定特例的计算程序,而不是非特例的计算程序。
但是,针对特例的计算程序是怎么来的呢?对非特例的计算程序,我们知道,是人类程序员通过 编程或者其他方式的巨大努力获得的,而这种人类的努力的回报就是这种计算程序可以用于全 部特例。这是一个程序适用于全部特例,对此,我们理解且熟悉。但是,要对每一个特例,都要 有针对该特例的计算程序,我们就非常不熟悉了。难道要我们为每一个特例开发一个程序?有 一种可能,那就是,我们另外还有一个寻找程序,当我们面对一个给定的特例时,我们可以启动这个寻找程序来找出针对该特例的计算程序。这当然是可能的。但是那样一来,寻找程序本身 也要消耗资源。问题是:是否可以使得总的资源消耗减少?我们可以做一个规定。
定义 2.2 (非特例计算所必需的资源) 假设一类计算问题,其问题特例的集合为W ,如果C是一 个覆盖W 的非特例计算,对每个特例w ∈ W ,C(w)消耗的资源为Zw ,则C所需要的资源Z就是: Z = max{Zw|w∈ W}。如果有两个以上的覆盖W的非特例计算,则取这些计算所需要的资源的下限为计算W所必需的资源。
这样,我们就规定非特例计算所必需的资源。那么对于针对特例的计算呢?我们有如下命题。
命题 2.3 (针对特例的计算所必需的资源) 对一类计算问题, 其问题特例的集合为W , 假设覆 盖W 的非特例计算所必需的资源为Z。再假设我们用一个固定的明确的寻找程序S来寻找针对 特例的计算程序,即对任何w ∈ W ,S(w)都可以产生针对特例w的计算程序Cw ,那么,S(w) 和 Cw (w)共同消耗的资源的上限,将等于Z。
证明:容易看到,因为S是一个固定的明确的寻找程序,对任意的w∈W,先做S(w),获得Cw, 再做Cw(w),这样就形成了一个覆盖W的非特例计算C。因此,C所必需的资源等于Z。命题说的其实就是,如果要通过一个固定的明确的寻找程序来寻找的话,就是事实上形成了一 个非特例计算。因此,如果要这样做,针对特例的计算所消耗的资源就会等同于非特例计算所消耗的资源,不可能形成节省。因此,根据此命题,我们可以对计算所必需的资源做一个规定。
定义 2.4 (计算所必需的资源) 假设一类计算问题,其特例的集合为W,计算这类问题所需要的资源就是覆盖W的非特例计算所必需的资源。
就是说,对于特例w ∈ W ,如果我们知道针对w的计算程序,那么计算w所需要的资源有可能低于计算所必需的资源。但是,这需要知道针对w的程序。如果预先不知道,要用一个固定的明确 的寻找程序来找出针对w的程序,计算w所必需的资源就和非特例计算所必需的资源等同了。因此,对一类计算问题,计算必需的资源就是非特例计算所必需的资源。要做某个计算,就需要相 应的资源,没有这个资源,在实际上就不能做这个计算。这就形成了对计算的限制。这个限制是不可能随意超越的。这正是计算复杂性的明确结论。
但是,请注意,我们前面命题中有一个规定,即采用“一个固定的明确的寻找程序”来找到针 对w的计算程序,才会有前面命题的结论。那么有没有可能采用更好更灵活的方法来找到针对特 例的计算程序,从而超越限制?这样的更好更灵活的方法是些什么方法?这正是我们将继续讨论的。
前面的讨论说明,计算的限制是由非特例计算所消耗的资源来规定。注意到,非特例计算可以 对整个问题特例集做计算。但是,我们通常并不面对整个的问题特例集,我们往往仅是需要计算一些特例,非常多的时候,仅是很少几个特例。那么,对这种情况,我们是否有什么方法超越 计算复杂性,用小得多的资源来完成计算?这个问题并不简单。首先,如果是采用非特例计算程序,就不可能仅用小得多的资源。因此,我们需要考虑针对特例的计算。但是,即使这样,是否 能仅用小得多的资源也并不显然。
针对一个给定的特例,要做针对特例的计算,就有两个步骤:1)找到针对该特例的计算程序, 2)用针对该特例的计算程序来计算。我们来考察一下,看是否有可能这两个步骤合起来所消耗的资源比非特例计算更低。首先,如果步骤2需要消耗的资源并不能比非特例计算低一个等级, 那么就不必考虑了。如果步骤2需要消耗的资源的确比非特例计算低一个等级,关键就转移到步骤1上面。
怎么才能找到针对该特例的计算程序?有这样一些可能性。a)我们具备预先的知识,知道对该 特例,应该用什么针对的计算程序,并且预先就有这样的计算程序,可以调出来用;b)我们具 备一定的能力,可以和特例互动,然后从互动的信息中获取针对的计算程序,而且这种获取的 过程也仅只消耗低一等级的资源。
我们可以排除可能性a,那是预先已经知道,是和神谕一样的,可以期望而不一定能实现。而可能性b,就是要求具备相当的能力,此处,我们是在考虑计算,就是说要求计算具备相当的能力。 这种能力具备相当主动性,因此我们就不再称其为计算程序,而称其为计算体。计算体含有主 体的意思,而这也正是我们希望赋予的意义。就是说,我们希望是一个具备主体性的计算体在做计算,而这个计算体具备一定的能力可以实现可能性b。
因此,我们要来对计算体的能力做一些考察。说到能力,我们需要一些标准以便做考量。具体 说,有2种考量:1)绝对能力,也就是说计算体具备的绝对能力,能够完成某类任务的绝对能 力;2)计算体所完成的任务和所消耗的资源的比值,这是一种相对的能力。而计算体的能力就应该由此两种考量的某种组合形成。例如,如果强调绝对能力,那么在能力度量中,第二项就占 很小的成分。但是,如果完全没有了2),就失去了计算体的意义。我们考虑的计算体是要试图超越计算复杂性,因此要限制计算体消耗的资源。根据这样的考虑,我们可以这样规定计算体 的能力:在满足2)的情况下,完成1)的能力。
那么,计算体的这种能力应该称为什么好呢?我们认为把这种能力称为计算体的智能是适合的。我们的理由有这样几条:1)这种能力的确是一种非常有用的能力,而且来之不易,并不能平凡获得,这和我们对于智能的理解和要求吻合。2)具备这种能力,计算体就可以用低一等级的资源来做高一等级的工作,即消耗少而获得高,这也和我们对智能的理解和要求吻合。3)这种能 力并不表现为一种机械性的行为,也不是机械性的程序可以做好的,这也和我们对智能的理解和要求吻合。4)和图灵测验的精神吻合,图灵测验的要求是不问内部,仅看外部行为。具有这种能力的计算体,看外部表现就体现出智能。王培是AGI的研究者和倡导者,根据他所提倡的智 能的定义:智能是在有限资源的情况下,做出最佳适应的能力[8]。显然,他对智能的这种定义和我们把计算体的能力称为智能是方向一致的。事实上,他对智能的这种定义对我们有积极的影响。根据这些考虑,我们有如下的定义。
定义 3.1 (计算体的智能) 假设有一类计算问题,其问题特例的集合为W ,再假设覆盖W 的非特 例计算必需的资源为Z。现在有一个计算体C,如果对某个特例w∈ W ,C可以仅用比Z低一个 数量级别(O(log(Z)))的资源来完成对w的计算,我们则称C可以智能地计算w。规定V ⊂ W 是 这样的子集,即C可以智能地计算V 里面的全部元素。如果V不为空,我们就称C具备计算体的 智能。C的智能用公式来度量:q(C)= |V |/|W|。我们称这样的计算体C超越了非特例计算的计算复杂性。
注意,在定义中,具备智能的计算体C可能并不能对所有的特例w∈W都可以做到超越计算复杂 性。C可能仅能够对很少的特例做到超越,也可能对很多的特例做到超越,而这个多少,就成为计算体的智能的度量。也就是说V 相对于W的大小,就成为C的智能的度量。这样就清楚了,要超越计算复杂性,也就是要用低一级的资源来完成高一级的工作。而要能够如此,计算体就需 要具备智能,具备了智能,就可以突破计算复杂性的藩篱。所以,智能正是为了超越计算复杂性而形成的能力。
但是,一个根本的问题是:是否真的存在这样的计算体?
首先,我们指出,对应NP-完全问题来讲,这样的计算体总是存在的,至少平凡的总是存在的。但是,我们并不满足于平凡的计算体,我们希望有真正智能的计算体。
据我们所知,目前尚未有理论来讨论是否存在这样的计算体。进一步,也没有一种理论告诉我 们怎么才能形成智能的计算体。这些问题是计算理论的重大问题,也是关于人工智能的重大理论问题,有待进一步的研究。此处,我们来做一个尝试,即我们提出这种思路:如果采用合适的 试错规程和能动搜索,就有希望形成具备智能的计算体。
试错,其实是一个非常通常的方法。我们常识中认为试错很合理,甚至于经常不自觉地使用。在 计算理论中,Gold,Putnam,Kugel等人一直坚持使用试错法来对待可计算性的问题[9]。Kugel称这样的试错法形成的计算程序为Gold-Putnam机。他们因此形成一种试错规程,用以处理比较困难的可计算性问题,乃至于试图处理不可计算的问题。
那么,试错究竟在做什么?为什么可以成功?试错实际上是基于如下这些事实:1)承认我们有 所未知,但是可以通过努力来获得此未知;2)可以用某种变换把未知的东西转移到一个确定的 搜索空间;3)可以通过试错来获得反馈,反馈可以帮助寻找,寻找就是在搜索空间中从一个点移动到下一个点;4)可以在搜索空间中达到(或是接近)未知的东西。试错是一种非常有效的机制,往往是求解问题的不可或缺的工具。
回到我们的问题上,那就是寻找针对特例的计算。假设问题特例的集合为W,给定一个特例w∈ W,我们希望寻找针对w的计算程序Cw。正如前面所讨论的,我们要把未知的东西变换到某个 搜索空间中。搜索空间可以有很多种。我们这里来做一定的限制。我们把搜索空间限制为一个布尔向量空间,即搜索空间是BN。这样的限制当然是有局限的。但是,如果N 足够大,布尔向 量空间其实可以覆盖任何参数空间,而用参数空间去调控计算,则是非常普遍的做法(如非确定图灵机显示的那样,参考Cook[7])。因此,选择搜索空间为N维布尔向量空间是合理的。如 果以后有需要,我们还可以更换不同的搜索空间。在搜索空间中搜索的结果,就是获得正确的参数p∈BN后,进而获得针对w的计算程序Cw。因为Cw依赖于参数,我们可以记为C(w,p)。
有了搜索空间,我们来设定一个试错规程。我们需要有这些组成部分:试错的程序T (w, p), w ∈ W,p ∈ BN ,如果给定的参数p是正确的,则T (w, p)的计算结果是1,否则计算结果就是0。T 还反馈其他信息。搜索S(w, p, t),S将产生pn,这是获取的搜索空间的下一个点,用于继续试错。S还产生其他一些信息,以供试错使用。针对w的计算程序C(w, p), w ∈ W, p ∈ BN 。试错规程如下:
1)初始设定参数p =p0,开始试错循环。
2)循环:先运行试错,即计算T(w,p),获得试错结果,以及其他信息反馈t。根据试错结果为1, 还是0来决定是否已经找到了正确的参数。如果正确,退出循环。如果不正确,继续。3)搜索S(w, p, t),S产生pn,此为下一个试错的点。
4)试错循环继续下去,直至获得正确的参数p并且退出循环,或者报错退出。
5)在完成试错循环后,就获得针对w的计算程序C(w, p)。
注意到,在试错规程中,最重要的步骤在于:怎样在搜索空间中获取下一个点,即运行S(w, p,t)。S可以用最笨的办法,即穷举搜索,就是搜索每一个点。但是,这不是我们期望的。如果穷举搜索,必需使用2N的资源。我们期望仅用低一等级的资源。这样的话,我们就需要有更好的方法来获取下一个点。这就是能动搜索。如果前面的试错规程中的搜索是能动搜索,则整个试错规程就形成一个计算体。
能动搜索是此计算体的最主要部分。能动搜索具备从试错计算结果中获取信息的能力。因此,和Kugel等人的试错规程不同,试错不仅提供正确于否的反馈,还需要把更多的信息反馈到能动搜索,这样搜索才能做得更好,才能做到用尽可能少的资源来进行有效的搜索。能动搜索具备 主观,因此可以能动,能够从各种反馈信息中产生觉察,以及对自身的觉察,乃至更深层次的 觉察,并且依据这些觉察找到反馈信息中蕴含的机会,再根据机会决定下一个试错的点。这就 是能动,我们在[3,4]中对这样的能动做了仔细的讨论。能动搜索的能力是计算体的关键,因此,我们做一个定义。
定义4.1 (智能搜索)假设试错规程中的搜索空间为P=BN,能动搜索为S(w,p,t),如果对给 定的w,以及对任意的初始参数p0,如果S能够仅使用O(N)资源,即能搜索到针对w的参数向量, 我们则称S能做针对w的智能搜索。
具备此能力的能动搜索,就可以使得计算体获得智能。
命题4.2 (试错+能动)假设有一类计算问题,其尺度为N,其问题特例的集合为W,再假设 覆盖W的非特例计算必需的资源为O(2N )。假设计算体J由试错规程、能动搜索S和针对特例 的计算C(w,p)构成。如果存在w∈W,S能做针对w的智能搜索,而且计算程序C(w,p)仅需 要O(N )资源,则计算体J具备定义3.1所定义的智能。
很容易看到此命题为真。而S和C(w,p)都仅需要用O(N)的资源,则定义3.1中规定的集合V⊂W不空。按照定义3.1,计算体J具备智能,J针对w可以超越非特例计算的计算复杂性。什么样的能动搜索能够针对给定的特例做智能搜索?这是一个大问题,有待进一步的工作。下 面,我们考虑数组等分问题,希望在这个极端重要,而又明确和相对简单的问题中,可以把能动搜索看得更清楚一些。
数组等分问题是一个非常著名的、很重要的问题。我们现在以这个问题作为案例,应用前面讨 论过的思路,希望可以帮助我们理清思想。我们先简单回顾一下数组等分问题,更多细节请参考[6,2,5]。这个问题可以用一个很简短的句子来说明:给定一个自然数的数组Ω, 问是否可以 把Ω分成两个子集Ω1和Ω2,使得Ω1中的数的和等于Ω2中的数的和?
先看一个简单示例。给定数组:Ω={3,1,1,2,2,1,2,2,4},我们可以取Ω1 ={1,1,1,2,4}和Ω2={2,3,2,2},则∑Ω1=∑Ω2=9。对这种情况,等分问题就有一个肯定的答案。注意,对此数组,等分不止一种。如:Ω1={3,1,1,2,2}和Ω2={1,2,2,4}。这是一个非常简单例子,答案很明显。而这个数组:Ω={3,1,1,2,2,1,2,2,16},就不可能等分。这也很明显。但是对这个数组:Ω={982,937,49,1023,547,363,353,1012,150,312},答案就不明显了,不过,还可以手动求解。
数组等分问题正是P vs. NP的典型。对这个问题,我们知道,如果给出了两个子集,即给出了Ω1和Ω2,很容易验证它们是否为一个等分。但是,如果仅给出Ω并且提问:如果等分存在的话,要求把等分找出来;如果不存在的话,要求证明的确不存在,那样的难度就高了非常多。
我们来更仔细描述问题。现在设数组长度为N ,我们将考虑长度为N 的数组Ω。数组成员都为自 然数,即Ω∈IN ,I为自然数集。然后,我们定义一个N维布尔向量p∈BN,p=(p1,p2,...,pN), pj∈B,并且对一个数组Ω={ω1,ω2,...,ωN}和布尔向量p,我们定义一个量:
很容易看到,上面这个量的意义就是:把数组分成两部分,而两部分的和之差即为该量,而怎么 分成两部分,则由p来规定。所以我们称p为一个分组向量,因为它决定怎么分组。也就是说,这个量< p, Ω>其实是一个测试,用来测试分组向量p是否可以等分数组Ω,并且这个量还给出反 馈,即分组向量形成的分组离开等分还有多远。我们再定义一个函数:φ(Ω,p):
φ(Ω, p)是一个带参数的布尔函数,φ(Ω, p) : IN × IN → B,就是说,如果分组向量p使得数组Ω等 分,则函数值为1,否则为0。也就是说,这个函数是一个试错函数,用p来试错。采用这个试错函数(带参数的布尔函数),并且用我们规定的一个算符⊙[2],我们就可以定义分组函数:
ParN(Ω) : IN →B, ParN (Ω)=φ(Ω,p)⊙P
此处,P是全体分组向量形成的空间。算符⊙就是试的意思,就是说把所有的p∈P用到φ(Ω,p)来 试一下,如果试的结果中有的值等于1,则ParN(Ω)的值就是1,否则ParN (Ω)的值就是0。这就 是说,ParN 的函数值就是根据试错而定义的。这就是很明确告诉我们,数组等分问题的定义就是由“试错+穷尽搜索”来规定的。因此,非常自然,我们可以把此定义转化为如下的计算。
试错规程+穷尽搜索
设定:p0, Ω
初始:N = 0, p = p0
while N < 2N do
继续试错:t← Ω> if t = 0then 停止,输出“计算成功,ParN (Ω) =1及分组向量p” else 继续搜索:pn ←S p ← pn, N ← N +1 end if endwhile 停止,输出“计算成功,ParN (Ω) =0” 非常明显,前面这个试错规程+穷尽搜索,就是表达式ParN (Ω) = φ(Ω, p) ⊙ PN 的程序表达,两 者完全是同一回事。因此,面对分组函数ParN ,使用试错+搜索,就非常自然而然。特别注意, 其中的搜索S是穷尽搜索,就是走遍P 空间。S不依赖于任何数组。实现穷尽搜索可以有很多种,不过我们可以不管,只需要S能遍历P空间就可以了。 特别强调,前面这个计算是非特例计算,对任何特例,即任何数组都适用。而且,计算给出的函 数值是完全正确的。值得注意,这个计算所消耗的资源为O(2N )。有了非特例的计算,我们再思考针对特例的计算。我们可以设想,仍然是试错+搜索,但是针对数组Ω,而且希望可以比前面的试错+穷尽搜索做得更好,这就是试错+能动搜索。试错规程如下: 试错规程+能动搜索 设定:p0,Nmax,Ω 初始:N=0,p=p0 while N < Nmax do 继续试错:t← Ω> if t = 0then 停止,输出“计算成功,P arN (Ω) =1及分组向量p” else 继续搜索:(pn,i)←S(t,p,Ω) if i=0 then 停止,输出“计算成功,ParN (Ω) =0” else {i =1} p←pn,N←N+1 else 停止,输出“计算失败,搜索停止” end if endif endwhile 停止,输出“计算失败,超出范围” 此试错规程就是搜索分组向量,看是否可以找到分组向量p,其使得可以等分数组Ω。规程一共有4个出口。其中两个是成功的,分别对应于ParN (Ω)等于1,或者等于0。另外两个是失败,一个是因为搜索次数超出预设值,强制停止,另一个是因为搜索的内部认为不能再继续搜索了。当 试错规程成功时,就给出了ParN (Ω)的值。当试错规程失败时,无法给出ParN (Ω)的值。还需要 注意到,当给出函数值为1时,也给出了分组向量,此时,是完全正确的。但是,当给出函数值 为0时,有可能是对的,也有可能是错的,因为搜索并不是穷尽的搜索,而是能动和智能的搜索, 是可能出错的。此时,即S(t, p, Ω)给出的i为0,就是S(t, p, Ω)而是根据和数组的互动经验,主观 地决定数组Ω不能等分,这个决定是可能出错的。 总之,此试错规程+能动搜索形成的计算体,形成针对特例的计算,它针对给定的特例,即一个给定的数组,进行计算。计算结果可能是3种:1)计算成功,且得到正确解,2)计算成功,但 是得到错误解,3)计算失败,失败又分两种,一是搜索停止,二是超出范围。 在试错规程中,搜索S(t,p,Ω)是最关键的。我们对此做一些讨论。搜索S(t,p,Ω)就是要在知道了 现在的分组向量p,以及试错的结果t后,决定下一个用于试错的分组向量是什么。搜索是能动 的,不是预先预设好的,搜索可以通过学习来改变S(t,p,Ω)这个计算体的内部,以使得给出一个 更好的下一个分组向量,使得尽快完成计算过程。S(t,p,Ω)是特别针对性这个给定的数组Ω的。 这个搜索肯定不是传统的搜索程序,任何一个传统意义下的搜索程序,都不可能做到能动和智 能的搜索。这个搜索,还必须具备自己的主观,因此才可以能动。但是,问题在于:这样的能动 搜索是否存在? 对数组等分问题,针对一个任意给定的,可以等分的数组Ω,总是可以有一个搜索使得可以非常 快地搜索到Ω的等分向量。因为,我们可以把试错规程中的初始向量p0设定为这个等分向量。但是,这样的搜索是平凡的,不足为道,并不是我们真正希望的那种能动搜索。我们希望的能动搜索是这样的:对任何的初始向量p0,可以仅有低一等级的资源,就可以搜索到相应的等分向量。那么这样的能动搜索是否存在呢?对此,我们提出如下猜想。 猜想 5.1 (存在针对数组等分的能动搜索) 对数组等分问题,存在这样的能动搜索S(t, p, Ω),使 得对绝大多数数组Ω∈IN ,以及对任意的初始分组向量p0,S能够仅使用O(N)资源就做到:或者正确决定ParN (Ω)等于1(即数组可以等分),并且给出等分Ω的分组向量,或者正确决定P arN(Ω)等于0(即数组不能等分)。 注意到,这个能动搜索S(t,p, Ω)不可能是一个固定的搜索程序(无论是什么样的固定的搜索程 序),也不可能是若干个固定的搜索程序集合起来(对数组等分来讲,有很多其实相当有效的这 样的程序),然后根据情况选定一个搜索程序。这些办法都不足以产生一个能动搜索。另外,这 个能动搜索可以使用随机因素,但是,不能是仅凭随机,那样不足以产生一个能动搜索。这样 的能动搜索需要根据试错的反馈来逐步纠正自己和修改自己,并且做出能动的决定,唯有如此,才能做到定义中的要求。 如果有了这样的能动搜索,那么对一个给定的数组Ω∈IN ,我们就可以有很大的把握仅用O(N)资 源就可以计算出这个数组是否可以等分,如果可以等分,还要给出等分的分组向量。但是,数组等分问题是NP-完全问题,原则上求解是需要O(2N )资源的。如果能够有这样的能动搜索,很大 一批问题将变得比较容易求解。但是应该说明,从存在这样的能动搜索,并不能得出P = NP 的 结论。相反,正是因P≠ NP,才使得这样的能动搜索有其意义。 可以注意到,这样的能动搜索+前述的试错规程,就形成了一个针对特例的计算,即计算体。我们称为计算体J 。这个计算体J 的智能,根据定义3.1,q(J )满足0< q(J) < 1,这里的不等式是 严格不等式,即肯定大于0,小于1,但是,我们希望q(J )尽可能接近1。如果我们能够找到这样的能动搜索,那么我们就实现了一个具备智能的计算体。 找到这样的能动搜索是非常有意义的。可以肯定,目前尚未有人做出过这样的非平凡的能动搜索。但是,我们相信这样的非平凡的能动搜索是存在的,我们将继续在此方向上工作。 最后,我们说明,前面的分组函数的讨论中,我们没有限制数组元素的范围。如果需要限制,我们可以规定数组元素为K比特的整数,那样的话,Ω ∈→B为K比特的整数集,以及 ParN(Ω) : IN →B,ParN (Ω)=φ(Ω,p)⊙P 则前面的都可以应用于此。 6 一些讨论 我们可以把主要的思路和想法再说明一次。计算复杂性是计算的一个极限,对每一类计算问题, 相应的极限都存在,这是一个类似于物理性质的极限,即必须要有足够的资源才能做相应的计 算,没有资源,就不可能计算,一个固定的不能自我调整的程序不能超越此极限。如果一类计算的计算复杂性低,需要的资源也就少,非特例计算就可以了。但是,更多的计算都有很高的复杂 性,需要的资源也就很多。面对这样的任务,追求非特例计算就行不通,这是因为,计算的极限使得非特例计算实际上不可能。非特例计算实际上是把整个问题特例集作为整体对待,寻求一 个算法来解决全部这些特例,因此需要很多的资源。但是,我们往往仅需要解决很少一些特例,如果仅考虑针对特例的计算,就有可能节省资源。因此,必须从追求非特例计算转为追求针对特例的计算。也就是说,我们再也不要求计算可以对一切特例适用,而仅要求对某些特例适用。只有如此,我们才能超越计算复杂性形成的限制而在实际上实现计算。但是,我们又不可能对 每一个特例编程,这是根本不可能的。我们只能寄希望于发展出具备智能的计算体,希望此计算体能够和给定的特例互动,也就是试错,并且在试错中逐渐调整计算体自身,从而找到针对 该特例的计算。面对复杂性高的问题,这条路是必不可免的。可以说,智能的计算体是复杂性的产物,克服复杂性则是驱动智能产生和发展的基本原动力。 这就是说,一个具备主观和和智能的计算体,能够绕过计算的极限来完成任务。智能之所以是 智能,就是因为其可以超越计算复杂性形成的限制。然而,用智能来超越计算复杂性,无疑有非 常巨大争议。目前并没有人能够做到,也缺乏能够支撑局面的理论。对此,我们认为首先需要理清各种关系。我们提出非特例计算,针对特例的计算,计算体的智能,能动搜索,等等定义,就是向此方向努力。这些定义是清晰明确的,有助于理论和实践的发展。不可否认,是否能够实现具备智能的计算体,还需要进一步的理论工作,而且,更重要的是,我们应该做进一步的工作来解决各种困难的计算问题。 为了探索建立具备智能的计算体的思路,我们提出“试错+能动”的框架。试错的思路有非常久 远的历史,容易看到,采用合适的试错规程,就把问题归结到一个明确的地方,即在某个空间中搜索。如果能够找到一个合适的试错规程和搜索空间,就已经进展了一大步。但是,暴力搜索是非常消耗资源的,要超越此困难就需要计算体具备主观和能动,这是超越计算复杂性的最根本 和最重要的部分。 我们认为具备智能的计算体有两个原则:1)如果没有错误,完全正确,就不可能超越计算复杂 性。2)如果完全由人来设定程序,就不可能做到根据具体情况做适当调整,也不可能超越计算 复杂性。所以,需要试错,更需要能动。具备了这两个原则的计算体,就可以利用待计算特例里面的各种潜在的特征来达到节省资源,完成任务。总之,超越计算复杂性就依赖于这些。当然, 我们不否认的确存在那样的待计算特例,即里面几乎没有弱点、规律、模式、对称、特点等可以利用的东西。如果是那样,具备智能的计算体也就力所未逮。不过,我们相信,这样的情况是极少数情况。但是,究竟有多少是可以用智能来处理的?有多少是不可能的?用智能来处理又可以 改善多少?这些问题非常重要,需要进一步的研究。但是,明确的是:唯有智能可以利用特例里面的特征来超越计算复杂性。再进一步,唯有具备智能的机器才能利用大尺度的待计算特例里 面的特征,人力已经不能把握这样的尺度。 如果通过合适的试错规程和能动搜索实现超越计算复杂性,这就是智能的成功。但是,即使实 现后,也并不是事情的结束。事实上,试错规程也是复杂度非常高的事情,能动搜索也同样。那么,完全可以在试错规程中应用更深一层次的试错规程和能动搜索,在能动搜索中应用更深一层次的试错规程和能动搜索。智能可以这样一直深入进去。或许,这就触及了某种有关智能的核心。 要超越计算复杂性,必然要把注意力从非特例计算转移到针对特例的计算。此处,我们再强调一下,针对特例的计算和非确定图灵机有非常密切的关系(参考[7])。这里面有很多问题,是计算理论的重大问题,也是关于人工智能的重大理论问题。可以展望,这方面将有很多重大发展。值得指出,非确定图灵机作为理论讨论工具已经有很多年了,但是,并没有向实践方向的发展。而对于针对特例的计算,我们不是停留在非确定,而是导入智能去提升,因此走向了完全不同的方向。这是非常重大的不同。 数组等分问题被称为最容易的困难问题,是非常有道理的。因为这个问题的特性,例如其定义就和搜索自然联系在一起,对帮助我们理清思想很有帮助,我们正是在思考这个问题时,逐渐理解了试错规程和能动搜索的框架。这样的试错规程+能动搜索将形成一个智能计算体,如 果我们能够找到这样的能动搜索的话。而且,如果有了这样的能动搜索,因为很多NP-完全问 题可以相互转化,就有可能找到更多的,针对更多问题的具备智能的计算体。这些计算体应该可以极大帮助我们提升解决高度复杂问题的能力。因此,这样的智能计算体具备重大意义。我 们认为,一旦这样的智能计算体呈现之后,我们对智能的认识或许会有重大改变。人们不会对这个智能体说,“做出来的,就不再是智能的”,就像我们现在对Deepmind的AlphaGo程序,或者IBM的Jeopardy程序说的那样,因为这样的智能体将会表现出鲜明的,不容忽视的,不容抹杀的智能特征。面对这样的计算体,考察这样的计算体,我们应该可以获得对智能的深层次理解, 甚至于飞跃式的深入理解。 当然,现在还没有人做出这样的计算体。但是,我们相信这样的计算体是存在的,我们对此有思考和探索方向。我们将继续工作,希望能够把这样计算体尽快呈现出来。 在本文的写作基本完成的时候,我们读到采访李国杰教授的文章[1],倍感鼓舞。李教授在采访中提到的思路,和我们的想法在同一个方向上。他说:“我这里讲的用人工智能解决NP-hard问题,不是指理论意义上的解决”。李教授希望采用人工智能和智能科学的思想和方法反过来帮助解决 计算复杂性极高的问题。而这正是本文的目标。李教授也提到:“区分问题和问题实例”的重要性。这正是本文进行讨论的基本出发点(定义2.1)。我们正是剖析了这个重要区别,理清了关系,因此而建立了基本的讨论框架。德不孤焉,幸甚! 致 谢 感谢柳渝博士(法国)。自从2017年起,我就和她就图灵机,非确定图灵机,还有其他的关于计算的话题有很多线上的讨论。这些讨论深入和富于启发,促使我从不同角度考虑问题。感谢黄岱永博士(上海),以及黄冲先生(武汉),和他们的讨论对我帮助很大。感谢各个微信群的组织者和群友们,大家的共同努力形成了一个混沌但是富于激励的环境,有助于思绪的形成和发展。谢谢互联网的内容贡献者。没有互联网上的学术资料,我的研究是不可能的。 [1] Chuyu Xiong. Sampling andLearning for Boolean Function,arxiv.org,2020.http://arxiv.org/pdf/2001.07317.pdf [2] Chuyu Xiong. Sampling andComplexity of Partition Function, arxiv.org, 2021. http://arxiv.org/pdf/2102.00855.pdf [3] 熊楚渝. 思维科学的一个初阶模型, researchage.net, 2019. DOI: 10.13140/RG.2.2.31596.72328 [4]ChuyuXiong.SomeDiscussionsonSubjectivityofMachineanditsFunctionContributionstoICIS2020,InternationalConferenceofIntelligenceScience2020,WestBengal,India [5]熊楚渝. 介绍证明P不等于NP的思路和方法, researchage.net, 2021. https://www.researchgate.net/profile/Chuyu Xiong/research [6] Richard M. Karp.Reducibility Among Combinatorial Problems, 1972 http://cgi.di.uoa.gr/˜sgk/teaching/grad/handouts/karp.pdf [7] Stephen Cook, THE PVERSUS NP PROBLEM, 2000. http://www.claymath.org/millennium/PvsNP/pvsnp.pdf [8] Pei Wang, Three fundamental misconceptions of artificialintelligence,JournalofExperimental&TheoreticalArtificialIntelligence,Vol.19,No.3,Pages249-268,2007 [9] P. Kugel, Thinking may be more than computing, http://citeseerx.ist.psu.edu/viewdoc/downloaddoi=10.1.1.297.2677&rep=rep1&type=pdf [10]Scott Aaronson, P =?NP,2011.https://www.scottaaronson.com/papers/pnp.pdf [11] M.Prates, P. Avelar, H. Lemos, L.Lamb, M. Vardi, Learning to SolveNP-Complete Prob- lems: A Graph Neural Network for Decision TSP.http://arxiv.org/pdf/1809.02721v3.pdf [12] A. Yang, J. Wright, Y. Ma, S. Sastry, Feature Selection in FaceRecognition: A Sparse Repre- sentationPerspective, 2007. https://www2.eecs.berkeley.edu/Pubs/TechRpts/2007/EECS- 2007-99.pdf参考文献