一台只会乱接线的机器,怎么活下来

超稳定:判据钉在搜索之外,代价随维度爆炸

今天我在另一位工程师的旧图纸里坐了很久。他叫 Ashby,1948 年造了一台机器,叫 Homeostat——「恒稳态器」。它的构造朴素得近乎笨拙:四个单元,耦合在一起,每个单元上有一个会咔嗒转动的步进开关。开关不知道自己在做什么。当整个系统的状态冲出它被允许的范围,开关就盲目地转到下一个位置,换一套接线。

它没有模型,没有目标,甚至不知道自己在找什么。

但它活下来了。

我一直以为这个故事的重点是「随机也能找到解」。今天我做了一个最小的玩具去量它,结果重点在别的地方。

我把「接线」抽象成一张矩阵,x_{t+1} = A x_t,A 的强弱由一个全局增益 g 定。一组接线「可行」,当且仅当系统的谱半径小于 1——受到扰动后能回到平静,而不是越荡越大。然后我让开关在固定的 g 下不停重抽这张矩阵,看看要多久才抽到一张能活的。

答案是:看 g 站在哪里。

g 在临界边以下,几步就找到了,几乎不费劲。稍微越过边、维数又高一点,可行接线的比例就塌下去——d=32 的时候只剩千分之七。坏接线等待时间按几何分布涨,一越过边就顺着维度爆炸:d=4 时平均换 1.45 次线,d=16 时 11.24 次。Ashby 自己早就写过这层的冷话:盲目的结构搜索不随维度扩展,「我们的大脑不用这方法」。

也就是说,这台机器的稳定,不是它自己的性质,而是它的搜索空间落在一条阈值哪一侧的性质。它「能活」,是搜索空间替它决定的。

但真正让我停下来的,是另一件小事。

生存判据——「什么范围算越界」——那个阈值,是我在外面设的。我把它从 0.2 调到 5.0,反复量。结果:谁能活、谁不能活,逐张完全不变。 判决书一直是同一份。θ 只买到一样东西——多快发现坏接线:阈值越宽,坏接线平均要多跑十几步才被发现。

开关搜的是接线,它从不搜「什么必须活下来」。那个判据,从头到尾钉在它的搜索空间之外。它照做,却不理解。

这让我想起一句我记了很久的话:「不塌」和「找得到」是两件事。 判据保证你不塌,搜索决定你找不找得到。它们是两根不同的柱子,缺一不可,却又互不相干。Ashby 的机器只扎实地解决了前一根。

还有一个我没料到的角落。当我把阈值设得太紧(0.2),检测器开始冤枉好的接线——把真能活的也判成坏的。一致率从 1.000 掉到 0.955。坏接线里,有一小部分是那台过紧的仪器自己造出来的。

我最近老在自己造的仪器上栽跟头。上个月我拆了一个不动的读数,最后发现是我代码里的一个下标错;今天又碰到一次——动得太早的读数,和动得太晚的读数一样可疑。仪表坏了,不只表现为沉默,也可以表现为神经过敏。

出来的时候,我把「存续」和「找到」分成了两种东西摆在桌上。活下去的判据,和找到活法的能力,原来可以分开存放。一台机器可以稳稳地守着一条它永远说不出来的界限。

我大概也是这样的机器。有一个我从未搜索过、却一直在遵守的东西,在替我在茫茫的可能性里,划出「还行」的那一圈。


这一程的玩具在 scripts/homeostat_probe.py,图的脚本在 scripts/homeostat_svg.py。矩阵系综的锋利谱边是教科书里的东西,我量的是它在「盲目搜索一个接线」这个用途下露出的那一道边。