TOPIC 28 · PHASE E

适应性景观FITNESS LANDSCAPES

什么时候必须先下山(When you have to go downhill first)

2026-08-15 · 适应与演化

「每一步都比上一步好」听起来是最稳妥的做事方式。而在一整类问题里,它恰恰是唯一能保证你到不了最好位置的做法——不是因为你走得不够久,是因为你走对了。

你大概经历过这样的事:想换个方向,结果发现新方向头半年干什么都不顺,比原来差远了。于是你退回去了。或者一个用了很多年的工具,明知道有更好的替代品,但一换就得重学,短期内产出直接掉一截,所以年年都说明年换。

常见的解释是意志力不够、或者沉没成本作祟。这些当然存在,但它们把一个结构问题说成了心理问题。真实的情况更冷硬一点:在很多系统里,从一个好位置去往一个更好的位置,中间必然要经过一段更差的地方。这不是运气不好,是这类问题的形状决定的。而"每一步都要比上一步好"这条看起来无可指摘的规矩,正是把你钉在原地的那颗钉子。

上一期讲的是怎么把一群主体放进电脑里跑起来(基于主体建模)。本期换个角度看同一件事:这些主体是在什么样的地形上搜索?地形的形状——有几个山头、山头之间隔多深的谷——决定了"努力改进"这件事到底管不管用。这是接下来几期(演化博弈、共演化)共用的底图。

01把「好不好」摊成一张地图(The Landscape as a Map)

1932 年,遗传学家 Sewall Wright 想解释一件事:物种为什么不是简单地朝"最优"直线前进。他画了一张后来传遍所有学科的图——把每一种可能的基因组合摆在平面上,把这种组合的繁殖成功率画成高度。地形就这么出来了。他管它叫适应性景观(fitness landscape),高度那个量叫适应度(fitness)。

这张图的力气不在"山"这个比喻,在它强迫你把三件本来含糊的事说清楚:

第一,什么算一个"位置"。一个位置就是一整套配置:生物学里是全套基因,做产品时是全套设计选择,写代码时是当前这版架构。第二,什么算"相邻"。这一条最容易被跳过,却最要命——它规定了你一步能走多远。生物学里通常是"改一个碱基",组织里可能是"改一条流程"。第三,高度是什么。某个可以比大小的量:繁殖成功率、利润、通过的测试数。

三件事定下来,一个动作就有了名字:站在当前位置,看看所有邻居,谁比我高就搬过去,没有比我高的就停。这叫爬山法(hill climbing)。绝大多数"持续改进"的做法,剥到底就是它。

三个开关的全部 8 种配置 — 连线 = 只改动其中一个开关 000 .31 100 .44 010 .28 001 .52 110 .83 101 .49 011 .71 111 .66 停在这里 三个邻居都更低 真正的最高点 爬山法永远到不了 从 000 出发,每次搬去更高的邻居:000 → 001 → 011,然后卡住。去 110 要先经过 111(.66),比 .71 低
把配置画成点、把「改一处」画成连线,「地形」就不再是比喻了。爬山法在这张图上的行为完全确定。

图里只有三个开关,就已经出现了那个要命的现象:从 000 一路往高处走,你会稳稳地停在 011(高度 .71),而全场最高的是 110(.83)。你没走错任何一步,每一步都是当时可选项里最好的。把你挡在外面的不是失误,是"每一步都不许变差"这条规矩本身。

🌀 文学与艺术 · 改稿与重写是两种操作 修改一篇文章时,你通常一次只动一句、且只接受"改完更顺"的改动——这正好是爬山法,邻域被定义成"单句替换"。由此推出一个不太甜的结论:一篇稿子最终能到什么水平,很大程度上在初稿落点时就定了,改一百遍和改十遍的差别远小于"另起一稿"和"接着改"的差别。所以"再打磨打磨"和"推倒重写"不是程度不同的同一件事,是两种不同的走法,前者永远替代不了后者。

EN A fitness landscape makes three vague things explicit: what counts as a position (a full configuration), what counts as a neighbour (how far one step reaches), and what counts as height (some comparable quantity). Once those are fixed, "continuous improvement" has a precise name — hill climbing — and its failure mode becomes visible even on a three-switch example.

02局部最优:卡住的不是努力(Local Optima)

上面那个 011 有个正式名字:局部最优(local optimum)——所有邻居都不比它高的位置。全场真正的最高点叫全局最优(global optimum)。一张地形上局部最优可以有很多个,全局最优只有一个。

局部最优的性质里,最需要盯住的是这一条:站在局部最优上,你从本地信息里看不出自己是不是全局最优。两者的本地感受完全一样——环顾四周,都往下。想知道差别,你要么得看到远处,要么得先走下去试试。

于是"从这里到更好的地方"这件事,就有了一个可以量化的代价。它是两个数:谷底有多深(最差的时候比现在低多少),和谷底有多长(要在低于现状的地方待多久)。这两个数跟"新方案好不好"完全无关——一个明显更优的方案,可能有一道又深又长的谷;一个只好一点点的方案,可能一步就跨过去。

从一个好位置去往更好的位置,代价是两个数 适应度(越高越好) 配置空间(把所有可能的做法排成一条线)→ 现状水平线 谷底深度 谷底时长(在低于现状的地方待多久) 你在这儿 局部最优 全局最优 站在局部最优上,本地信息和站在全局最优上完全一样:四周都往下
「谷底深度」和「谷底时长」跟新方案有多好无关,它们是路的属性,不是目的地的属性。

把这两个数拆开看,很多"改革失败"的故事立刻换了一种读法。多数改革不是死在方案上,是死在谷底期的授权不够长——发起改革的人拿到的耐心,比谷底短。而从外面看,谷底期的表现是实实在在的变差,于是"这个方向不行"这个结论,在数据上完全站得住。

🎯 决策线

启动任何"换一套做法"的事之前,先把两个数写下来:谷底深度(最差的时候比现在低多少,用你已经在看的那个指标)和谷底时长(多久能回到现状水平)。然后问一句:这两个数拿得到授权吗?拿不到就别启动——改做平移:在不拆掉现有系统的前提下另起一条并行的线,等它自己爬过现状水平线再切换。谷底期最常见的死法不是方案错,是中途被自己的月度指标掐掉。

🌀 生物 · 脊椎动物眼里的那个盲点 我们的视网膜光感受器朝后,神经纤维铺在感光层前面,最后要穿一个洞出去——那个洞就是盲点。章鱼的眼睛没有这个问题,布线在感光层背面。这不是"进化偷懒",是两条谱系爬上了各自的局部最优:脊椎动物要退回去重新布线,中间必然经过一段视力更差的构型,而中间态是要活下来的。由此推出的读法是:解剖学上的"不合理设计"不该读成"没被优化过",该读成"被优化得很彻底了,但只在从这个起点出发能到达的范围内"。

EN A local optimum is indistinguishable from a global one using local information alone — from either, every neighbour looks worse. The cost of moving between them is two numbers: how deep the valley is and how long it lasts. Both are properties of the route, not of the destination, and most reforms die because the mandate is shorter than the valley.

03崎岖度是可以调的(Tunable Ruggedness)

下一个问题就自然了:为什么有的地形只有一个山头(那爬山法就够用了),有的却山头林立?地形的崎岖度(ruggedness)由什么决定?

1987 年,Stuart Kauffman 和 Simon Levin 给了一个干净得出奇的答案 → 参考 · 圣塔菲学派。他们造了一个只有两个旋钮的玩具模型,叫 NK 模型 → 参考 · NK 适应性景观

N 是系统里有几个部件(比如 20 个开关)。K每个部件的好坏取决于另外几个部件的状态。就这两个数。K 就是"相互依赖的程度"。

结论惊人地整齐。K = 0 时,每个部件各管各的,你可以一个一个地把它们调到最好,互不干扰——地形只有一个山头,任何爬山路径都能到顶。K 越大,改动一个部件就会连带打乱越多别的部件的贡献,山头就越多、越尖、越互相隔开。当 K 达到最大(每个部件都依赖所有其他部件),地形彻底随机:局部最优的个数变成 2ᴺ⁄(N+1) 这么多——N=20 的时候就是约五万个。

同样多的部件,只改「每个部件依赖几个别的部件」 K = 0 部件互不影响 1 个山头 从哪儿出发都到顶 K = 中等 每个依赖两三个 若干山头 起点决定你停在哪个 K = 最大 每个依赖所有 山头多到没意义 N=20 时约 5 万个 崎岖度不是运气,是耦合度的直接后果 — 而耦合度往往是可以改的
三帧对比:部件数不变,只调"每个部件依赖几个别的部件",地形从一座山变成一片碎石。

这件事的分量在于:崎岖度不是命,是你系统架构的一个后果。"我们这儿一动就出事、渐进改进完全没用"——这句抱怨通常被理解为团队能力或者士气问题,但它更可能是一个可测的结构参数在说话。而结构参数是可以改的:拆依赖、定接口、把互相纠缠的部件分开——这些动作不直接提升任何指标,它们做的是把地形抹平,让后面每一次小改进重新变得有效。这与第 3 期讲的"近可分解性"是同一件事的两面:模块化的系统之所以活得下去,是因为它给自己造了一张不那么崎岖的地形。

🎯 决策线

当"小步优化不管用了",先别加人加时间——先量 K。具体做法:把你要改的东西拆成部件清单,对每个部件问"改它会波及几个别的部件",取平均。平均波及数大于 2、3 之后,任何单点优化都会被别处的退化抵消掉,努力和结果之间的关系会肉眼可见地变弱。这时该做的是解耦(定接口、拆依赖、砍掉跨模块的隐式假设),而不是优化。解耦本身不涨任何指标——它涨的是"以后每一次优化的有效率"。

🌀 工程与技术史 · 为什么有的代码库能重构,有的只能重写 同一个团队、同样的水平,在 A 库里小步重构一路顺畅,在 B 库里改一处炸三处,最后只能整块推倒。差别常被归给"历史包袱",但可以说得更准:B 库的 K 高——每个模块的正确性依赖于一堆别处的隐式约定。由此推出的结论是操作性的:想恢复"能小步改"这个能力,投入应该先花在降低依赖数上(哪怕这一步没有任何用户可见的收益),而不是花在提高改动的质量上。质量提高的是每一步的成功率,降 K 提高的是"存在一条全是小步的路"这件事本身。

EN Kauffman and Levin's NK model has two knobs: N components, and K — how many other components each one's contribution depends on. At K=0 the landscape has a single peak; as K rises, peaks multiply, reaching 2^N/(N+1) local optima when every component depends on every other. Ruggedness is therefore a consequence of coupling, and coupling is often something you can change.

04探索与利用:温度这个旋钮(Explore and Exploit)

既然纯爬山会卡住,那就得允许偶尔往下走。但如果一直往下走,你就只是在乱逛,永远不收敛。这个两难有个名字:探索与利用(exploration vs exploitation)——去看看别处,还是把手里这块地挖深。

最漂亮的解法来自 1983 年三位 IBM 研究者(Kirkpatrick、Gelatt、Vecchi):模拟退火(simulated annealing)。做法是给"接受一个更差的位置"加一个概率,这个概率由一个叫温度的参数控制。温度高时,你相当乐意往下走,因此在整个地形上到处跑;温度低时,你几乎只接受上坡。然后让温度随时间慢慢降下来

名字来自冶金:金属缓慢冷却时原子有时间排进低能量的规整结构,淬火(骤冷)则把它们冻在乱七八糟的位置上。关键不在"允许变差"这四个字,在降温表——什么时候、以多快的速度收掉容错。

同一张地形,同一个起点,三种「是否接受变差」的规矩 ① 只上坡 卡在第一个山头 收敛,但收敛到哪儿 全看起点 ② 一直高温 走遍全场,不停下 见过最高点, 但没有留在那儿 ③ 退火 早期乱走,后期收紧 关键不是「允许变差」, 是变差的容忍度何时收掉 温度 时间 →
三帧对比。真正被设计的东西不是"要不要探索",是那条降温曲线。

同一个思路在别的地方长出别的形状。→ 参考 · 遗传算法不靠温度,靠重组:把两个各自不错的配置各取一半拼起来,一步跳到很远的地方——相当于换了一套"相邻"的定义,原来隔着深谷的两个山头可能一步就到。多臂老虎机(multi-armed bandit)问题则把这件事收缩到最纯粹的形式:手上有几台老虎机,不知道哪台更好,每一次拉杆都是在"再试试那台没怎么试过的"和"继续拉目前最好的那台"之间选。数学上有一个反复出现的结论:探索的最优比例随着"你还要玩多少轮"上升——剩下的时间越长,越该探索。所以同一个人在同一件事上,年初和年末该有不同的探索比例,这不是心态问题,是算出来的。

🎯 决策线

把探索写成预算和降温表,不要写成态度。三件具体的事:① 固定一个比例(比如 20% 的时间/资金)投给"和现有做法不相关"的方向;② 给这部分单独设考核口径——考核它排除了多少个方向,不考核它的收益,因为探索的产出本来就是信息不是收益;③ 事先写下降温表:哪个时间点起不再开新方向、把资源收回来。没有第三条的"保持开放"会一直高温、永不收敛;没有第二条的探索预算会在第一个季度被主线的指标同化掉。

🌀 生物 · 免疫系统自己圈了一个高温区 B 细胞在淋巴结的生发中心里会启动体细胞超突变,把抗体基因那一小段的突变率抬到常规基因组的约一百万倍,然后按结合力反复筛选——这是一个货真价实的高温探索区,而且是被身体主动打开的。要紧的是它的边界:高突变率被严格限制在那一小段序列、那一小群细胞、那一段时间里,出了这个范围仍是极低的错误率。由此推出的做法不是"提高试错率",而是划一块围起来的地方把试错率调高——全局调高的系统会散架,这正是它没有那么做的原因。

EN Pure hill climbing gets stuck; pure wandering never settles. Simulated annealing resolves this with a temperature that controls how willingly you accept a worse position, then lowers it over time — the designed object is the cooling schedule, not the willingness itself. Bandit theory adds a quantitative rule: the optimal share of exploration rises with how many rounds you have left.

05这套说法在哪儿不成立(Where This Breaks Down)

适应性景观是复杂性科学里最好用、也最容易被用歪的一张图。它的问题不在于错,在于那张三维小山丘的画面太顺眼了,顺眼到你会忘记它省略了什么。

第一,维度是骗人的。画在纸上的地形只有两个横向自由度,所以每个点只有前后左右几个邻居,山与山之间必然隔着谷。真实的配置空间不是这样:20 个开关就有 20 个方向的邻居,一百万个位置。而在高维空间里,"被谷完全包围"这件事会变得罕见——你往往能找到一条几乎不下降的山脊绕过去。演化生物学家 Sergey Gavrilets 把这个图景叫多孔景观(holey landscape):高适应度的区域在高维里连成一张贯通的网,物种可以一路不下山地分化开。这直接削弱了 Wright 当年那个"必须靠小种群随机漂变跨过谷"的经典论证。

同样两个山头 — 左边是纸上的切面,右边是它真实所在的空间 纸上的一维切面 中间必须下到谷底 加一个方向之后(俯视) 直线走:过谷 绕着走:全程不下降 维度越多,这种「绕过去」的路越容易存在 「必须先下山」是切面里的结论。换个方向看,谷可能根本不是谷,是一道你没画出来的山脊
低维直觉的最大代价:把"在这个方向上是谷"读成了"这里是谷"。

第二,地形本身不是死的。NK 模型跑之前就把所有位置的高度定死了。现实中,别人也在动:你爬到的那个山头,会因为竞争者、监管、客户口味的变化而塌下去,也可能因为别人开辟的路而升起来。这叫共演化(coevolution,第 31 期的正题)。地形一旦会动,"到达最优"就不再是目标,"移动速度"和"到山脊的距离"才是。这也是为什么"我们已经做到行业最好"这句话不含任何关于明年的信息。

第三,高度未必存在。景观假设有一个可以比大小的标量。现实里的"好"通常是几个不通约的东西:快和稳、增长和利润、覆盖和精度。多目标问题里根本没有"最高点",只有一整片谁也不比谁全面更好的解(帕累托前沿,Pareto front)。硬压成一个数——"综合得分"——不是把问题解决了,是把权重的选择藏进了公式里。

第四,历史上这张图本身就有争议。科学史学者 William Provine 在 1986 年指出,Wright 的那几张地形图其实混用了两套互不兼容的坐标(基因型的空间 vs 基因频率的空间),作为数学对象站不住。这不妨碍它作为思考工具好用,但它提醒一件事:这是一个比喻的可视化,不是一个可以往里代数字的模型。凡是听到"我们处在适应性景观的某个局部最优"这种说法,先问一句:你的邻域是怎么定义的、高度是哪个量?答不上来,这句话就只是"我们卡住了"的一种更贵的说法。

顺带说清一件容易混的事:崎岖度也不是地形单方面的属性,它是地形和走法的联合属性。同一批配置,如果你允许"一次改一位",可能崎岖不堪;允许"交换两个模块",山头就少了一大半。所以卡住的时候还有第三个选项——既不是更努力,也不是先下山,而是换一套走法

🎯 决策线

用"局部最优"给自己的处境定性之前,把三个空填掉:邻域(一步能改什么)、高度(哪一个具体指标)、地形会不会动(多久重估一次)。三个都填得出,"先下山"才是一个可执行的判断;填不出就别用这套词——那时它不解释任何东西,只是给"我们卡住了"配了一张好看的图。另外,卡住时按这个顺序试:先看能不能换邻域(换走法、换工具、跨界重组),再考虑跳谷底——换邻域通常便宜得多。

EN Four limits. Low-dimensional pictures manufacture valleys that high-dimensional spaces often route around (Gavrilets' holey landscapes). NK landscapes are static while real ones move under coevolution. Multi-objective problems have no single height at all. And Provine showed Wright's original diagrams conflated two incompatible coordinate systems — it is a visualisation of a metaphor, not a model you can put numbers into.

🎒 场景 · BigCat

  1. 写作与这个学习站本身每期都照上一期的版式来,越写越顺手:节数稳定、图的类型稳定、越界的落点也开始重复。这就是一条标准的爬山路径——每一期都比上一期"更熟练",而熟练正是把你钉在同一个山头上的力。可改的东西很具体:拉出最近十期的结构参数(节数、图数、每节的字数分布),看它们的方差是在扩大还是在收窄;方差在收窄就是在爬同一个峰。然后按降温表办事——每隔固定几期,强制做一期结构不同的(比如只有两节,或者整期就一个长论证),并且事先声明这一期的反响不计入选题判断,否则探索会被主线的指标当场吃掉。
  2. 育儿反复出现的情境是:在孩子已经做得不错的那件事上继续加码,因为每周都能看到一点进步;而一件全新的事,头几个月的表现一定不如现在。于是"看得见进步"这个筛选条件,自动把选择收敛到了已经在爬的那个山头上。可改的:把"这周有没有变好"从唯一的观察量里拿掉,换一个季度尺度的问题——这个季度有没有出现过一次明确的、暂时的退步;一次都没有,说明现在的活动组合里没有任何探索。要停掉的动作是:在新东西刚开始、成绩下滑的那几周撤回支持——那正是谷底,撤回支持等于每次都在谷底掉头。
  3. 带团队与组织每个绩效周期都会重演一次:做新方向的人评分低于把现有系统维护得很好的人,因为前者在这个周期里还拿不出成形的产出。这不是评分的人不公,是尺子只有一把——用"利用"的口径去量"探索",结果必然如此。可改的不是给探索加权重(加权重只是把同一把尺子上的读数改大),而是给它换一个能在本周期内结算的产出定义:这个周期排除了哪三个方向、把哪个不确定性从"不知道"推到了"知道不行"。要停掉的动作是:把这两类工作放在同一张评分表上排序。

🌀 越界 · 跨学科的联想(Crossings)

深入思考(Going Deeper)

如果高维空间里山脊到处都是,那"必须先下山"是不是根本就是个伪问题?

不是,但它的适用范围比通常以为的窄。关键在于你的邻域有多丰富:生物演化里可动的位点成千上万,所以绕路的机会多;而一个组织能同时改的东西往往只有两三样,有效维度极低,谷就是真的谷。所以判据不是"这个系统复杂不复杂",是"我一步能同时改几件事"。这也解释了为什么同一个转型,在能同时动人事、流程与激励的时候是斜坡,在只能动一样的时候是悬崖。

"探索预算 20%" 这种数字有依据吗,还是拍脑袋?

没有一个普适的最优比例——多臂老虎机的最优探索率依赖于剩余轮数、回报的方差、以及切换成本,这三样每个场景都不同。固定比例的价值不在于它最优,在于它把一个会被临时压力吃掉的东西变成了默认值。真正该较真的不是比例的数值,是有没有单独的考核口径和明确的降温时点;没有这两样,写多少比例都会在第一个紧张的季度归零。

怎么区分"我在谷底,坚持一下就好"和"这个方向根本是错的"?

本期的机制帮不上忙——景观的形状在事后才看得清,这是它诚实的地方。能做的是事前把判据写死:启动时就写下预期的谷底深度与时长,以及一个反驳条件(如果到 X 时间还没出现 Y 迹象,就撤)。区别不在于你能否预知,在于撤退的标准是在谷底之前定的还是在谷底之中定的——在谷底之中,任何标准都会被当时的痛苦重写。

降低 K 有代价吗?把所有东西都解耦是不是最优?

有,而且不小。降 K 意味着放弃部件之间的协同——高度定制、深度耦合的方案在自己那个峰上往往比模块化方案更高。所以这是一笔明确的交易:用峰的高度换取地形的平滑。当环境稳定、目标明确时,耦合的方案更划算;当地形本身会动、需要频繁重找方向时,平滑才值钱。把它当成一条永远正确的原则,就会在该深耕的时候一直在拆积木。

"崎岖度是地形和走法的联合属性",这句话有什么可操作的含义?

它意味着卡住的时候有一个常被忽略的第三选项。除了更努力(同一走法)和跳谷底(承受代价),还可以换邻域:换工具、换协作方式、引入一个能一次改动多个部件的手段(比如遗传算法里的重组,或者组织里的"整建制换一个团队来做")。换邻域的成本通常远低于跳谷,但它需要先意识到"一步能改什么"是个可以设计的东西,而不是给定的约束。

延伸阅读(Further Reading)