查看原文
其他

未来是属于算法的,不是代码

2017-04-11 伯乐在线-黄小非 算法爱好者

(点击上方公众号,可快速关注)


来源: 伯乐在线 - 黄小非

如有好文章投稿,请点击 → 这里了解详情

如需转载,发送「转载」二字查看说明


大数据的时代已经来临。数据带来的狂潮就犹如又一次工业革命一样席卷着人类。在大数据的时代,人类对世界的理解方法从有限具体向抽象过渡,这也就是为什么算法比代码更加重要的原因。


说到大数据……


如果把人类的历史压缩到一天,那么我们可以忽略之前的时间,直接从晚上11点07分开始说起。这本该是安静的一天,但是就在这一天快结束的短短的时段里,突然产生出大量的知识和信息,需要在人与人之间进行传播。你可以想象一下,之前,人类的知识和信息的传播方式是通过口口相传,代代相传,由父到子,师授徒承的方式来进行的。而在某一个时刻,人类社会所产生出的知识和信息的体量已经达到了传统方式无法承载的地步。


我们需要某种方式来对如此规模的知识和信息进行存储和传播。以前,采用书写的方式记录知识和信息,被认为是人类社会的重大技术革新。然而,柏拉图在《斐德罗篇》中写道:“苏格拉抵对采用书本进行知识传承的方法表示担忧,因为他认为书本并不能激发真正的知识和智慧,正确的方法应该是口口相传。”


他的观点正好代表了知识和信息的有限传播方法。你和你认识的人通过说话进行直接交流,那么在交流对话过程中就有正向和反向的观点产生。而一本书,则完全不同,这是一种抽象的交流传播方法,因为读者和作者之间并没有直接的交流。书的作者不可能知道是谁,多少人,在什么时候什么地点读了他们的作品。书的作者也许可以根据读者们的情况对作品进行一些优化调整,但是总的来说这还是一种抽象的知识传播和学习的方法。


大数据和等腰三角形


大数据时代产生的另外一项重要变革,就是我们会从简单计算向抽象计算过度。也就是形成了定理、符号、算法等等被称之为数学的思想。人类历史上有记载的最早的计算始于公元前 2500 年的美索不达米亚。当时美索不达米亚人需要算出一个装满的谷仓能够养活多少人。


美索不达米亚人的问题是非常具体的。他们的计算问题是为了解决生活中的相应问题。这种一个计算问题对应一个生活中具体问题的模式,就被称作是有限具体问题。这也是为什么很多专家认为美索不达米亚人的计算并不是数学的起源。这种有限具体的计算模式一直持续了很久,直到公元前500年的古希腊。那时的毕达哥拉斯学派的学者们开始研究奇怪的三角形的问题。比如:等腰三角形的边长是不是都是整数。


如果你采用有限具体的方法来解答这类问题,就要像毕达哥拉斯学派的学者们当时做的那样,通过把具体的数字代入进去看情况是不是满足。不过,随着代入数字的数量越来越多,复杂性的问题出现了。你究竟需要代入多少数据,才能最终证明这个命题是真还是假呢?(顺便说一下,这个命题是假的,不可能所有等腰三角形的边长都是整数。)等腰三角形边长问题的不同之处在于,它是不具体的。因为这个命题没有限定三角形的面积,也没有限定边长范围。因此可能的情况是无穷多的。不过一旦你开始把理性思维应用到大量数字上,那么就形成了数学思想。这也就是大数据的意思。毕达哥拉斯学派的思维方式将人类带向了更接近抽象的数学本质,我们今天也在用符号、规则系统以及理性的思维来解决这类抽象的问题。


也许你能在人类历史上找出更多关于大数据的例子,但是从本文的目的出发,我则要直接跳到20世纪,来看看编码是如何兴起,以及如何在现代科技世界中扮演重要角色的。


编程的兴起


编码,或者叫编程(我们在这里认为这两个词是一个意思)首次出现在历史舞台,要追溯到美国女海军少将Grace Hooper女士1945年在哈佛Mark I型计算机上工作的那个年代。在此之前,电脑(Computer)这个词,现在大家都这么叫,就是单纯的“计算机器”。第二次世界大战期间,发射火炮需要参照一个弹道表来计算弹道。弹道表上的数据,是用偏微分方程代入上百个不同的参数因子算出来的,这些参数包括:距离,海拔,风速,温度,湿度等等。顺便说一下,“电脑”(Computer)这个词,是军方用来形容那些战争期间操作计算机器的女性操作员的。这些女性操作员以“电脑”而闻名。她们需要把计算卡插入计算机器,然后摇动手柄解出方程。制作一张计算卡当时需要170个人月的工作量。


编程的出现,源于人们想找到一种更简单的方式来执行计算过程。如果我们能够为计算机器设计一套指令,让硬件能够根据指令来执行操作,那么那些对机器的手工操作就可以淘汰了。


这种方式听上去是不是很耳熟?美索不达米亚人采用泥板来进行计算,而编程则是20世纪人类使用的“新泥板”。尽管编程看上去比泥板要先进多了,但是本质上都是对具体问题进行的有限计算。只是用编程的方式计算效率更高。编程淘汰了手动计算的方式,让人类有能力去处理大量的数据。


算法 vs. 代码


算法:用一系列步骤来描述解决某种问题的思想,执行这些步骤后可以达到问题的正确性条件和终结条件。算法是对计算的一种抽象描述,与具体的实现无关。


代码:计算机的一套指令集。在特定平台上使用特定的计算机语言对计算问题进行具体实现。


计算机提供的指令操作的方式让人类可以通过算法来实现复杂的计算。而算法本身却是远在编程发明之前就存在的。穆斯林数学家Al-Khawarizm在公元820年就提出了一次和二次方程的求根算法。而算法(Algorithm)这个词就是从Al-Khawarizm的名字的拉丁语译名“Algoritmi”演变而来,“代数”(Algebra)这个词则是来自于阿拉伯语“al-jabr”,这是Al-Khawarizm在解二次方程时所用的一个步骤的名称。算法要求其步骤或指令是有限的,可实现的,而且能得到结果。正如我们所见,编程可以直接给计算机下指令。这种方式正好对实现算法非常有利,因为从本质上来说,编程就是让计算机按照一定的顺序执行不同的指令。


在大数据时代的早期,我们要处理的信息量大大增加。不过通过设计和应用,可以让我们在编程方面取得优势,再加上“摩尔定律”带来的机器性能上的进步,让我们有能力处理人类世界日益增长的数字化需求。但是用计算机解决有限具体问题的本质并没有变,因为人类是通过写代码来告诉计算机硬件具体需要执行哪些操作。不管这些操作本身有多复杂,但是终究还是来自于人类的指令。不过,算法已经展示出了巨大的潜力,或许能开创一个全新的抽象时代。


算法的兴起


从下面这个角度,我们可以看到算法与编码的巨大不同:你可以用代码实现算法。并且,算法的不同实现方式会影响算法的性能。例如,使用binary heap来搜索序列中的最大或最小元素就比较高效,用来排序则没那么高效。但是你会编程并不意味着你能设计算法,这和你能唱歌不一定就能写歌是一个道理。


所有人都知道,“摩尔定律”预言的硬件性能的增长刺激了数字化经济的发展,但是很少有人知道,在很多领域,算法带来的性能增长远比硬件来得更高。实际上,根据2010年的联邦报告显示,算法在语音识别,自然语言处理,物流等方面都带来了显著的性能增长。


“尽管公众的理解程度并不高,但是仍然不能掩盖其卓越的效果——在许多领域,算法的进步带来的性能增长要远超CPU计算速度增长的贡献。”——节选自“致总统和国会的报告:设计数字化未来”


抽象算法


我们在目前的这个时代需要处理的数据量,让我们必须放弃之前具体有限的思维方式。这是大数据迫使我们这么做的。大数据迫使我们必须后退一步,这是抽象的一步,以便于我们能够找到一种有效的方法,来处理当今时代汹涌泛滥的数据潮流。传统的做法是,你写一段代码,通过特定的参数或模式来对数据库进行搜索。比如,你要搜索“客户数据库”,找出在两周内购买2件以上物品,且支出超过30欧元的客户有哪些。你想给这类客户提供一些建议。所以你提供一种模式去搜索这些用户的数据。但是,大数据的方式是正好相反的,你需要通过大量的数据来找出模式是什么样的。


试想一下。这里有海量的数据,人类无法从中直观地找出模式。这时你就必须再退一步。这抽象的一步是为了让我们利用聚类,分类,机器学习等为基础的新方法(而不是具体的程序代码),从数据中找出有用的模式。这一步的关键在于,要找出你我看不见的模式。就像是光谱里的波长一样,人的肉眼是看不出来的,如果数据超过了一定的体量,那模式就不再直观了。这种超过一定体量,我们无法直接看出模式的数据,就叫做大数据。


这抽象算法的一步会走得更远。它不仅能帮我们找出数据中隐藏的模式,甚至还能帮我们写算法的代码。在Pedro Domingos写的“终极算法”这本书里,描述了一种“学习算法”,通过机器学习的手段,这种算法不但能够创造新的算法,而且还能写出我们需要的代码,这样计算机就能“自己写代码了,就把人类从编码中解放出来。”为了达到这样的目的,我们就必须对这些算法的工作原理有更好的了解,并通过改进这些算法,让它们能够更贴合我们的需要。不然,我们就没法充分发挥这种抽象转变的巨大潜力。


“工业革命把人类从手工劳动中解放出来,而信息革命将人类从脑力劳动中解放出来,但是机器学习则是让计算机解放了自己。如果没有机器学习,程序员将成为革命进程的瓶颈;有了它,进度就不成问题。”——Pedro Domingos, “终极算法”


关于算法的思考


在从具体有限的计算向抽象计算过度的过程中,我们还是需要各种各样的程序员的。不过这不是问题的关键。我不是要说编程不重要,也不是说编程不会做出贡献了。我想表达的观点是,我们需要开始对算法加以重视。算法并不仅仅是数学家需要关心,或者在学校里面才会用的东西。其实我们在编程的时候,算法就在我们周围,只是大家觉得不需要知道算法的实现或者原理罢了。目前,已经有人在致力于把更先进的技术(例如遗传算法)应用到大数据上,从而探索在不同领域进行优化和改进的可能了。甚至有人对金属冷却的过程进行建模,然后创建了效率更好的优化算法。(这种算法叫做“退火法”,这是一个从非常规角度思考算法的好例子,感兴趣的可以了解一下。)


目前,编程已经被提高到了和读书、写字一样的地位,在新的数字化经济时代成为了一个关键技能。这种热度反而掩盖了我们对算法的看法。算法逐渐成为我们生活的一部分:想想那些网上电影推荐,新闻推荐,正是算法根据我们的行为归纳了我们的模式。我们需要对算法加深理解,只有这样,我们才能更加深刻地理解我们的未来。


觉得本文有帮助?请分享给更多人

关注「算法爱好者」,修炼编程内功

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存