关于《最强大脑》周玮的一些想法

    《最强大脑》上周玮的表现非常震撼, 激起了网络上无数的评论。 其中,涉及最多的要数大量关于”怎么快速计算这些看起来吓人的算式“的讨论。 

    比如:

        1. 果壳上就有一篇详细的讨论 ( http://www.guokr.com/article/437913/  )

        2. 知乎上的讨论(http://www.zhihu.com/question/22549436/answer/21763991)

        3. ...... 还有依靠泰勒展开,对数表等等等等。 

    我并不打算再讨论,或者说去猜测具体周玮是怎么处理的?或者周玮是不是真的最强大脑? 从现在的各种文章看来, 我认为,基本都属于像我这样的”普通人“去猜测具有天赋的最强大脑会怎么做(如果他们有跟我们差不多的大脑,只是有一些不产生质变的量变变化)。 或者基于我们的公认的一些东西去猜测,其中或多或少隐藏着一些基本的假设(我们认为的常识), 因为我们目前不知道实际上这些最强大脑有些什么不同?


    总结目前的种种猜测, 我认为我们猜测周玮的算法的过程,其实本质上是寻找一个算法, 这个算法最小化存储空间和计算复杂度。

    比如:

        1. 计算机常用的幂次计算加速 (http://en.wikipedia.org/wiki/Exponentiation_by_squaring )

            6^13 = (6^3)^2^2 * 6

        2. 迭代速度很快的牛顿迭代 (http://en.wikipedia.org/wiki/Nth_root_algorithm )

        3. 利用泰勒展开进行近似计算

        4. 记忆对数表

        ......

    怎么综合存储空间(记忆要求)和计算复杂度(时间/计算难度)两个因素? 基于某个计算难度定义, 怎么找到一个最好的算法?这应该属于算法设计的范畴。


    前面, 我描述了我的想法,觉得目前的各种猜测都是基于一些假设的,比如已知的计算操作(加减乘除/对数/乘方等), 已知的进制表示(十进制等)。我想可以做一些简单的扩展,也许得到一些更广泛的思路。

    首先,让我们看看数字表示的重要性。假如老师布置下列四个计算题:

        1. 计算 1440 + 1512

        2. 计算 1440 * 1512

        3. 计算 (2^5*3^2* 5) + (2^3 * 3^3 * 7)

        4. 计算 (2^5*3^2* 5) *  (2^3 * 3^3 * 7)
    相信对于上面的4个计算式子, 大多数人都觉得式子1和4比较容易计算,而式子2和3相对比较困难。但是,其实式子1和3是一样的, 而式子2和4是一样的。式子之间的区别在于数字的表示。不难看出,不同的数字表示适合不同的计算操作符。对于乘法来说,因式分解表示很容易, 而对于加法来说,传统的十进制表示最好。

    那么,是否可能使用不同的数字表示? 答案是肯定的。
        1. 中文 vs 英文: 先看看网络上曾经讨论的一个话题:国外小学生是否背诵九九乘法表的问题? 对于我们国内成长起来的朋友,觉得这似乎是一个不容置疑的问题。我们每个人都是这么走过来的。 我并不确定英语为母语的学生是否也有这样的乘法表,但我尝试使用英语背诵,发现还真的挺拗口,至少没有中文那么顺口(中文中个位数字都是单音节的)。 
        2. 如果说中文和英文只是语言上的区别,那么看看法语。 70 (soixante-dix) 表示为 60 (soixante) + 10 (dix), 而80 (quatre-vingt)表示为 4(quatre) * 20(vingt)
        3. 还有一些其他语言, 如德语有时高低位之间顺序有些变化等等
    上面这些表示,本质上也还是十进制,但已经在影响我们的计算速度和思维方式。 是否对于一些有天赋的人来说,数字在他们的大脑中,具有跟我们不一样的表示呢? 而那些表示对于我们来说非常复杂的操作却很容易进行?(也可能对于我们来说很容易进行的操作,他们却觉得很麻烦) 想想上面的加法和乘法。

    基于上面的这些思考, 我们也许可以猜测,在最强大脑/天才们的大脑中,一个计算 z = op(x, y)是如下进行的:
        1. 纸面上的算术式子,通过眼睛到达大脑内的数字表示, 其实可以看做一个编码的过程。 或者从机器学习角度,是一个抽取特征的过程
            x‘ = encode(x); y‘ = encode(y)
        2. 对经过编码的数字进行计算。对编码前数字的计算操作op,等价于转码后表示上的另一个计算操作op‘
            z‘ = encode(z) = op‘ (x‘ , y‘)
        3. 将大脑中的数字表示,转化为常用的十进制表示,输出写到纸面上。其实是一个解码的过程。
            op(x,y) = z = decode(z‘) = decode( encode(op(x,y)) )

    这样的一个框架,并不是异想天开的。比如,对于乘法操作,如果先进行对数转换,那么乘法操作就相当于转化之后”表示“上的加法操作。
            op(x, y) = x * y
            x‘ = encode(x) = ln(x), y‘ = encode(y) = ln(y)
            z‘ = encode (z) = op‘(x‘, y‘) = x‘ + y‘ = ln(x) + ln(y)
            op(x, y) = z = decode(z‘) = e^ z‘
    当然,我并不是说,最强大脑内部进行的就是这样的转换。但至少,可能最强大脑可以很高效地进行这样的编码和译码操作。 也就是说,他们对于纸面上的十进制数字,可以快速地转化为大脑内的一个高效数字表示;而该高效数字表示又很方便进行乘方/开方操作的。 最后,将高效数字表示,转化为十进制数字的过程也可以快速完成。 节目中有一个细节,相信不少朋友都已经发现:周玮在书写结果的时候是从高位开始的,跟平常多数情况从低位开始得到结果有些不同。(是否大脑内数字表示的译码可以先得到高位呢?)

    说了这么多,必须说,也许我是在以一个生活在二维世界(在人类看来是二维世界的三维世界)中的蚂蚁大脑,在企图猜测生存在三维空间的人类的大脑。也许需要等到我们对我们大脑有了更多了解之后才能解开这个谜底。但,至少有几点值得思考:
    1. 对某个操作的代价函数定义的情况下, 怎么学习/寻找最优的算法/模型呢? 这本质上就是我们不断探索的算法设计和最优化,是我们蚂蚁大脑向最强大脑的探索。
    2. 数字的表示,对于操作非常重要; 一如特征对于机器学习的重要性一样。找到恰当的高效的数字表示,我们能大幅提高计算的效率。 找到恰当的高效的特征表示, 我们的机器学习模型和系统能大幅提高有效性。
    3. 不同的设计,可能导致不同的系统效果。 系统/算法设计时的不同目标和权衡,可能导致不同的性能表现。 为优化乘法计算而设计的系统, 有可能并不擅长于计算加法;为优化加法设计的系统,却有可能对于乘法计算感到头疼。 如果人类的大脑是上帝设计,或者进化得到的话, 一般人的大脑也许是为了满足上帝开启项目时确定的设计目标,或在进化过程中不断优化了我们常见的计算场景; 而所谓最强大脑/天才大脑的大脑结构个例,由于结构上的某些突变,在一些普通人不擅长的领域有了突出的表现,而在另一些普通人擅长的领域且有所欠缺。

关于《最强大脑》周玮的一些想法

上一篇:找出集合S最接近中位数的k(k≤n)个数


下一篇:[UVA 705] Slash Maze