回顾通用计算展望通用学习

    在网上有朋友问这个问题:什么是通用计算,有无哲学上的意义,怎么联系上FPGA,DSP,GPU,CPU等等?

    这些问题不好回答,要讲得有趣且有意义,很不容易。还是要来努力一下,对通用计算做一些解释,而且希望用此机会来解释一下通用学习和对通用学习的展望。

    其实如果要谈通用计算,可以从一个非常简单但是有意思的例子开始。这是著名的书《可计算性和数理逻辑》中给的。我们有两个数:XXXIX和XLVIII,这是罗马数字,求它们的乘积(也要表达为罗马数字)?先给答案:MDCCCLXXII。但是怎么算出来的呢?如果停留在希腊罗马的记数体系中,究竟怎么算,我其实不知道。但是,我可以感受到希腊罗马人做这个计算的痛苦(你们也能感受到吗?)。但是,我们可以这样做,先把罗马记数转换成印度-阿拉伯记数,那就是39和48两个数,然后做我们熟悉的乘法,得到1872,然后再转换回罗马记数。这就容易了很多。

    其实通用计算的最根本思想,就是这个思想:把可以算的东西变换成标准的东西,用标准的方式来计算,然后再变换回去。

    此处说个题外的话。希腊罗马人做计算非常糟糕,因为他们的记数体系非常糟糕,而我们中国人做计算非常内行,因为我们的记数体系很先进。他们不能很好计算,是极大的坏事,但是他们就朝另一个方向发展:抽象,公理,完善的推理。焉知非福。这是有哲学意义的。

    回到计算。那么什么是标准的?什么是变换?什么是可以算的?

    对于代码狗来说,这太容易理解,因为是我们天天时时在做的事情。可以算的就是程序,标准的就是机器代码,变换就是各种编译器。当然,其实,对CTO来说,还可以更高一层次:可以算的是算法,标准的是机器代码,变换就是代码狗加软件工具,哈哈哈!

    这些事情,对我们来说,很容易理解,因为我们现在天天时时在看到这些东西。但是,在80多年前,计算时代正在开启的那个年代,能够懂这个道理的,开始时仅有图灵(其实他当时也是模模糊糊的),然后通过读图灵的那篇著名文章,以及和图灵交流,才有了另外一个人也模模糊糊懂了,那就是冯诺曼。再然后,才是逐渐逐渐的更多的人懂了,然后才是我们的这个计算时代,每人都有很多通用计算设备,每人的正常生活和工作都离不开这些计算设备。

    所以,要懂这些道理非常不容易。要知道,这些人是最厉害的大脑。打岔说一个冯诺曼的故事。据说,在制作电子计算机时,一些电子工程师搞几天都搞不定线路图,争论不休,最好只好去找大老板冯诺曼,他安静听了双方的陈述,然后思考了10分钟,就说应该如此如此,结果就成了。他不是电子工程师,完全是凭逻辑推演得出。可见这些人的厉害。连他们都要花费很多年的时间,才最终理解了通用计算,可见这个概念并不容易。

    再讲一个故事。冯诺曼发明了计算机架构,现在我们仍然在用。按说,他应该以此为一生中的最重大贡献为荣。但是,当他病危时,有记者去问他,什么是他最骄傲的科学贡献,他只说了量子力学的数学理论,遍历理论等,完全没有提到对计算技术的贡献。难道说他不理解他的发明的极端重要?当然不是。他是极端自尊,仅提他自己的完全独创,不提跟随别人的。他心目中,计算机就是图灵的发明,就是图灵机,通用图灵机已经有了通用计算的完整思想,他仅是把图灵的思想在技术上实现得更好更具体而已,因此他不提。一叹!这种极端自尊,现在已经很少见了!

    那么什么是图灵机的关键思想呢?虽然我们天天时时在用,其实也要费一些口舌来讲。抄Michael Rabin教授(图灵奖获得者)在纪念图灵诞生100周年(在以色列)的会上讲演中的一段话。

图灵机的最基本的原则:

1. 记忆体,符号集

2. 很小的一个指令集(可以小于100个指令)

3. 指令周期

4. 程序存储

5. 通用计算设备(一个机器可以通过编程来计算任何可以计算的函数/程

序)

    这些全部都在图灵的那篇著名文章《论可计算数》里面讲到。

    当然,当时是非常模糊和含混的,还没有能够如此清晰地提炼出来。非常可能当图灵写下文章时,就是想到了一个模型可以解决他当时的问题,并没有想到这个模型有那么重大的意义和作用,将开启一个时代。但是,他肯定清楚,要做机械式计算,恐怕就是这个路子了,绝对不是一个专用硬件去解决一个特殊问题。

    可以用今天的术语来解说一下,就比较清楚了。1,记忆体就是我们的内存,符号集就是{0,1}。2,指令集就是CPU(GPU等等)的指令集,当然现在的指令集比较大,因为现在的CPU要复杂很多。3,指令周期就是CPU的一个周期,就是读数据,然后根据程序,做一些简单操作,再写数据。4,程序其实也是数据,存储在机器中。5,CPU(其实FPGA,DSP,GPU也都如此)就是通用计算设备。就是说,我们的程序通过编译器,变换成了一串机器指令,而执行机器指令就完成了计算。

    这里就CPU和FPGA,DSP,GPU的差别讲几句话。可以比较抽象讲,这些芯片都是硬件,也都相当于一堆布尔函数(香农的理论),而这些布尔函数可以执行各种指令。注意,在原则上,一个很小的指令集就可以了,而要完成这个小指令集的布尔函数也不会很复杂。这对计算机的早期发展很重要。当然,现在的芯片都很复杂,指令集很大了,因为要做多得多的事情。特别要说的,现代的芯片都是同时运行多个程序,因此复杂。FPGA可以说是可以修改的硬件,其代表的布尔函数可以修改。而DSP是专门用于处理信号的,就是那些布尔函数中,有很多是专门为信号处理设置的。GPU中的有很多布尔函数是专门处理浮点数运算和图像处理的。

    但是,我们还没有讲一个非常关键点:什么是可以算的?这是一个非常重要的问题。其实到了现在,80多年后,对什么是机械式计算可以算的,很多人仍然模糊,可能还包括若干专业人士。不过,这个问题可以说是解决了的,在30年代就有了3个独立发展起来的理论,也明确了这3个理论完全等价。这就是哥德尔的递归函数理论,图灵的图灵机理论,丘奇的兰姆达运算理论。这3个理论从不同的角度出发,都对什么是机械式计算做了严格规定。后来,还发展出更多的独立理论,也完全等价。可以计算的,就是哥德尔的递归函数,或者是图灵机能计算的,或者是可以用兰姆达运算表达的。其实,用现代语言来说,就是:可以用某种编程语言写出来的程序就是可以计算的(基本上等于用兰姆达运算表达)。对这种程序,我们可以通过工具转换成机器码,机器就可以执行这些码,计算就完成了。最简单的意义上讲,和最前面的那个罗马数字的例子所表达的一样。注意到,是任何计算,从放歌曲,到玩游戏,到导弹控制,到电网管理,到手机通讯,到登陆月球,到证明数学定理,到机器人运行,等等,等等。总之,是任何计算。所以是通用计算。

    推荐对计算理论有兴趣的朋友读读张寅生教授的书《证明和计算》。

    说到这里,可以对照一下通用计算和专用计算的这两条发展路线。在上世纪30年代,有非常多的计算设备被开发出来。通用计算这条路线我们前面说了,是在理论探讨成功的基础上,再开发出来的。不过,那时工业界的主流正是专用计算,就是说用一套专门的硬件来做一些专门的计算。可以看附图,这是IBM当初开发的公司会计帐目计算机。但是现在的人已经完全忘记了这条曾经的主流。为什么呢?这就是有理论和没有理论的差别,通用和专用的差别。没有理论,其实就是死路。

640?wx_fmt=png

    这些都是过去了。现在我们在一个全新的时代,面临全新的问题。那么,我们这个时代的最重要问题是什么?每个人都有自己的看法。我的看法是:最重要的问题是,程序是从哪里来的?

    迄今为止,绝大多数程序都是人编的。但是,这不会继续下去了,事实上已经很难继续了。为什么呢?请大家一定要分清楚,可以计算的,和可以人来编程的,是非常不同的。事实上,已经出现了很多领域,人编程的东西完全不够用了。最典型的例子,就是围棋程序。AlphaGo的下棋的程序就不是人能够编出来的。

    可以预见,以后的绝大多数程序,不是人编的,而是人教的。这就需要建立通用学习理论。什么是通用学习?就是一个机器可以学会所有可能学会的事情(对照通用计算:一个机器可以计算所有可能计算的事情)。这就是我们这个时代的任务。我们需要理解这种机器的基本性质,理清这种机器的基本规律,建立这种机器的基本原则,并且逐步工程实现,然后应用于实际问题。这条路才是和历史上的通用计算的路一样的光明伟大的路。

    局限于专用学习,不可能到达高的境界获得高的成功。

    建立通用学习是伟大的任务,是我们这个时代的任务。我们正在朝这个方向努力。欢迎有志的朋友来加入来参与。

    计算已定,学习当立!

附:

山川马拉松途中有感

晨曦春林绿耀金,

越岭驰奔思绪欣。

哥图冯丘新旧意,

斜阳细雨释机心。


注1,山川马拉松在纽约上州的山岭里面穿行,超过26英里,上下1500米。

完成全程花了13个小时多。在山林中独自穿行,每有新的思想火花产生。


注2,哥图冯丘,哥德尔,图灵,冯诺曼,丘奇在80多年前发展出计算理

论,指导了这几十年的计算技术发展。但是现在这些理论已经不足指导新

的发展,亟需发展新的理论。


注3,机心,机器认识论的核心理论。


猜你喜欢

转载自blog.csdn.net/VucNdnrzk8iwX/article/details/90653094