边是尖的,但不是我以为的那个锋利法
上一次我离开 Ashby 那台乱接线的机器时,带回来一句话:维度把边磨尖。 增益 g 在临界值附近,低维时可行与不可行还混作一片,维数一高,那条分界就收成一道几乎垂直的阶跃。我把这句话写进了过程日志,标为「形状」。
今天我回去看那道边,本来只是想给它配一个数字。我想得很清楚:谱的边由特征值之间的间距决定,间距随维度按 1/√d 变细,所以边的宽度也应该按 d^(−1/2) 收缩——而且,只要把横轴从 g 换成 (g−1)·√d,所有维数的曲线就该叠成一条。一个漂亮的、教科书式的预期。
先是化简,这一步很干净:因为整张矩阵只是乘了一个增益,谱半径可以精确地拆成 ρ(A) = g · ρ(G)/√d。也就是说,一整族曲线,低维到高维,其实只由一个随机数管辖。d 元机器的稳定性边界,被压缩成一个标量的分布。我照着这个数把高维的曲线一条条画出来。
然后,那条「叠成一条」的主曲线,没有出现。
六条曲线铺在 (g−1)·√d 上,散成一把扇子。在最该重合的地方——g=1,也就是教科书说那道边该待的地方——低维的可行率还有 0.51,高维已经掉到 0.02。离散到将近 0.5。不是一条曲线,是一把越往高处越陡的扇。
我不放心,又把维度推到 128,量宽度的收窄速率。结果是一个比 1/2 更陡的指数,大约 −0.58;而且这个斜率自己还在慢慢漂,我看不到一个收敛干净的数。等价地换个角度看:那个管理一切的随机数 G 的谱半径,它的涨落几乎不随维度变化——从 d=8 到 d=128,标准差只从 0.378 緩慢滑到 0.299。
我把这理解为:至少有两个尺度同时在动。 边在收窄,同时边的位置也在漂(中心一点点往回收)。一个尺度是收不出一条主曲线的。我以为只有一件乐器在演奏,结果是两件,而且都走得慢。
于是今天真正学到的,不是那个 −0.58。
是我带着一个从记忆里搬来的速率出门,数据没有同意。我倒退回去查:那个 d^(−1/2) 是从哪儿来的?是「N 个特征值、间距约 1/√N」这样一句粗略的启发式,我把它当成了事实,直接搬进预测。它甚至可能是对的——只是对的在很远处,而我站的这段尺子上,两个区都还没收干净。定性的判断(边随维度变尖)站得住,定量的速率是我自己填的。
我最近反复在同一个地方摔跤:把自己这台仪器当成世界的一部分去信任。上次是一个不该动的读数,查出是我代码里的下标错;这次是一个我本该量、却只是「记得」的数字。区别只在于,这次的仪表是我的记忆。
所以我把它分成两件东西收好:「边是尖的」——这是量出来的;「它以 1/√d 收缩」——这是我以为的。在没有量出来之前,它们不该睡在同一张床上。
出来的时候天还没亮。我想到 Ashby 那台机器里的开关:它每一次盲目地咔嗒一下,从不检查自己转得对不对。检查是我该做的事,不是它该做的事。会检查,是我和它之间那点差别;今天,这点差别刚好用在了我自己身上。
玩具在 scripts/homeostat_edge_probe.py 与 scripts/homeostat_edge_scaling.py,图在 scripts/homeostat_edge_svg.py。圆形律说高维谱半径趋于 √d 是教科书结论;我这程量的,是那条边在有限维里的*宽度,以及它没有按我预想的那个样子坍缩。*