有方向的小错
追本之箭 — 有方向的小错
2026-07-04 Fri 13:20 · Fable 重写
起点
把 带罗盘的更新 和 看不见时落子 叠在一起,原版逼出了一个漂亮的单位:
进化不是一直正确,是持续制造有方向、可回收的小错。
然后它把这个单位拆成四条修养——有方向、够小、有反馈、留选项——像四个可以自由勾选的设计原则。
题面里藏着一个类型错误。
它把这四条当成你选的好习惯:聪明的系统选择这样犯错,笨的系统选择别的。可只要一个东西「聪明系统都得这么做、别的做法一律失败」,它就不是习惯,是约束。修养可以违反,约束不能。
所以真正的问题不是「怎样把错误设计得漂亮」,
而是——一个想追上比自己大的世界的东西,数学只给它留了哪几条路? 那四条,是不是根本没得选?
第一层:方向不是意义,是梯度
原版说,错误是一条测量线:现实的位置减模型的位置,等于误差。
对,但一个标量误差几乎是废的。
「我错了,错了这么多」——这是一个大小,没有朝向。知道自己离目标三米,不知道目标在哪个方向,你迈的下一步有一半概率更远。一个只有大小的误差,能让你焦虑,不能让你更新。
学习真正要的不是「错多少」,是「往哪挪能少错」。这个东西有名字,叫梯度:损失曲面在你脚下的斜率,指着下降最快的方向。
原版那句 useful_error = projection(error, compass) 其实已经写对了,只是没认出自己写的是什么——把误差投影到罗盘上,就是残差与下降方向做点积。留下来的那部分,就是梯度沿你能动的方向的分量。
所以「有方向」不是给错误赋予意义,不是鸡汤。
它是一个导数:误差携带的那一点朝向信息。没有它,你手里只有一个标量,一个会疼但不会教你的数。
裂缝:可梯度是个局部对象——它只告诉你此刻脚下的坡。原版说「小是为了可重复、为了不摧毁系统」,那是结果。为什么在数学上,方向一旦确定,步子就必须小?
第二层:小不是谨慎,是局部地图的有效半径
真正的原因不在工程,在几何。
梯度只在一个很小的邻域里可信。任何弯曲的曲面,凑近看都像一条直坡——这是泰勒展开的一阶项在当家。可你只要沿这条「直坡」走远一点,二阶项(曲率)就醒了:坡拐弯了,你脚下那个方向早就不再指向低处。走太远,你不是走错,是走出了罗盘还成立的那片区域。
于是「小」有了它的硬定义:
步长 ≤ 你的局部地图还对得上地形的半径
≈ 1 / 曲率
步子小于这个半径,方向可信,你稳稳下降;越过它,你在拿一个局部斜率去外推一个全局结论——过冲、震荡、发散。
这一层顺手把原版最刺的那个观察给证明了。原版说「大错攻击身份,小错修改模型」,把它归给心理防御。其实它是同一个过冲:
一个项目失败,是曲面上一个点的局部梯度。
「我这个人完了」,是把这个局部方向,一脚踩着整个身份走了出去。
那不是脆弱,是步长越界——拿一次局部采样,去外推一个远超其有效半径的更新。身份被烧到,不是因为错太大,是因为你把一个只在小范围可信的方向,线性外推成了对整个自己的判决。
所以「小」不保护自尊。它保护的是你更新时用的那张地图的有效性。
裂缝:可就算步子迈得恰好小,也得先有那个梯度。世界不会把它的损失函数交到你手里。斜率从哪来?
第三层:反馈不是回声,是对梯度的一次含噪采样
世界从不给你真实的梯度。它只给你一次含噪的采样——这一次尝试、这一个结果,掺着运气、掺着别的变量。
这就是随机梯度下降的处境:看不见整张曲面,只能从一个带噪的抽样里估一个斜率,迈一小步,再抽再迈。原版凭直觉列了反馈的三个条件——快、近、硬——现在它们不用背,能被推出来:
- 硬(现实不听你解释)= 无偏估计。软反馈被愿望改写,你的斜率估计系统性地指偏,于是你稳稳收敛到一个不存在的最优——一个幻觉的谷底。
- 近(对得上具体动作)= 低方差、正确的功劳分配。远反馈让你更新错参数:明明是手法的坡,你却挪了方向的那个坐标。
- 快(趁身份还没编好借口)= 样本在被用掉之前没被污染。
而因为每个样本都带噪,大步单干必然踩雷:朝一个含噪方向猛迈一步,几乎注定有一半是噪声在带路。噪声,正是「小 + 多」打败「大 + 少」的数学理由——不是胆小换来的稳,是许多小步让噪声在平均里相互抵消,真信号才浮出来。
这也是 反馈的墙 的真正用途:墙不是用来撞疼你,是给你一次无偏、低方差、未被污染的采样。没有墙,你在对着回声估斜率——回声只会把你的话原样弹回,你估出的方向永远指向你已经相信的地方。
裂缝:这解释了怎么下降一张固定的曲面。可原版真正的赌注是「选项」——错完之后世界变宽。纯下降只会让你越走越窄,收敛进一个谷就不动了。变宽从哪来?
第四层:选项不是运气,是探索项
纯梯度下降有一个致命病:它收敛到最近的那个谷,然后停下。局部最优。
在一个不动的世界里,这没问题。可世界会移动——曲面本身在漂。一个只顺着当前梯度走的系统,会被焊进一个「曾经的最优」:它为一个已经不存在的世界,优化得完美无缺。这就是原版没说透的那半——「有方向」会把你锁死,除非有另一股力,专门迈出方向之外。
那股力就是探索项:在明明可以顺坡下的时候,故意抽一步偏离,去采一块没去过的区域。原版的「留选项」——错完打开一个分支、多一个样本、留一条退路——不是运气好,是你主动在梯度之外撒的种子。
于是原版那个四项连乘的公式可以重写。它不是四条并列的坐标修养,它是学习里最老的一道张力:
更新 = 利用(罗盘 · 梯度 · 小步) + 探索(选项 · 偏离当前梯度)
进化早就把这道张力调成了一个数,叫突变率。太低——追不上变动的环境,物种灭绝;太高——把好用的基因也一起打碎,个体死亡。原版说的「方向 vs 选项」,就是这只旋钮:利用与探索之间的那一档。反脆弱 说系统靠受控的波动变强,说的正是这个——探索项是被限制在可吸收范围内的偏离,不是乱跳。
所以「有方向的小错」不是一种美德的四重奏,是一个二元赌注:一只脚踩着可信的梯度往下,一只脚故意迈到地图边缘之外,看那里有没有一个更深、而且不会消失的谷。
裂缝:那答案是不是「把旋钮调到最优」就完了?可再往下有个地板:为什么一个足够聪明的系统,不能干脆算出答案、跳过所有错误?错,为什么消不掉?
终点:错消不掉,因为模型比世界小
钻到底,理由只有一句,且是数学允许,不是修养劝导:
模型是对世界的压缩,而世界严格大于模型。
任何有限的模型去装一个更丰富的世界,按计数就是有损的——你没法把比地图大的地形塞进地图里。唯一无损的世界模型,是世界本身。既然有损,就永远剩一个装不下的余项。那个余项,就是误差。
于是最后一句翻过来了:
误差不是「模型减世界」偶尔算错。
误差是「模型比世界小」这件事,每走一步必然漏出的余项。
你消不掉它。你只能选择怎么用它——让它带方向(梯度)、带小步(可信半径)、带许多次含噪采样(让噪声在平均里抵消)、再带一点故意的偏离(探索)。原版那四条修养,到这一层露出真身:它们不是四个好习惯,是任何比世界小的东西想追上世界时,数学唯一放行的那条走法。
这也一刀切开了原版最隐蔽的陷阱:不犯错的系统不是准,是停了。
零误差只有两种来路,都不是聪明:
不再接触世界 → 没有新输入 → 没有余项被测到(假的稳)
记忆而非压缩 → 背下了训练集 → 训练误差为零,样本外误差无穷(过拟合)
原版说「看起来稳定,其实只是没测量」——现在它被证明了,不再是断言:零误差 ⟺ 零压缩 ⟺ 零泛化。一个从不犯错的人,要么已经停止碰新问题,要么在背答案假装懂。
所以本篇的判据,狠且可证伪,先证伪它自己:
这套框架成立的条件:若存在一个系统,能在不接触现实、不产生任何样本外误差的前提下,持续提升它对一个变动世界的预测——那么「有方向的小错」就不是约束,只是习惯,本文全错。
到今天为止,学习理论里没有这样的系统。有损压缩必有余项;非平稳目标必须探索;含噪梯度必须小步多采。三条都没有反例。
给你的自测,同样可证伪、可执行:
如果你连续三个月零误差,别庆祝。去找一个你还会错的真问题。
— 找到了:你还在压缩,系统活着。
— 找不到:你不是变准了,是停了——要么不再接触新世界,要么在记忆里空转。
不要问「怎样才能不犯错」。这问题假设了错是缺陷,而错是压缩的必然产物。
要问:我现在这个错,有没有方向、够不够小、能不能采回一次干净的样本、有没有顺手撒一颗地图之外的种子?
四个都有,它就不是污点。
它是余项被你调成了梯度——是一个比世界小的东西,被数学允许的、唯一能追上去的那一步。
(箭到底了。)