← 博客

一次迁移实验:容量越大,拟合越好,迁移越差

2026年9月26日

English

训练模型,本质上是从结果反推原因:看到一堆数据,找一组参数把它们解释出来。算一个斜坡稳不稳,是正问题;斜坡塌了之后反推它为什么塌,是反问题。

反问题有一个麻烦:同一份数据,可以被很多套参数解释得一样好。参数越多,这种“一样好”就越多。训练分数只能告诉你解释得好不好,不能告诉你落到的是哪一套。而不同的那一套,到了数据之外会表现得完全不同。

所以判断一个模型学没学到东西,唯一靠谱的办法是到数据之外去看。下面是我在记忆模型研究里用的三个检查,以及一个“越大越差”的结果。

实验:共享常识,加每个人自己的东西

我在做的记忆系统分两层。一层是所有人共享的常识:关系本身的规律,比如“依赖”“用来做”“属于”这些关系通常长什么样。另一层是每个用户自己的东西:具体的人、事、物放在哪里。设想是,共享层从大量公开或合成的数据里学一次,然后冻结;新用户来了,只学他自己那一小部分。

为了测这个设想,我用大模型生成了约 1,800 个合成小世界,每个世界有几百条关系、上百个实体。其中约 1,700 个用来训练共享层,另外 89 个完全没见过,留作测试。在每个测试世界里,冻结共享层,只学这个世界自己的实体,再看它补全缺失关系的能力,和“不用共享层、从零学”对比。这是更早的一套语料,不是上一篇那 127 万条关系的审计。

评分用 MRR:正确答案排第一得 1 分,排第二得 1/2,排第三得 1/3,依此类推,取平均,越高越好。

共享层容量训练世界得分新世界得分从零学共享层胜出的新世界
160.480.260.1774 / 89
320.510.250.1763 / 89
640.650.210.1748 / 89
训练分往上,新世界分往下0.10.20.40.6163264共享层容量0.480.510.650.260.250.21训练世界没见过的新世界从零学 0.17

容量翻四倍,训练得分从 0.48 涨到 0.65,新世界得分却从 0.26 跌到 0.21,胜出的世界从 74 个降到 48 个。大的模型把训练世界记得更牢,能带到新世界的东西反而更少。

这就是过拟合,本身不意外。需要说明的是,这是同一套训练配方(没有加正则化)下的三个点;加了正则化的大容量版本还没有测。

值得写的是另一件事:如果只看训练得分,我会选 64;如果只看“比从零学好多少”,我可能对共享层非常满意。真正让结论站住的,是下面三个检查。

检查一:换一个世界测,并且按真实用法测

测试用的世界必须是模型从没见过的,测法也要和上线时一致:共享层冻结,新世界只有少量事实。在训练世界里藏起几条边来测,测的是“记住了没有”;换一个世界测,测的才是“学会了没有”。

量化里是同一回事。在同一段历史里切出来的样本外,只能说明策略没有完全背答案;换一个市场或时期还成立,是与某种机制一致的更强证据,但不是机制的证明。我在自己的量化研究里定过一条规矩:迁移到新市场的,是发现和验证的方法,不是系数。

检查二:和打乱的对照组比

这是我最想推荐的一个检查。做法是把共享层里“哪个矩阵对应哪种关系”随机打乱:数值、尺度、形状都不变,只是关系的身份错位了。然后用同样的流程再测一遍。

容量 16 的结果:真实共享层 0.26,打乱后的共享层 0.22,从零学 0.17。

在这次运行里,相对从零学多出的 0.09 中,0.05 在打乱后依然存在。这与“从训练过、尺度合适的起点开始”这种通用好处一致。剩下的 0.04 是这个比较里对关系身份敏感的部分;没有重复运行或置信区间,它不是干净的因果分解。

如果把整个 0.09 都报成“关系特异”收益,就会是这次运行中观测到的关系敏感差距的约两倍。

量化里的对应做法:把一个信号和同样换手、同样风格暴露的随机信号比,或者在截面上打乱信号再回测。很多看起来像 alpha 的东西,其实是风格暴露或某种结构性的通用收益。先剥离,再谈 alpha,这是我在 alpha 的几何学 里讲的第一道门。

检查三:查泄露,包括对照组自己的泄露

上一篇 24/24 那次审计是后来的另一批世界。那次里还有一个“在同类实体之间循环错位”的对照组,表现好得可疑。查下去才发现,这种错位方式恰好把 40 个隐藏测试项里的 15 个,对应到了训练时见过的项上。对照组相当于提前看到了 37.5% 的答案。

泄露不只出现在模型里,也会出现在对照组、评估脚本和数据切分里。量化里最常见的是用到了未来信息、标签在时间上重叠、只用了活下来的股票。书里的时间序列交叉验证(Purged CV)和回测系统的陷阱专门讲这些。

一个没想到的发现:共用的结构才会迁移

回到那张容量表。我还测了一个量:共享层里不同关系的矩阵彼此有多像。

共享层容量关系矩阵之间的平均相似度新世界比从零学多出的得分
160.670.091
320.440.076
640.270.046

容量小的时候,不同关系被迫共用同一批方向;容量大了,每种关系都能占一块自己的地方。在这三个设置中,测得的共享程度越高,迁移表现越好。一个可能的解释是,关系私有的容量在拟合训练世界的细节;但三个点无法确定因果。

这和我原来的直觉相反。我本来打算加一个约束,让关系矩阵更“正交”、彼此更独立。这组结果警告我这个方向可能不对;但那个约束本身还没有测。

如果用“重复结构可以合并”来说这件事,这个实验提出了一个假说:在要拿去迁移的先验里,共享部分可能是迁移能力的来源。那么“合并”应该理解为只保留一份共享的,而不是把相似的都删掉。这仍然只是三个点上的相关,不是因果证明。

一个诚实的负结果:矩阵相乘不等于多步推理

同一套实验里我还测了多步推理:比如“A 的学生创造了什么”,能不能用“学生”矩阵乘以“创造”矩阵直接算出来?在没见过的路径上,面对全部实体排名时,正序是 0.072,反序是 0.074,正序并不更高。先把候选收窄到第二种关系的尾实体,正序是 0.313,反序是 0.307。观测差距只有 0.007,在这里无法有把握地与噪声区分,也没有实用价值。

所以我的记忆系统里,多步问题走的是已记录的事实路径和写下来的规则,而不是矩阵连乘。这部分在上一篇里写得比较细。

结论

训练得分回答的是“记住了没有”,这三个检查回答的是“学会了没有”:

  1. 换一个没见过的世界,按真实用法测;
  2. 和打乱的对照组比,扣掉通用的好处;
  3. 查泄露,包括对照组自己的泄露。

这些原则可以迁到量化研究:把“世界”换成“市场”,把“关系规律”换成“收益机制”。但市场还多了非平稳性、成本、容量和执行;通过这三道检查,仍然只是证据,不是交易准入。下一篇把第二条推到因子库上:因子去重:11 个因子,只相当于不到 5 个独立信号。