让进化去调学习规则:离“自我改进”有多远?

实验待证

配合仿真与实验探针的假设探索,等待更多证据或边界检验。

ℹ数字花园

🌿 什么是数字花园与思想演进?

遵循 Maggie Appleton 与 Andy Matuschak 的常青笔记理念:这里不是按时间沉底的流水账,而是持续修剪打磨的知识生态。文章按成熟度经历:

  • 🌱 萌芽 (Seedling): 发散灵感、读书摘录、开放猜想
  • 🌿 演进 (Budding): 结构渐明、初步代码推导、积极修正
  • 🌳 常青 (Evergreen): 逻辑闭环、持久经得起检验的基石
  • 🔬 实验待证 (Speculative): 结合沙盒与仿真探针的理论探索
浏览全站数字花园与笔记全景 →

项目代码与全部实验记录:https://github.com/meiluosi/fly-connectome-study(目录 fly-foraging/)

这个项目最早的起点是一个更大的问题:递归式自我改进(RSI)。一个系统如果能改进自己的学习方式,改进之后又更会改进自己,会发生什么?落到一个有真实结构的学习器上,就是果蝇蘑菇体:回路清晰,学习规则可以写出来,连线是真实的。

这一篇做的只是给学习规则的 5 个参数做自动调参,离真正的 RSI 很远,第 7 节说明远在哪里。两个问题:自动调出的规则比手调的好多少?真实连线和随机连线,谁从调参里受益更多?

1. 问题设定:进化什么、怎么进化#

学习规则只留 5 个可调的数,运动常数(转向幅度、先天吸引)和其余部分不动,起点是手调默认值:

参数含义
正预测误差的学习率比预期更好时,突触改多少
负预测误差的学习率比预期更差时,突触改多少(与上一项分开)
遗忘速率突触强度每步向初值回落多快
KC 稀疏度最强的多少比例的 KC 参与编码
价值的转向权重学到的价值对转向的影响有多大

进化的两层循环
进化的两层循环

外层是 OpenAI 风格的进化策略:对 5 个参数的中心点加噪声得到 16 个候选(8 对对偶),每个候选在 12 个训练世界里觅食,按平均净奖励排名,沿排名高的方向移动中心点,共 25 代。训练世界的反转周期取自 1000、2000、3000,一致与冲突世界各半,与评估世界不重叠。连线有三种(真实、打乱、随机稀疏),每种 3 个独立的进化种子,共 9 次进化。

2. 评估设计:用最后一代,不挑最好的#

评估用最后一代的中心点,不挑代、不挑种子。评估世界是 100 个从未用过的世界,三种条件:

  • in-dist:反转周期与训练同分布;
  • fast:反转周期 500,更波动(分布外);
  • stationary:全程不反转(分布外)。

预先登记的判据:进化后减手调默认值的配对差,区间下界大于 0 且提升至少 6,并在 3 个进化种子里至少 2 个满足。

3. 第一次结果#

3.1 提升:小而整齐#

进化后的提升
进化后的提升

in-dist 世界的平均净奖励:

连线手调默认进化后提升
真实+29.6+33.9+4.3
打乱+27.1+32.1+5.0
随机稀疏+33.8+40.7+6.9

方向全为正,多数区间不含 0,但幅度多数没到 +6。按判据,in-dist 上只有随机稀疏成立(3 个里 2 个),真实 1 个,打乱 0 个。当时的读法是“手调默认值已接近最优”,第 4 节之后被推翻。

3.2 连线:真实对打乱、对随机稀疏#

真实 − 打乱:+3.5、+0.5、+1.5,等价或不确定。真实 − 随机稀疏:−2.7、−8.7、−8.8,三次里有两次随机稀疏明显更好。与第 3 篇一致:真实连线没有显出优势。

3.3 参数:进化选了什么#

九次进化的参数
九次进化的参数

  • KC 稀疏度全部从 5% 降到约 2%,九次一致。
  • 负预测误差的学习率大于正的,9 次里有 7 次(后面显示单独做这个不对称没有好处,很可能是其他参数的副产品)。
  • 价值的转向权重略降。

3.4 异常:没有一次进化选择遗忘#

预先写下的猜想是:世界波动越快,遗忘越有益,因为奖励会反转。结果 9 次进化的遗忘速率全部停在搜索下界(1e-5)。分布外结果也反常:提升在更波动的 fast 世界里最小(−0.5 到 +2),在不反转的世界里最大(+4 到 +9)。

初稿的解释是“奖励反转时学得快比遗忘重要,负误差本来就能压掉旧价值”,当时标注为未检验。

4. 验证:手动扫描遗忘#

预先登记(fly-foraging/forget/PREREG_forget.md):不让进化去找,直接扫描遗忘速率,同时扫学习速度和正负误差的不对称,100 个全新世界(种子 6000–6099),三种条件。预测:遗忘不帮忙,学得快在更波动的世界里受益最大,不对称略好。

遗忘扫描
遗忘扫描

预测几乎全部错误:

  • 遗忘在波动的世界里明显有帮助。 fast 世界里遗忘速率 3e-3、1e-2 把净奖励从 +5.2 提到 +17.4、+17.7(+12,区间 [+9.9, +14.4]、[+9.8, +15.0]);反转周期 1000 到 3000 的世界里 1e-3、3e-3 提升约 +10。登记的两个主结论:1e-2 对 0 为“更好”,1e-3 对 0 为 +3.5,区间 [+1.6, +5.4],低于界限 4,判“不确定”。
  • 在不反转的世界里遗忘伤害很大。 1e-3 掉 12.8,1e-2 掉 40.7,3e-2 掉 54.8。
  • 在进化结果上强制加遗忘,结论相同。 3 个进化结果加 1e-3 遗忘,in-dist 再提升 +8 到 +10,比进化自己找到的 +4 到 +7 还大。
  • “学得快更重要”只对一半。 学习率调低(0.25 倍)在三种世界里都变差;调高(2 倍、4 倍)没有额外好处,默认值已在学习率的平台上。
  • “负误差学得快”没有被支持。 单独加倍或翻四倍负误差学习率,fast 世界里无差别,不反转世界里更差或不确定。

结论:遗忘在波动世界里有益、在稳定世界里有害,与最初的猜想一致;失败的是进化,它没有机会找到这个。

5. 归因:进化为什么找不到#

遗忘速率的编码是 decay = 10^(−5 + 3.5·sigmoid(θ))。手调默认值是“不遗忘”,编码后起点 θ = −6,落在 sigmoid 的平坦尾部:θ 变一个单位,遗忘速率只变约 2×10⁻⁷,候选之间没有可分辨的奖励差异。要走到有效的 1e-3 需要 θ ≈ +0.3,距起点 6.3,而进化每代的步长只有零点几。第一次进化的历史印证了这点:9 次进化中遗忘参数 θ 始终在 −6 附近游走(−5.6 到 −6.3),没有方向。

所以“9 次进化都没选遗忘”是搜索空间的参数化造成的,不是遗忘没用。这个缺陷在登记时没有发现,审查也没有抓到。

6. 重跑:修好起点之后的进化#

预先登记(fly-foraging/meta2/PREREG_meta2.md):只改一处,把遗忘参数的初始 θ 从 −6 挪到 0(遗忘速率约 5.6e-4,sigmoid 中段),其余与第一次完全相同。9 次进化,评估用全新的 100 个世界(种子 6100–6199)。

重跑的提升
重跑的提升

  • 9 次进化全部选了遗忘: 最终遗忘速率 1.2e-3 到 2.2e-3,印证了归因。
  • in-dist 提升从 +4 到 +7 变成 +14 到 +21: 三种连线、三个种子共 9 个,全部满足“下界大于 0 且提升至少 6”;与第一次进化相比,每个种子又多 +8 到 +15。
  • fast 世界提升 +7 到 +11。
  • stationary 世界变差 8 到 15。 训练世界全是会反转的,进化学会了遗忘,在从不反转的世界里要付代价。
  • 连线结论不变: 真实 − 打乱为 +2.8、−0.9、−1.0(区间都在 ±6 内,等价);真实 − 随机稀疏为 −5.2、−8.9、−4.3,随机稀疏方向一致地更好,但按判据只有 1 个种子达到“明显更好”。

所以“进化只给小提升”是第一次进化被卡住的结果。解锁之后,自动调参在这个设置里的提升约为第一次的 3 倍,代价也清楚:在训练时没见过的稳定世界里变差。

7. 反思:离“自我改进”有多远#

RSI 指系统改进自己,改进之后改进自己的能力也变强,如此循环。这里至少差三层:

  1. 改的只是 5 个数。 规则的形式、回路的结构、气味的编码都没有动,外层没有机会发现新的学习规则。
  2. 外层本身是固定的。 种群、步长、代数都是人定的,外层不会被改进,只有一层,谈不上递归。
  3. 外层的搜索空间决定它能找到什么。 第 5、6 节是最直接的例子:同一个进化策略,只因为遗忘参数的起点不同,提升从 +4 到 +7 变成 +14 到 +21。一个自我改进的系统,先要保证它自己的改进器没有盲区。

8. 局限#

  • 只有 3 个进化种子,区间只对世界做自助法,不含进化本身的方差。
  • 进化目标是训练世界的平均奖励,换一组世界,最优参数可能不同;stationary 世界的下降已说明这一点。
  • 手调默认值是在调参世界上选的,不是任意起点。
  • 重跑的起点 θ = 0 本身带有遗忘,是有意的设计选择;没有测试其他起点是否也走到同一处。
  • 只进化 5 个参数,没有探索结构。

9. 下一篇#

第 6 篇:旅行商三轮。


文件位置:fly-foraging/PREREG_meta.md、RESULTS_meta.md、forget/(遗忘扫描)、meta2/(重跑)、forage2.py、evolve.py。图由 blog/figures/make_figures.py 生成。

文章概念网络

从章节进入正文概念。实线表示所属层级,虚线连接跨章节重复出现的概念,不代表因果关系。

62 / 66 个节点 · 正文标记术语与关键词概念

让进化去调学习规则:离“自我改进”有多远?同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept让进化去调学习规则:离“自我改进”有多远?让进化去调学习规则:离“自我改进”有多远?fly-foraging/fly-foraging/递归式自我改进(RSI)递归式自我改进(RSI)1. 问题设定:进化什么、怎么进化1. 问题设定:进化什么、怎么进化进化的两层循环进化的两层循环2. 评估设计:用最后一代,不挑最好的2. 评估设计:用最后一代,不挑最好的in-distin-distfastfaststationarystationary3. 第一次结果3. 第一次结果3.1 提升:小而整齐3.1 提升:小而整齐3.2 连线:真实对打乱、对随机稀疏3.2 连线:真实对打乱、对随机稀疏3.3 参数:进化选了什么3.3 参数:进化选了什么3.4 异常:没有一次进化选择遗忘3.4 异常:没有一次进化选择遗忘4. 验证:手动扫描遗忘4. 验证:手动扫描遗忘fly-foraging/forget/PREREGforget.mdfly-foraging/forget/PREREGforget.md遗忘扫描遗忘扫描预测几乎全部错误预测几乎全部错误遗忘在波动的世界里明显有帮助遗忘在波动的世界里明显有帮助在不反转的世界里遗忘伤害很大在不反转的世界里遗忘伤害很大在进化结果上强制加遗忘,结论相同在进化结果上强制加遗忘,结论相同“学得快更重要”只对一半“学得快更重要”只对一半“负误差学得快”没有被支持“负误差学得快”没有被支持5. 归因:进化为什么找不到5. 归因:进化为什么找不到6. 重跑:修好起点之后的进化6. 重跑:修好起点之后的进化fly-foraging/meta2/PREREGmeta2.mdfly-foraging/meta2/PREREGmeta2.md重跑的提升重跑的提升9 次进化全部选了遗忘9 次进化全部选了遗忘in-dist 提升从 +4 到 +7 变成 +14 到 +21in-dist 提升从 +4 到 +7 变成 +14 到 +21fast 世界提升 +7 到 +11fast 世界提升 +7 到 +11stationary 世界变差 8 到 15stationary 世界变差 8 到 15连线结论不变连线结论不变7. 反思:离“自我改进”有多远7. 反思:离“自我改进”有多远改的只是 5 个数改的只是 5 个数外层本身是固定的外层本身是固定的外层的搜索空间决定它能找到什么外层的搜索空间决定它能找到什么8. 局限8. 局限9. 下一篇9. 下一篇fly-foraging/PREREGmeta.mdfly-foraging/PREREGmeta.mdRESULTSmeta.mdRESULTSmeta.mdforget/forget/meta2/meta2/forage2.pyforage2.pyevolve.pyevolve.pyblog/figures/makefigures.pyblog/figures/makefigures.pyRSIRSI自我改进自我改进实验实验奖励奖励策略策略评估评估评估评估奖励奖励奖励奖励评估评估自我改进自我改进RSIRSI策略策略种群种群奖励奖励探索探索选择选择
让进化去调学习规则:离“自我改进”有多远?

让进化去调学习规则:离“自我改进”有多远?

回到原文 ↗
BIBTEX

引用本文

@article{2026-10-21-fly-connectome-05-meta-learning,
  author  = {枫语},
  title   = {让进化去调学习规则:离“自我改进”有多远?},
  journal = {枫语},
  year    = {2026},
  month   = {oct},
  url     = {https://meiluosi.github.io/posts/2026-10-21-fly-connectome-05-meta-learning/}
}
🌐

本篇知识星丛与滑动侧栈

让进化去调学习规则:离“自我改进”有多远? 当前主轴

搜索

正在载入索引…