为什么伟大不能被计划

读书

TL;DR

  1. 作者认为「伟大」的成就无法通过目标驱动的方式来达成;
  2. 「目标驱动」就像 KPI,通过一项或者多项指标来衡量目标的完成度;
  3. 「指标」往往具有欺骗性,可能会导致在短期不断的接近目标(局部最优)但长期却无法达成目标(全局最优);
  4. 「伟大」的目标中通常有太多的未知因素,因为未知,所以不能被计划;
  5. 了解未知最好的方法就是「新颖性/好奇心」;
  6. 「新颖」意味着探索新事物,也就意味着更多的可能,更多的机会发现未知因素;
  7. 并不是说「目标驱动」没有意义,相对简单的任务(目标清晰、很少的未知因素),目标驱动的方式更有效率;
  8. Stay Hungry. Stay Foolish.

有这样一个迷宫,我们假设机器人的初始位置是 S,迷宫的出口是 E,现在让我们设计一个程序能够让机器人走到迷宫的出口。机器人的指令主要是移动,你可以上下左右移动机器人,如果机器人撞墙,系统会给出反馈。

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   |   |   |   |   |       |       |
+   +   +   +   +---+   +   +---+   +   +
| S     |   |           |       |   |   |
+---+   +   +---+---+---+---+   +---+---+
|                           |       |   |
+---+---+   +---+---+---+   +---+   +   +
|                               |       E
+---+---+---+---+---+---+---+---+---+---+

我们的最终目标是让机器人走出这一个迷宫,显然你不能直接控制机器人一步一步走出迷宫,而需要让机器人自主的学习如何走出迷宫。迷宫问题是强化学习(Reinforcement Learning)中常用的方法,在强化学习中机器人(准确来说是智能代理)通过与环境的交互来学习如何完成特定的任务,在迷宫问题中,只要机器人接近出口就会得到奖励,当机器人所在的位置与出口的距离为 0 的时候,目标就达成了。相当于我们给机器人制定一个 KPI,即机器人所在的位置 S 与出口 E 的距离,我们姑且将这个指标称之为 SE,当 SE 缩小时,机器人就会获得奖励,当 SE 增加时,机器人就会被惩罚。如果以这个指标来驱动机器人走出迷宫的话,那么结果大概率是这样的:

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   |   |   |   |   |       |       |
+   +   +   +   +---+   +   +---+   +   +
| S * * |   |           |       |   |   |
+---+ * +   +---+---+---+---+   +---+---+
|     * * * * * * * * * * * |       |   |
+---+---+   +---+---+---+ * +---+   +   +
|                         * * P1|       E
+---+---+---+---+---+---+---+---+---+---+

机器人从一开始就在寻求如何更接近目标 E,于是机器人会在一开始选择向右前进,也就是上图中的路线,并最终走到 P1 的位置停下来。对机器人来说,P1 是最接近 E 的位置,显而易见的是这条路线最终是无法达到出口 E 的。在这种情况下,我们就认为机器人达到了局部最优,而非全局最优。

事实上我们期望机器人的前进路线应该是这样的:

+---+---+---+---+---+---+---+---+---+---+
| * * * * * * * |                       |
+ * +---+---+ * +   +---+---+---+---+   +
| * |         * |   | * * * * *         |
+ * +   +---+ * +   + * +---+ * +---+   +
| * |   |   | * |   | * | * * * |       |
+ * +---+   + * +---+ * | * +---+   +   +
| S     |   | * * * * * | * * * |   |   |
+---+   +   +---+---+---+---+ * +---+---+
|           |                 * * * |   |
+---+---+   +---+---+---+---+---+ * +   +
|                               | * * * E
+---+---+---+---+---+---+---+---+---+---+

机器人应该先向上走,但机器人为什么不走这个路线呢?原因跟机器人的 KPI 有关,显然这条正确的路线在一开始增加 SE 的值,做出这种选择机器人会被惩罚,所以机器人不会选择走这条路。问题出在哪里呢?SE 并非一个虚荣指标,它真实的反映了机器人是否达成了目标,但这个指标存在一定的欺骗性。因为我们奖励缩小 SE,因此机器人只会关注这个数值,并尽可能的缩小 SE,这当然没有错,问题出在 SE 看起来是个线性指标,即 SE 会逐步缩小,并最终变成 0。这是一个无效的假设,SE 在某个区域内可能缩小到一个值之后就再也无法缩小。实际上 SE 只有两个状态:等于 0 和 不等于 0 的状态,我们可以简单讲起理解为 0 和 1 两个状态,当 SE 不等于 0 的时候,它就等于 1。

那是否我们换一个指标就可以解决问题呢?通常在解迷宫问题中是通过坐标的方式来标记 S 和 E 的,假设 S 的坐标是 (Xs, Ys);E 的坐标是 (Xe, Ye),当机器人到达 E 的坐标的时候,目标就达成了。如果是我们自己在这个迷宫中,我们已知迷宫的尺寸和自己的位置,同时也知道 E 的位置,那么我们会如何前进呢?

我们首先也大概率会像机器人一开始的走法,走到 P1 这个位置:

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   |   |   |   |   |       |       |
+   +   +   +   +---+   +   +---+   +   +
| S * * |   |           |       |   |   |
+---+ * +   +---+---+---+---+   +---+---+
|     * * * * * * * * * * * |       |   |
+---+---+   +---+---+---+ * +---+   +   +
|                         * * P1|       E
+---+---+---+---+---+---+---+---+---+---+

然后我们会意识到地下这条路是走不通的,因为 P1 的下面这条线就是最外层的墙壁,所有从 P1 向右走是肯定出不去的,所以这个时候我们就原路退回到上一个拐点。

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   | P2|   |   |   |       |       |
+   +   + * +   +---+   +   +---+   +   +
| S * * | * |           |       |   |   |
+---+ * + * +---+---+---+---+   +---+---+
|     * * *                 |       |   |
+---+---+   +---+---+---+   +---+   +   +
|                               |       E
+---+---+---+---+---+---+---+---+---+---+

然后从这个拐点开始向上走,走到 P2 发现也是死胡同,于是我们继续会推到上一个拐点继续尝试。

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   | * * P3|   |   |                   |
+   + * +---+   +   +   +---+   +---+   +
|   | * |   |   |   |   |       |       |
+   + * +   +   +---+   +   +---+   +   +
| S * * |   |           |       |   |   |
+---+   +   +---+---+---+---+   +---+---+
|                           |       |   |
+---+---+   +---+---+---+   +---+   +   +
|                               |       E
+---+---+---+---+---+---+---+---+---+---+

走到这个位置 P3 的时候我们发现这条路也走不通,于是再回到上一个拐点继续尝试,如此不断的重复直到我们走出迷宫。这种方法实际上类似于 Flood Fill 算法,Veritasium 在视频《The Fastest Maze-Solving Competition On Earth》中对此有很详细的解释。在已知迷宫的尺寸以及起始点的位置,Flood Fill 是一种非常高效的找到迷宫出口的方法。

通过坐标来衡量机器人是否达成目标,避免了 SE 的欺骗性,但坐标本身也不具备指导性,我们已知 S 的坐标和 E 的坐标,但是应该如何到达 E 呢,指标并没有告诉我们策略,策略实际上是由 Flood Fill 算法提供的:我们已知 S 和 E 的坐标,已知迷宫的大小,墙壁是我们达成目标的制约因素,这些制约因素也就导致我们的解决方案是有限的,接着我们就可以提出假设,然后不断的验证每一个假设。这种策略实际上跟我们做产品增长相似,我们先提出一系列的假设,假设这些因素会帮助我们达成目标,然后不断地去做实验验证。但是迷宫与现实的一大区别是,Flood Fill 算法之所以能成是有很多前面提到的前提条件的,即已知目标的位置、迷宫的尺寸等,并且迷宫本身是静态的;而现实是环境总是在不断变化的,我们不知道迷宫有多大。举个例子,实现常压室温超导这个目标,我们很清楚我们需要的是什么,在 1 个大气压下,温度在室温(20摄氏度上下)下实现的超导体。但是如何实现我们其实并不清楚,甚至说这个目标是否真实存在也是存疑的。在这种情况下,即是目标是确定的,但是当中存在太多的因素,我们无法作出相应的计划,即便能够做出计划,因为无法对过程进行测量,我们也无法评估每一个步的效果,只能通过最终的结果来判断,「目标导向」的方法在这种情况下无法帮助我们前进,我们需要一种新的策略。

Joel Lehman 和 Kenneth O. Stanley 是本书的作者,两位同时也都是 OpenAI 的研究员,他们共同提出了一种新的算法 Novelty Search(新颖性搜索算法),不同于大多数机器学习算法的目标驱动,新颖性搜索算法并不设定目标,而奖励新颖性。在解迷宫问题时,机器人会记录所以访问过的点,每个点的新颖性会随着访问次数而降低,路线上访问过点的密集度越大,新颖性就越低,从当机器人走到从未涉足的地方时,新颖性最大,我们可以认为新颖性算法实际上是在鼓励「探索」。回到迷宫案例中,新颖性搜索算法的机器人走的路线可能是这样的:

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
| ^ |   |   |   |   |   |       |       |
+ | +   +   +   +---+   +   +---+   +   +
| S-->  |   |           |       |   |   |
+---+   +   +---+---+---+---+   +---+---+
|                           |       |   |
+---+---+   +---+---+---+   +---+   +   +
|                               |       E
+---+---+---+---+---+---+---+---+---+---+

最开始的时候机器人有两个方向可以选择,要么向右,要么向上,如果机器人选择向上,那么它就会更快完成目标;如果机器人选择向右,则会稍晚的时候达成目标,所以你可以看出来,新颖性搜索看起来「效率」并不高。我们假设机器人选择向右,然后走到了位置 P1:

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   |   |   |   |   |       |       |
+   +   +   +   +---+   +   +---+   +   +
| S * * |   |           |       |   |   |
+---+ * +   +---+---+---+---+   +---+---+
|     * * * * * * * * * * * |       |   |
+---+---+   +---+---+---+ * +---+   +   +
|                         * * P1|       E
+---+---+---+---+---+---+---+---+---+---+

我们前面说过,KPI 导向的机器人会在这里停下来,因为这里是最接近出口的地方,但是新颖性搜索则不,因为机器人的目标并不是到达 E,而是「探索」,所以机器人会选择掉头继续走:

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   |   |   |   |   |       |       |
+   +   +   +   +---+   +   +---+   +   +
| S * * |   |           |       |   |   |
+---+ * +   +---+---+---+---+   +---+---+
|     * * * * * * * * * * * |       |   |
+---+---+   +---+---+---+ * +---+   +   +
|                         P2**P1|       E
+---+---+---+---+---+---+---+---+---+---+

当机器人从 P1 走到 P2 的时候,同样可以选择向上或者向左前进,虽然我们知道向左是一定不会走到出口的,但是新颖性更鼓励走没有走过的路,所以机器人会从 P2 向左继续前进:

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   |   |   |   |   |       |       |
+   +   +   +   +---+   +   +---+   +   +
| S * * |   |           |       |   |   |
+---+ * +   +---+---+---+---+   +---+---+
|     * * * * * * * * * * * |       |   |
+---+---+   +---+---+---+ * +---+   +   +
|P3* * * * * * * * * * * *P2**P1|       E
+---+---+---+---+---+---+---+---+---+---+

机器人可能会走到 P3 的位置,然后发现走不通,然后回头继续走走到 P4 的位置:

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   |   |   |   |   |       |       |
+   +   +   +   +---+   +   +---+   +   +
| S * * |   |           |       |   |   |
+---+ * +   +---+---+---+---+   +---+---+
|     * * * * * * * * * * * |       |   |
+---+---+   +---+---+---+ * +---+   +   +
|P3*******P4 * * * * * * *P2**P1|       E
+---+---+---+---+---+---+---+---+---+---+

在 P4 的时候,机器人同样有 3 个选择:向上、向左、向右,我们根据这里 *(访问过的点)的密集度来计算 3 个方向的新颖性,显然向上的新颖性最大,所以机器人会选择向上走到 P5 的位置:

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   |   |   |   |   |       |       |
+   +   +   +   +---+   +   +---+   +   +
| S * * |   |           |       |   |   |
+---+ * +   +---+---+---+---+   +---+---+
|     * * P5* * * * * * * * |       |   |
+---+---+ * +---+---+---+ * +---+   +   +
|P3*******P4 * * * * * * *P2**P1|       E
+---+---+---+---+---+---+---+---+---+---+

再次计算新颖性,机器人会选择向上继续走到 P6 的位置:

+---+---+---+---+---+---+---+---+---+---+
|               |                       |
+   +---+---+   +   +---+---+---+---+   +
|   |       |   |   |                   |
+   +   +---+   +   +   +---+   +---+   +
|   |   | P6|   |   |   |       |       |
+   +   + * +   +---+   +   +---+   +   +
| S * * | * |           |       |   |   |
+---+ * + * +---+---+---+---+   +---+---+
|     * * P5* * * * * * * * |       |   |
+---+---+ * +---+---+---+ * +---+   +   +
|P3*******P4 * * * * * * *P2**P1|       E
+---+---+---+---+---+---+---+---+---+---+

走到 P6 机器人之后回头折返到 P5 的位置然后重新计算新颖性,然后不断的重复这个过程,最终机器人一定会走到 E 这个位置。对比 Flood Fill 来看新颖性算法看起来并不那么的「效率」,但两者显然适用于不同的场景:

  • Flood Fill 致力于寻找从初始位置达到出口位置的最短路线,它有一定的前提条件,我们首先要知道初始位置和终点的坐标,同时也要知道迷宫的尺寸等等;
  • 新颖性搜索算法则更擅长解决那些目标不明确,有着大量未知因素的情况,它并不追踪「效率」,而是致力于找到全局最优解。

这也是为什么这本书的名字叫做《为什么伟大不能被计划》,在作者看来,「伟大的目标」恰恰是那些目标不确定,拥有大量未知的因素的目标,例如制造出常压室温超导体,我们不能说我们应该先做 A,然后 B,然后 C 就可以实现常温超导了,可能还存在着未知因素 E 和 F,而我们甚至都不知道需要 E 和 F,也不知道什么是 E 和 F,这种场景下「制定计划」是没有意义的,因为达成目标的关键路径根本就不在「计划」当中。而新颖性之所以能成功是因为它鼓励探索,鼓励探索意味着不要做已经做过的事情,而要不断的探索「新」事物,即便这种「探索」看起来让我们像是在远离目标。虽然探索本身的「目标」并不是在寻找这些关键要素,但事实上很多的关键要素恰恰是因为「探索」才被发现的。

这可能让新颖性搜索算法听起来像是在漫无目的的「随机漫步」,事实上「探索」不是完全没有限制,在迷宫案例中,最大的限制自然是迷宫的墙壁,现实中也存在着各种各样的限制,新颖性是不会因为要研究室温超导体而跑去研究爵士乐文化。

新颖性搜索算法也是一种遗传算法 Genetic Algorithm,遗传算法的灵感来源于自然界中的生物进化。生物进化本身就是一种没有目标的活动。虽然一些理论认为「生存和繁衍」是生物进化的目标,这显然是不准确的,如果是这样的话,那么蟑螂显然已经胜利了。作者认为生存和繁衍是对进化的一种约束条件,我们可以将生存和繁衍定义为对环境的适应性,适应性是一种评价机制,用于评价进化的结果,淘汰那些无法适应环境的结果,而选择适应性更强的物种继续进化,也就是我们所说的「物竞天择」。如此看来,人类并不是进化的目标,而是进化的结果,生物进化从来不存在一个「要进化出人类」这样的目标,而是以「适应性」作为约束条件,让基因不断的遗传、变异、分化从而丰富物种。新颖性搜索算法鼓励「探索」,而鼓励探索的结果就是增加了结果的多样性,而多样性也就意味着更多可能,意味着更有机会发现未知的因素。

新颖性搜索算法以及遗传算法同时也都是启发式算法,都是为了解决数学中的优化问题,即在有限的解决方案集合中选出最优的方案,这个解决方案的集合叫做解空间。现实中我们可能会遇到 3 中不同的情况:一种是全局最优解在解空间中;另一种解空间不为空,但是全局最优解不再解空间中;最后一种解空间是空集合(没有已知的解决方案)。后面两种情况下传统的优化算法是无法得到全局最优解的。而启发式算法的目的则是尽可能的多的找到解决方案,新颖性搜索则更适用于第三种情况,通过好奇来驱动「探索」解决方案,而恰恰所谓的「伟大」目标都属于第三种。


作者在讨论新颖性的时候与之对比的是「目标驱动」的做事方式,新颖性则可以理解为「好奇心驱动」的做事方式,而往往那些「伟大」的成就是通过后者达成的。Johnny Depp 一开始并非致力于要成为演员,而是一个摇滚乐队的吉他手;村上春树一开始也只是经营着咖啡馆和酒吧,他与不同的客人交流才为他之后的文学创作带来了灵感;研究发现,近三分之二的成年人。将他们职业选择的某些因素归因于偶然性。对我来说也是如此,我并非一开始就想做一个产品经理,甚至在我入行之前我根本都不知道产品经理这个职业的存在,种种机缘巧合才让我成为了今天的自己。这些偶然性恰恰是因为好奇心,好奇心驱使我们不停地去探索新的事物,这些新的事物就是这个世界上的点,虽然在探索的时候我们尚未意识到这些「点」的作用,但恰恰是这些点创造了无数种新的「可能」,这些可能才形成了「机会」,让我们成为了今天的自己。伟大的目标不能够被计划,因为它充满了未知,又没有线索,还有一定的偶然性,即便我们很清楚的知道目标也无济于事,例如找到自己的另一半。正如 Loretta Young 所说,「不是你找到了爱,而是爱找到了你」。这让我想起乔布斯在斯坦佛大学的演讲

你不能预先把点点滴滴串在一起;唯有未来回顾时,你才会明白那些点点滴滴是如何串在一起的。所以你得相信,你现在所体会的东西,将来多少会连接在一块。你得信任某个东西,直觉也好,命运也好,生命也好,或者业力。这种作法从来没让我失望,也让我的人生整个不同起来。

唯一获得真正满足的方法就是做你相信是伟大的工作,而唯一做伟大工作的方法是爱你所做的事。如果你还没找到这些事,继续找,别停顿。尽你全心全力,你知道你一定会找到。而且,如同任何伟大的关系,事情只会随着时间愈来愈好。所以,在你找到之前,继续找,别停顿。

好奇心是进步的关键,如果你看不到未来,这很正常,没有人看到的,但保持好奇心总是不会错的,去了解那些你不曾知道的事物,去你不曾去过的地方,要让自己的路越早越宽,才能「适应」这瞬息万变的世界。

Stay Hungry. Stay Foolish.