未来算法:下一个十年赢在计算思维
上QQ阅读APP看书,第一时间看更新

第1章
分解问题:从炒鸡蛋到无人驾驶

在这个开篇短章中,我将介绍计算思维中看似最简单但其实最强大的概念:分解问题。在图1-1中,大家可以看到,分解问题是计算思维这栋房子的“屋顶”。问题被分解后,各类算法才能上阵发挥作用。

分而治之、各个击破是兵家常用的策略。分解问题就是分治法。兵法讲了分治法的“道”,而计算思维介绍分治法的“术”,也就是具体什么是分解问题,怎么分,怎么表示,分了以后怎么一步步地做,最后怎么正确地解决问题。

计算机既聪明又强大,它可以完成登月、自动导航、构建VR之类的特别有意思但人类还做不好或做不到的事情,它还可以下围棋,打败世界冠军。但是,计算机做到这些事,凭的是它的速度超快。计算机没有办法“一览众山小”,它只能一棵树一棵树地看,一朵花一朵花地数。计算机最核心的部件做的是极其严格、死板、正确、简单的操作。从简单操作到强大应用,计算机所使用的方法就是分解问题。

图1-1

计算机能把复杂的大事情分解成多个简单的小事情,把一个大问题分解成若干小问题,然后逐个击破。分解问题听上去简单,但是我们需要用清晰的逻辑和流程来表现它,计算机才能理解和执行任务。

炒鸡蛋

图1-2

举个例子,菜谱使用的就是一种标准的分解问题的表现方式,一个不会做菜的人看到菜谱可以一步步炒出一道菜。计算机算法就像菜谱,任何一台计算机接受一个算法都可以同样地完成一项任务。

下面我们就先用简单的菜谱来举例,介绍分解问题中的两个概念:串行并行

试想,如果世界上真有炒鸡蛋的菜谱,它会是怎么样的?它会分为以下几步:(1)准备原料,(2)炒蛋,(3)盛到盘子里。注意,这三步需要一步一步地进行,顺序不能颠倒,不能先盛盘再炒蛋。顺序执行,就是计算机语言所说的串行。

这三个步骤也可以用一个非常简单的流程图(见图1-3)来表示。对于串行的事情,做事只能按照给定的先后顺序来。

图1-3

分解问题不限于一个层次。大步骤可以再继续分解细化。比如,如果一个人还是不理解怎么炒蛋,那么我们可以把上面的步骤细化,第二步“炒蛋”可以再次分解为:(2.1)把油下锅,(2.2)把蛋下锅,(2.3)翻炒5分钟。这三个小步骤也需要串行(见图1-4)。

图1-4

那什么是并行呢?在第二步的同时,也就是炒蛋的同时,我们可以把盘子准备好,这就叫并行。简单地说,并行就是在同样的时间里同时做多件事。在图1-5所示的流程图里,并行被表示为不同的通道。大家可以看到,并行的两个通道上的任务2和2A可以同时做,但是2和2A必须都发生在任务1之后,任务3之前。

图1-5

那么分解问题要分解到什么程度呢?我们再用上面的菜谱来打比方,把做菜的过程分解到看菜谱的人看到以后会做就行了。比如,拿盘子这件事一般人都会拿,至于这个人是用左手去拿,还是用右手去拿,写菜谱的人可以不管。只要那个人能准时在炒蛋完成的时候把盘子拿来就行了。

拿盘子这个操作,就等同于我们后面要大篇幅介绍的算法。这件事我们一看就会,还可以请别人代做。分解问题,最终要把问题分解成可以用一台计算机使用算法来解决的问题。

说到这里,你可能会感到疑惑,炒蛋的步骤可以分解,可你还是不知道计算机是怎么完成复杂任务的。其实,计算机实际做的事情确实要更复杂、更难、更耗时间,要求也更高。但复杂的任务也需要先进行分解,基本思路还是一样的。我们来看看短视频推荐和无人驾驶。

短视频推荐

记得前面我们简单介绍过抖音个性化推荐短视频吗?我们先来看一下,从用户的角度这是一个什么样的使用场景。

短视频应用最核心的功能是自动给用户推荐短视频。比如抖音这款短视频应用,产品界面主要是全屏单一短视频沉浸式的体验,打开应用程序,用户直接看到一个推荐的短视频自动开始播放。如果用户对当前视频感兴趣,视频自动完成播放,然后循环播放,用户可以上滑看下一个视频;用户如果对当前视频不感兴趣,也可以很容易地上滑翻看下一个视频。短视频的这种产品设计主要迎合了用户的下面几个使用习惯。

(1)基于推荐。把系统认为用户可能最喜欢的视频直接推荐给用户,让用户从打开程序到开始观看视频的路径最短。

(2)极简操作。用户喜欢看就沉浸其中,因为视频以不到一分钟的短视频为主,用户每看一个视频耗时很短,可以上滑翻看下一个,随时看随时刷。

(3)下一个视频的惊喜感。上滑看下一个视频,是一个非常自然的简单操作,且用户总有一种打开下一个看看是什么的惊喜感。加上短视频平台应用了AI算法,随着用户刷的视频增多,根据用户针对每一个推送视频的观看行为(看了多久、是否看完、点赞、关注、转发等),短视频系统对用户更了解,系统就能更准确地预测用户的喜好,进而推荐用户更可能会喜欢的短视频。这样在上滑看下一个视频的时候,用户刷到一个更喜欢的视频的概率就更大,产生刷完一个还想看下一个的持续使用体验。

在了解了从用户角度刷短视频是一种什么样的产品使用体验后,我们再来看一下,从计算机的角度看,这是一个什么样的计算问题。

本质上计算机需要解的问题是:给定一个用户,在一个给定的时刻,推荐一个最匹配用户喜好的短视频,从而优化某些产品使用目标。

对于一个给定的用户,计算机需要试图理解用户的喜好;对于一个给定的时刻,计算机需要发现用户在不同时刻的使用习惯;对于推荐的短视频,计算机需要理解整个内容库供给端的所有可推荐的视频;对于产品使用目标,它可以是用户使用时长、用户活跃度、转化率等。

用分解问题的思路,抖音个性化推荐短视频这个问题可以拆解成:(1)把所有的视频按内容分类和排序;(2)根据所有用户以前各自的观看习惯,推导出喜好;(3)把视频内容和用户喜好进行匹配,按匹配程度排序。现在,我们可以把这三步用我们刚学会的流程图来表示(见图1-6)。

图1-6

看了这个问题分解的图1-6,我们发现其实前两步是可以并行完成的,它们都是耗时耗工的事儿,并行来做应该会有好处。而第三步,把视频内容和用户喜好进行匹配,按匹配程度排序,则可以拆成两步,如图1-7所示。

图1-7

图1-6和图1-7是两个不同的流程图做同样的事。然而图1-7相对来说有几个好处。其一,第一步和第二步可以并行,而并行往往可以大大地节省时间。给千万个视频进行内容分类并不容易,在公司里,这两件事甚至可以由两个不同的团队去做。其二,在图1-7里,步骤1和步骤3.2使用的都是标准问题法。步骤1是一个分类问题,可以用我们第3章要学的某一个分类算法来做。步骤3.2是一个标准的排序,可以用后面第2章要学习的任何一个排序算法来解。步骤2和步骤3.1还比较复杂,可以继续拆解。

当然,上面我们给的只是个范例,真正的抖音推荐算法要复杂得多,但是原理类似。所以,现在你已经知道抖音推荐算法中最基本的方法了!

无人驾驶

我们再来举个例子。无人驾驶,是计算机正在解决的一个非常复杂的问题,全人类都对无人驾驶的广泛民用翘首以待,这当中有很多复杂的技术问题。

图1-8

我们先来简要描述一下什么是无人驾驶,它的发展现状和应用价值,然后从计算思维的角度看计算机如何分解这个问题。

无人驾驶,顾名思义就是没有人参与控制(没有司机)却能自动驾驶的交通工具的总称,最常见的就是无人驾驶汽车。

几十年来,无人驾驶技术的研究可以分为三个阶段。大约从1980年到2003年,大学研究中心致力于两大汽车自动化愿景:第一是自动化公路系统,相对“笨拙”的汽车依靠公路基础设施来行驶;第二,另一些团体致力于研究无须特殊道路的无人驾驶汽车。

2003年至2007年,美国国防部高级研究计划局(DARPA)进行了“三大挑战”,明显地推动了无人驾驶技术的进步:前两个挑战在农村环境,第三个挑战在城市环境。每个挑战都促使大学研究团队在此项技术的研发中进行大力投入。

近10年,私营企业也推动了无人驾驶技术的发展。谷歌的无人驾驶汽车计划已经开发和测试了一队汽车,并通过举办活动来展示这项技术的应用。2013年,奥迪和丰田在国际消费电子展上公布了各自的无人驾驶汽车愿景和研究项目,日产也宣布计划在2020年之后开始销售无人驾驶汽车。

无人驾驶的广泛民用一直是各大公司研发的目标。2020年10月,无人驾驶领域的先行者、谷歌母公司旗下的无人驾驶子公司Waymo在美国菲尼克斯向公众开放完全没有安全员的无人驾驶出租车服务,这也是首次有无人驾驶公司向公众开放完全无人驾驶的出租车,是无人驾驶民用的一个重要的里程碑。

无人驾驶是目前AI技术最前沿和前景最广阔的方向,从基于机器学习和机器视觉的算法,叠加5G(第五代移动通信技术)和云计算的信息互通,到机器人操控技术的“大综合”,都是它涉及的领域。随着汽车的电动化,传感器和车载芯片技术的发展,机器学习算法的突破,云计算的普及,以及5G的出现,全球乘用车和商用车都逐渐开始拥抱无人驾驶技术。

无人驾驶这个错综复杂的AI问题,从计算机的角度来看,一般可以分解为三步,如图1-9所示。

图1-9

(1)感知环境:用摄像设备监测道路、障碍物、天气等。这一步有点像人的眼睛和耳朵做的事情。

(2)做出决策:根据汽车的目标、地图、交通规则等,对驾驶行为做出决策,可以是继续前进、加速、减速、转弯、停止等。这一步相当于人的大脑做的事情。

(3)开始行动:根据前一步所做的决策来行动,操纵方向盘、加速或者转弯。这一步相当于人的手和脚做的事情。

上面这三步可以串行,多个这样串行的步骤又在同时进行,不断地感知、决策、行动。当然,这三步中的每一步又可以分解成若干小步。尤其是第二步决策,它可能会使用非常复杂的算法,比如深度学习算法等。在第3章讲分类的时候,我会更加细致地告诉大家,在决策这一步有哪些分类问题。真实的计算机系统还要处理各种边界条件,但这并不妨碍我们理解它解决问题的大体思路。

你可以看到,小到炒鸡蛋,大到短视频推荐和无人驾驶,这些事都是可以用分解问题的方法去拆解的。计算思维是解决复杂问题的思维能力,而分解问题是计算思维的核心,这个过程把一个大问题分解成计算机可以运作的子问题,之后计算机再把子问题隔离开,分别清晰地描述出来,然后逐步用算法解决。

你可能会想,分解问题是计算思维的核心,可以帮助我们理解计算机是如何工作的,但是对我们日常生活有什么帮助呢?

其实,生活中我们会遇到的大大小小的问题,很多都可以用分解问题的计算思维来拆解,这样无论遇到多么复杂的问题,你都会知道如何下手。

办婚礼

举个贴近生活的例子,比如办婚礼。一提到办婚礼,人们可能会觉得,这是一个相对复杂和事项很多的大项目。其实只要合理地拆解,然后逐个办理,事情就会清晰很多。

如图1-10所示,我们可以先在大的层面按事件发生的时间顺序把婚礼拆解为筹备计划、前期准备、婚礼当天和婚礼后。

图1-10

然后,我们再进一步把筹备计划拆解成决定日期地点、草拟客人名单、确定伴郎伴娘等,如图1-11所示。很多子步骤可以并行,主要的步骤需要串行。这样逐层分解问题,直到我们可以对每一个子问题明确地采取行动,就实现了化繁为简。

图1-11

分解问题和编程

最后,我们简单解释一下分解问题和编程的关系。当我们把一个大问题分解成小问题,再分解成具体的步骤以后,我们就可以用一种计算机可以理解的语言,比如图形化拖拽语言、Python、C语言、Java语言等,把这些步骤表示出来,指导计算机做事。一个程序就是一系列计算机能理解的指令,编程就是写程序的这个过程。编程的关键不是写指令,而是想清楚这是什么问题,如何一步步地解决,然后再用语言写下来。本书不教大家如何写程序,而是告诉大家程序背后重要的方法和思路。有了计算思维,编程就会变得很简单。

我们讲了分解问题,把一个大问题分解成计算机可以理解的指令,再表示为能够被单独解决的小问题。那多小算是足够小了呢?要不要一直分解下去呢?这个问题的答案是,一个问题如果分解到能用我们下面几章要说的“算法”来解决,就足够小了。

一章小结

这一章讲到的概念

分解问题、流程图、串行、并行、程序、编程。

关键内容总结

◆ 计算思维的核心是分解问题。

◆ 复杂问题经多次分解后,变为算法可解的模块。

◆ 算法是计算机可理解、可执行的有清晰流程的解决问题的方法。

白兔戴上了眼镜,问道:“我该从哪儿开始呢,陛下?”

“从开始的地方开始,”国王郑重地说,“一直进行到末尾,然后停下。”

——刘易斯·卡洛尔 《爱丽丝漫游奇境记》本书引用的《爱丽丝漫游奇境记》均出自以下版本:刘易斯·卡洛尔. 爱丽丝漫游奇境记[M]. 盛世教育西方名著翻译委员会,译. 上海:上海世界图书出版公司,2009.


The White Rabbit put on his spectacles. “Where shall I begin, please your Majesty?” he asked.“Begin at the beginning,” the King said, very gravely, “and go on till you come to the end: then stop.”

— Lewis Carroll, Alice in Wonderland