Skip to content

《心中有数》 刘雪峰解读

《心中有数》|刘雪峰解读

你好,欢迎每天听本书,我是刘雪峰,北京航空航天大学计算机学院的一名教师。从今天开始,我会用六本书,带你探寻生活中的数学思维。我们一起借助数学家们的智慧成果,更清晰地思考生活中的问题,更明智地做出人生决策。

今天我要为你解读的这本书是我撰写的《心中有数》。

这本《心中有数》是我写的第一本书。通过这本书我想告诉大家,数学不是一道道题目,它和我们的生活中的很多智慧是紧密相关的,是看清世界的一个视角和一种思维方式。如果你之前不喜欢数学、害怕数学,看完这本书以后,就会发现数学也可以很有趣。这本书分为三块内容:思维篇(用理性思维看待世界)、方法篇(解决难题的策略和技巧),以及学习篇(如何学习和表达)。

今天,我会从这三个篇章中,各挑选一个代表性的内容,跟你一起探索数学思维的妙处。

概率的世界观

第一个例子和人生观有关。我们来看两个有代表性的人:小王和老李。小王很豁达,他的人生观是“事在人为”,坚信“一分耕耘、一分收获”。他在家乡开了一家民宿,也坚信自己肯定能把这个民宿开起来。经过几年的努力,游客逐渐增多,民宿开始能够维持收支平衡。但正当他信心满满准备大干一场的时候,却不料疫情来袭,民宿苦苦撑了两年之后倒闭了,之前的投资和付出的时间都成了泡影。小王感到迷茫,心底里的无力感涌出来,为什么自己那么努力,还没有好结果呢?这个“事在人为”真的对吗?

另外一人叫老李,他的经历非常坎坷,高中努力学习结果高考失常,未能如愿进入理想大学。毕业后进入一家福利不错的公司,但因小差错丢了工作。老李炒股总是买跌卖涨,最后亏损严重。借钱给朋友投资,结果血本无归,差点离婚。这些经历让老李有一天突然悟出了一个道理,人生一切皆是命中注定,那些成功的人是老天选中的,而自己总在关键时刻掉链子,都是命运使然。他开始相信命运,认为人生的角色和命运早已注定,于是开始躺平,工作也只是当成任务应付。但老李这样的“宿命论”,真是一种好的生活方式吗?

现实中也有很多小王和老李,或者虽然没有那么极端,但是每个人总会在某些时刻会在“事在人为”和“宿命论”之间摇摆。

在我看来,“事在人为”和“宿命论”都不是好的世界观,正确的世界观应该在这两者之间,我把它叫做概率的世界观。这个概率的世界观的核心思想有两个。第一,很多事情最终的结果,在事前我们是不能保证的。第二,这个结果发生的概率,是可以靠我们的努力去改变的。第一句话的意思是绝大多数事情,在事前我们都不能完全肯定这个事情的结果是什么。第二句话的意思是,虽然我们不能在事前确定结果,但是人的努力可以改变结果发生的概率。

这两句话很好理解。例如,一位农民无法保证自己今年这块地的收成一定很好,因为有时候偶尔的一场暴雨、一次病虫害就可能摧毁自己一年的努力。这就是事情的结果在事前不能够保证。但是,如果他努力地、认真地劳作,做好防护措施,可以让收成好的概率大大提高。

在某次火箭发射之前,谁都不能保证这次发射一定能够成功。但是如果相关工程人员能够按照流程做到一丝不苟,不放过一个小问题,那么这次发射成功的概率,就可以比没有严格规范流程的场合要高得多。

我想有些朋友能够立刻感觉到,这个概率论的世界观,和我们熟知的“谋事在人,成事在天”有相通之处。

这句耳熟能详的成语,强调了人们在追求目标时需要付出努力和智慧,但也要承认最终的结果可能受到不可预见的因素影响。

“成事在天”,和概率的世界观的第一句话,也就是“很多事情最终的结果,在事前我们是不能保证的”完全一致。

而概率的世界观的第二句:“我们的努力可以改变结果发生的概率”,在思想上就对应着“谋事在人”。

但是,概率的世界观,会比“谋事在人,成事在天”看得更清楚。

首先,“谋事在人”只强调了我们要努力做事情,但是没有体现出来成功和我们努力之间的关系。这个关系从概率的角度来描述是最精准的。书中用了一个比方:如果一个懒惰的农民拿到好收成的概率是10%的话,那么一个勤劳努力的农民可以把这个概率提高到90%。

其次,如果我们拿概率来看之前的小王和老李的两种世界观“事在人为”以及“宿命论”,它们的问题就可以看得很清楚。

“事在人为”相信什么事情只要努力就一定成功,这是不符合事实的,因为没有考虑到各种随机的因素。

“宿命论”认为你什么事情都不用做,因为有老天安排好了,这也有很大的问题。虽然人的努力不能保证成功,但可以提高成功的概率。一个人躺着什么也不做,也可能天上掉馅饼成为百万富翁,但是他成功的概率会低到一个自己都不相信的地步。

更重要的是,从概率的世界观,还可以更好地回答下面的问题:

如果有人问你:如果我已经尽力了,但是结果仍然失败怎么办?你的选择就很显然:找到失败的原因,如果可以改进的就改进,以提高下一次成功的概率。注意是“提高概率”,而不是下一次保证一定能行。

如果发现失败的原因无法控制,那么就坦诚地接受这次失败。如果有机会,多重复几次。因为从数学上可以证明:假设一次失败的概率是一个固定值的话,那么尝试的次数越多,这多次中出现一次成功的概率就越大。

前几年有一个科幻电影,主角在战场上作为一个新手,偶然获得了反复穿越到过去的能力:他一旦被反方的机器大军杀死,就会回到开战前。他在战场上为了救出一个代表人类希望的女战士,把这个优势用到了极致:不仅仅每次失败以后总结教训,提高下一次成功的概率,而且他还反复穿越,直到成功为止。

从概率上来看,重复的力量是巨大的。假设他每次穿越回去救回女战士的概率都是稳定的10%,也就是“九死一生”,那么从概率上来说,穿越个几十次回去,有一次成功的概率也会提到相当高的程度了。

最后,如果我们无法改变事情发生的概率,怎么办呢?那我们要做的事情就是什么也不做。例如高考每次考完一门之后,你应该忘掉这一门而专心准备下一门考试,因为无论你做什么,都不能改变你这一门考试成绩高低的概率。在你博士答辩结束后答辩委员让你在外面等结论时,你应该静静地喝一杯咖啡,因为现在做什么都没任何影响;总之,当遇见你无法改变其概率的事情后,你等待结果就好了,此刻你可以默默地对自己说一句,一切都是最好的安排。

这就是概率的世界观的人生态度:平静接受现实,努力改变概率。

那么现在,通过理解这个概率的世界观,你是否对于数学有了一点不一样的认识呢?

“多样性红利”

我们再讲书里提到的另外一个章节,“多样性红利”。我们看看这个属于经济学和社会学领域的概念能否用数学解释得更清楚。

我们先来讲讲多样性红利的概念。

我们都知道,通常情况下,多人的团队如果能够讨论并得到共识,往往比单人的团队更有效。这也就是“三个臭皮匠,顶个诸葛亮”。而多样性红利强调的是,这个多人的团队,每个人的观点、背景最好还有差别。因为研究发现,如果一个团队的人背景、经验、视角和观点都很接近,那么他们最后综合各方意见得出的结论反而有很多是错误的。而如果这群人有不同的感知视角,在集体讨论时充满了争论和分歧,反而最后达成的一致性结论是正确的。

多样性已经是一个被当代社会认可的优势。在医院,遇到一个棘手的医疗问题时,采用的方案是多个有经验的医生参加会诊。注意的是,这些医生都是来自不同科室的,具有不同的背景和经验以及不同的视角。这些医生讨论出来的共识结果,往往最接近真相。

为什么多样性红利是正确的?大部分人理解的就是,这是因为任何人都可能会遭遇认知的盲点,有不同视角的人在一起讨论,容易取长补短,不会遗漏任何地方,因此最后的共识往往最接近真相。

但是今天,我们从数学中“方程组”的角度来解释一下多样性红利。

要想从这个角度来理解多样性红利,我们首先要理解方程组的本质到底是什么。

我们从一个大家最熟悉的鸡兔同笼问题讲起,来介绍方程组的概念。该问题最早出现在《孙子算经》:“今有雉、兔同笼,上有三十五头,下九十四足。问雉、兔各几何?”这个问题有很多种解法,但是方程组,无疑是最直接、最有效的。假设鸡和兔子的数量分别为x1、x2,可列方程组如下:x1+x2=35,以及2x1+4x2=94,然后直接可以解出方程组的解为x1=23,x2=12。也就是说,有23只鸡,12只兔子。

虽然方程组我们在初中开始就会熟练使用,也用它来解决一些实际问题,但是关于方程组的本质到底是什么,却很少有人仔细思考。在我看来,方程组的本质是下面这样的。

现在有一个或者多个事物,这些事物的内在本质我们不能直接了解,而只能从一些角度来观察这些事物的外在表象。这里的内在本质,就是方程组中的想要找到的变量;而外在表象,就是方程组中等式右边的这些值。

从每个角度进行观察,我们都可以得到一组内在本质和外在表象的关系,这就得到了一个方程。每一个方程,就是一个角度观察的结果。当我们从多个角度进行观察,我们就得到了一组方程组。接下来的解方程组,就是结合多个视角的观察,来找到内在本质的过程。

拿上面鸡兔同笼的例子来说,我们想要知道的是鸡和兔的数量。第一个方程,提供了从“头”的视角看待这两个变量后得到的一个发现:所有头的和为35。第二个方程,提供了从“脚”的视角看这两个变量得到的另外一个发现:所有脚的和为94。联立方程组,就是我们把这两个视角结合起来,通过解方程,从而知道关于背后真相的信息,也就是鸡和兔的个数。

如果我们画出图来,就可以看得更清楚。x1+x2=35,以及2x1+4x2=94,代表了二维空间的两条直线。这个二维空间横轴代表x1,纵轴代表x2。第一条直线上所有点的横坐标和纵坐标,都满足方程x1+x2=35。第二条直线上所有点的横坐标和纵坐标,都满足方程2x1+4x2=94。这两条直线在空间中有一个交点,而这个交点的横纵坐标,能够同时满足这两个方程,也就是这个方程组的解。

用一条直线来代表方程组中的每个方程,用多条直线的交点来代表方程组的解,可以帮助我们更深刻地理解方程组的本质:每条直线,代表一个视角,而直线的交点,就是从多个视角达成的共识。

我们就把方程组,和多人讨论达成共识联系到了一起。那么多样性红利从哪里来呢?

我们再来看一个方程组的例子。

一个淘宝店主在网上卖气球。一个用户买了两种颜色相同,但是大小略有不同的气球,要求各自100个。店主在库存里拿了各自100个没充气的新气球,可是他在发货之前,把这些气球混在一起了。店主让小助理在发货之前再确认一下是否各自100个,这时候小助理开始犯愁了。这两种气球看起来差不多,一个一个来数的效率太低了。小助理灵机一动,想到了下面的这个方法。首先,他分别拿了一个这两种气球,找一个精密的天平分别测量了一下重量。气球A的重量是2.05克。气球B的重量是2克。然后他把混在一起的这一堆气球,快速数了一下数量,没错,一共是200个。然后又把这些气球放在一起称了一下,一共是405克。然后,同鸡兔同笼问题一样,他很快开始用方程组的思想了。

首先假设这里面气球A和气球B的数量各为x1、x2,我们可以列出如下的方程组,即x1+x2=200, 2.05x1+2x2=405

有了这个方程组,我们就可以计算出来这两个未知数的大小:x1=x2=100。即每种气球正好100个。非常漂亮!小助理很得意,这看起来是用数学来解决生活问题的一个完美范例。

且慢,在理想情况下这种方法确实没问题,但在实际情况下蕴含着一个大风险。例如,如果小助理用来测量的秤,出现了一点点误差,最后不是405克,而是406克。那么根据方程组,x1+x2=200,2.05x1+2x2=406,他得到的结果就是x1=120、x2=80。只是1克的测量误差,就让最后的结果有如此大的偏差。又比如,如果小助理开始的时候,称的那个气球A的样本,比标准的有一点点偏轻,不是2.05克,而是2.04克,那么按照这个列方程组,得到x1+x2=200,2.04x1+2x2=405,那么他得到的结果就是x1=125、x2=75,同样距离真实的x1=100、x2=100相差甚远。也就是说,0.01克的误差,对最后的估算结果造成了巨大的误差。

以上的这两种情况绝不是一件好事,因为误差在实际中几乎永远无法消除。很小的误差就会对结果造成很大的影响,就是“失之毫厘,谬以千里”。这些称重带来的误差,都可以称之为“噪声”。在上面的例子中,方程组中的一点点噪声,都会对最后的解造成巨大的误差,这个叫做“对噪声极为敏感”。数学家们将这类对于噪声极为敏感的方程组,叫“病态方程组”(ill-conditioned system of equations)。

并不是所有的方程组都会有这个问题。刚才的鸡兔同笼就不存在这个问题。我们可以验证一下,如果数脚的时候,多数了两只,那么根据方程组x1+x2=35,2×x1+4×x2=96,我们可以得到x1=24、x2=13。这个估计虽然不完全正确,但是和真实的估计x1=23、x2=12非常接近,在实际中并不会有太大的影响。

那么,病态方程组产生的原因是什么呢?我们抛开现有数学对这个问题的精确解释,而从图上来直观地给出一个解释。

我们在前一节介绍了,方程组中的每一个方程,都对应一条直线。方程组的解,就是方程对应这些直线的交点。如果我们画一下刚才的两个例子里面,不同的方程对应的直线,就可以发现,在气球的例子中,这两条直线的斜率非常接近,它们的夹角很小。你可以想象一下,此时如果给方程施加一点点噪声,对应某条直线的斜率或者是截距稍微变化一点,此时交点的位置就会发生很大变化,这就对应着方程组的解对观测噪声极其敏感。

而对比鸡兔同笼问题,就会发现这个方程组对应的两条直线的角度差别较大。即使某条直线有一点变化,交点的位置也不会发生很大的变化。这个方程组对于噪声就不会那么敏感。

所以简单地说,病态方程组,就是方程组中的这些直线的角度太接近了。这些直线的交点的位置,对于噪声极为敏感,某条线稍微变化一点,那么交点的位置就会变化极大。

现在我们用病态方程组,就可以更好地看清楚为什么多样性那么重要了。如果多个人想通过交流的方式达成共识,来了解某个事情背后的真相,那么最好这些人视角不同。同一个事情,每个人都会从各自的视角来看待它。这就相当于以自己的方式画了一条直线。所有直线的交点,就是共识。要想让这个共识能够接近事情的真相,那么这些直线的角度,不能太接近。也就是说,这些人的视角,要有较大的差别。只有具有较大差别的视角得出的共识,才具有意义。一旦角度太接近,那么这些不同角度交叉得到的共识,就会对于噪声极为敏感。一点点噪声,就会对最后的结果产生极大的影响,这也就是“失之毫厘,谬以千里”。

这也就是多样性红利的数学解释。从这个角度来说,我们可能需要对“三个臭皮匠,顶个诸葛亮”做一下修改。三个臭皮匠要想顶个诸葛亮,他们三个具备的特长,看问题的角度最好也要有所不同才行。如果这三个人的思路和观点很接近,恐怕还不如一个诸葛亮吧。

我们刚才介绍了书中的两章的内容。第一个例子中,用概率的人生观来对之前的“谋事在人,成事在天”给了一个类似但更清晰的解释。第二个例子中,用病态方程组来解释多样性红利。这些都是基于数学知识,来重新审视我们熟悉的一些概念。

人生中的“模拟退火算法”

我们再讲一个内容。这个最后的例子中,就不仅仅把数学的概念同生活的智慧联系在一起,而是可以用数学来指导你做决定。我会用数学中的模拟退火算法,来跟你说说,为什么年轻人应该多出去闯闯,而年纪大以后,就应该更加专注自己的赛道。

如果我们把人生当作爬坡的过程来说,那么谁开始都不是完美的,但是通过自己的不断努力提升自己,最后的目标,就是达到自己可能达到的最高的位置。

这个人生的成长过程,很像数学问题中找到一个函数的最高点。比如说,我们要找一个函数y=−x^2+2x的最大值,这个函数的曲线,像是一个小山的抛物线。

我们如何找到这个曲线的最高点呢?一个最直接的方法就是求导数的方法,然后可以令导数为0,这样解出的方程就可以对应最高点的位置。这个例子中确实可以用求导数的方法。但是实际中,如果函数复杂一点,或者函数本身不可导,甚至明确的表达式不存在,那我们就需要数值解(numerical solution)了。

数值解法有很多类方法,其中一种叫做爬山法。爬山法顾名思义,就像一个人爬山一样。当一个人爬一座陌生的山时,只需要时刻保证自己的位置比前一刻高,就能够最后爬到山顶。就算法而言,这个算法每次都从当前的位置附近,随机选一个位置,如果这个位置比当前的位置更高,就来到新的这个位置,反之重新再选择一次。以此类推,经过多轮迭代,我们可以找到整个函数的最高点。

但是爬山法有一个很大的问题。我们来看一个形状稍微复杂一点的曲线,这个曲线有两个山峰,右边的山峰更高。如果初始值的位置在左边高点的山脚位置,那么经过多次迭代,一定会收敛到第一个矮的山峰处,这个数学上称之为局部最高点(local maximum)。之所以爬山法找到的是局部最高点,因为这个位置比周围的点都要高。而真正的全局最高点(global maximum)在右边那个更高的山峰处。也就是说,当函数的形式比较复杂的时候,用爬山法可能会陷入局部最高点。

这个也不难理解,试想一下,如果你在大雾天爬山的时候,因为视野有限,你按照爬山法,每次都要求比前一时刻更高,那么你很可能最后到达的是一个小山坡。虽然小山坡比周围的位置都要高,但距离真正的山顶还差得很远。

那么爬山法这个问题该如何解决呢?我们首先分析一下为什么会出现这个问题。之所以算法不能从局部最高点跳出来,就是因为它每一步都试图比上一步要高。如果局部最高点的时候,我们可以接受右侧比它更低的点的位置,它就有可能来到那个更高的山峰的山脚下,从这个点迭代,就可以跳出局部最大值而到达全局最大值。

换句话说,之所以这些数值解法会陷入局部最大值,是因为它们不能接受暂时的性能下降,每一步都追求性能提高。因此解决的思路就很直接了:接受暂时的不太完美,才有可能换取到一个更好的未来。

这就好比很多人在换工作的时候都一定要下一份工作的工资比当前的高。但如果新的公司的行业前景更好,那么更好的选择或许是应该接受当前薪资的退步,从而在以后达到一个更高的高度。

那么如何接受这种不完美呢?爬山法利用了随机:具体来说,如果在当前位置的周围随机找到了一个点,该点的位置高度不如当前位置的话,那么我们也以一定的概率接受这个位置。

这种随机,就是英国经济学家蒂姆·哈福德(Tim Harford)在他的畅销书《混乱》里所描述的“混乱”。哈福德说,“意外情况会扰乱我们的日常工作或生活,但是如果我们能够积极发挥我们的创造力,便能转悲为喜。意外的出现虽然导致艺术家、科学家和工程师们从山峰跌入谷底,一旦我们离开自己的山峰,来到一个新的谷底,便能化腐朽为神奇”。

我们已经知道了利用随机性,来接受暂时的不完美,以避免陷入局部最优点。现在我们还有最后一个问题要解决:这个接受不完美的随机概率大小,应该是多少呢?

上世纪70年代末和80年代初,IBM的沃森实验室的两个科学家柯克帕特里克(S.Kirkpatrick)和格拉特(C.D.GelattJr)在研究优化算法的时候,从物理学得到了启发,发明了一个算法,叫做模拟退火算法(simulated annealing algorithm)。

我们先说说退火(annealing)。我们都听说过淬火,就是铸造宝剑时师傅把烧得通红的宝剑丢入水里。淬火过程中金属会在液体中快速冷却,从而让宝剑的硬度大大提高。淬火是一种大家最熟悉的冷却工艺。除了“淬火”之外,还有一种冷却工艺,就是我们说的退火。

退火的冷却速度比淬火慢得多。退火通过缓慢降低金属的温度,可以使金属内部组织达到或接近平衡状态,帮助金属内部释放应力、增加材料延展性和韧性,获得良好的工艺性能和使用性能。柯克帕特里克对于退火有一个洞见。他解释道,在退火过程中材料冷却的速度会对其内部结构产生很大的影响。而在物理学中,“温度”和“随机性”是对应的:温度越高,随机运动越大。那么退火过程,就代表着一种随机性从高到低的衰减。既然退火过程最终可以使得所有的金属晶体达到一个完美的平衡状态,那么爬山算法中的随机性,也应该随着时间不断降低。

具体来讲,在开始的时候,我们以较大的概率接受不完美,也就是下一刻的位置比当前的位置要低,但随着时间推移,这个接受不完美的概率应该慢慢变小。

这就是模拟退火算法。模拟退火算法这个思想,被柯克帕特里克和格拉特发表在1983年的《科学》杂志上,文章的标题是《基于模拟退火的优化算法》“Optimization by Simulated Annealing”。模拟退火算法的效果令人吃惊地好:发表在《科学》的这篇文章中用模拟退火算法设计出了更好的芯片布局,而现在模拟退火算法已经成为优化算法中的一个经典算法。

学完了模拟退火算法,我们就可以回答开始的那个问题。为什么年轻的时候应该去大城市闯一闯,并且应该多尝试一些职业呢?

首先,人生其实就是一个寻找最优解的过程。开始谁都不是完美的,但是我们通过不断努力,不断提升自己,最后的目标,就是达到自己可能达到的最优位置。这个过程,和爬山法的思想是一致的。

在不断进步的过程中,很自然的一个选择,就是你要求自己在人生中的每一步,都要追求比前一步更优。例如很多人在换工作的时候,都要求下一份工作的工资比当前的要高,或者更稳定。这种选择看起来很自然,但是算法告诉我们,这种每一步都要求比上一步好的策略,容易让自己陷入局部最高点:你选择了一个工资更高,或者更稳定的行业,这导致你错过了另外一个虽然现在看起来不太靠谱,但是发展潜力巨大的赛道。解决的方法,就是引入随机性:以一定概率接受暂时的不完美,就可以有效地避免陷入局部最优点。这种随机性,就对应着去大城市闯一闯,多尝试各种职业,找到自己的兴趣和潜力所在,而不是安安稳稳地在一个职业上终老。

而模拟退火算法则进一步告诉我们,这个随机性应该随着你的年龄慢慢降低。当你年轻的时候,可以让这个随机性最强,充分地探索,让自己接受暂时的不完美,从而能够避免陷入局部的最优值,而在将来跃上一个更高的山峰。而到年龄大了以后,当你知道自己最适合什么以后,你就要控制随机性了,你应该在自己最适合的地方深耕,而不要轻易切换赛道。

结语

好,今天这本书就解读到这里了。通过今天的内容,我想帮你建立的是这样一个思想:数学和生活不是脱节的,它体现了生活的智慧,它给我们带来了一个新的视角,甚至可以给我们提供指导。

当然,因为篇幅原因,书中还有很多类似的例子,包括我们的中庸之道和数学中最小二乘估计的关系,找函数最大值的两种方法同步步为营与精益求精的关系,等等,感兴趣的朋友,也推荐你去亲自翻开这本书,感受更多生活中的数学思维。

好,今天这本《心中有数》,我们就讲到这里。恭喜你,又听完了一本书!

划重点

1、正确的世界观不是"事在人为"或"宿命论",而是概率的世界观。

2、多样性红利不只是取长补短,而是从数学角度避免了"病态方程组"的问题。

3、人生决策不是简单地追求每一步都更好,而是要适度引入随机性。

4、数学与生活不是脱节的,而是体现了生活的智慧,能给我们提供新的视角。