21. 2026-10-03 自主工作期(一):记忆时间常数、四臂支架撤除、以及"留不住"

· ★★★★★ 3.9k 字 · 源文件 PROJECT.md 第 4533 行起 · arch memory external

★ 本节按"发现 → 证据 → 含义"写。所有数字都来自本仓库跑次,工具有名有姓。 ★ 完整单篇在 journal/,每篇标题都是结论本身。

#21.1 ★★★★★ ts 是一个"从来没被注意过"的参数,而它决定了她的记忆只有 2 刻

发现过程:用户问"她的时间尺度和人差多少",我去读 core/darlin/tick.py, 看到开头早就写着一条警告:t_interp ≈ 0.5 会让有效记忆只剩约 2 步。

实测(六个检查点,四条训练线):

text
t_interp 中位 0.4996 – 0.5000
time_a ≈ 0.0000   time_b ≈ 0.0000
time_constants() = 10.0 ms = 2.00 刻
而一个回合 = 48 刻 = 240 ms   =>   ★ 覆盖比 4.1%

★ ts 是 LiquidNet.__init__ 的构造标量(不是权重),所以我给它加了 --ts 并接线:

ts实测 tau覆盖比
5(默认 = 她一直以来的状态)1.99 刻★ 4.1%
2510.00 刻20.8%
5019.91 刻41.5%

★ 并加了"每次启动打印生效值 + 覆盖比" —— 因为一个从来不报错的参数, 可以在整个项目里保持默认值而没人注意(教训 112)。

#21.2 ★★★★★ 三个 ts 臂在【严格两副顺序任务】上都学会了"第二步"(推翻旧结论)

独立复评(exp41.evaluate_seq,CPU,ts 各用自己值,n=48):

臂覆盖比右->下 第一步★★ 第二步★★ 条件率 = 整对÷第一步
TSA_ts54.2%100.0%15.6–18.8%16.7%
TSA_ts2520.8%100.0%16.7%16.7%
TSA_ts5041.7%64.6%31.2%★★ 48.4%

★ 机率线:单步 25.0% / 整对 8.3%。 ★ 未见过四对:三臂全部干净 0.0%。

★★★ 结论:"第二步永不可学"被推翻。 ★★ 而且 ts 不是"能不能"的开关,是"多好"的因素 —— ts=50 让第二段更好(条件率 48.4%)但让第一段更不稳(64.6% vs 100%)。

#21.3 ★★★★★ 四臂支架撤除:她学得会,但留不住

任务:单命令接地(她 93.8–100% 的那个)。每臂 1400 步,warmup 400,严格条件。 读法:tools/eval_ground_ckpt.py(固定种子 20261003,CPU,零 GPU,n=48/指令)。

检查点平均格距★★ 到位率
★★★ C_SC_nobar_best(步 1000,进度条【已关】)0.58★★★ 68.8%
C_SC_nobar(最终)2.34★ 0.0%
A_SC_ctrl(β→0.4,什么都没撤)2.12★★ 38.0%
B_SC_nodemo_best(步 1000,无老师)1.69★★ 35.9%
B_SC_nodemo(最终)2.68★ 0.0%
★ 实测地板(不动 / 固定方向 / 最强盲策略)3.000.0%

C 的逐指令(步 1000):上 100%/下 100%/右 75% / 左 0% —— 三条几乎完美,而它最终是全 0%。

★★★★★ 判据 (iv) 的答案不是"哪根支架",而是"稳定性从哪来": 两条撤了【不同】支架的线都崩;唯一守住的是【什么都没撤】的那条。

★★★ 所以核心问题的答案是: "能" —— 她能在一段训练里从后果中学到很高的水平(68.8%,地板 0.8%); 但"留不住"。下一步的问题不是"再撤什么",而是【给她一个保存的机制】。

#21.4 ★★ 机制层面的三条现场

#现场含义
1★★ A(进度条开)与 C(进度条步 600 关)的读数逐点相同到步 700★ 解释了为什么"撤进度条"看不出效果
2★★★ 不能用【损失值】判断"谁在主导训练"★★ 要看【梯度范数】:Adam 对常数缩放免疫。<br>项目已有 --gn-split(教训 129:先看项目里有没有为这个问题写好的工具)
3★★★ --save-best 不是可靠的"最强检查点"选择器★ A 的 best 文件 5.2%,而它末点 38.0%<br>★ 正式读数必须【末点 + 最好点】各自独立复评

#21.5 ★★ 一个设计层面的缺陷:"到位容差"正好等于"一步的位移"

text
ARRIVE_PX = 4.0 px        MOVE_PX = 4.0 px

★ 实测:一个完美的"直线朝目标"策略在 200 回合里到位 0 次(它停在 4.5 px 就不再动了)。 ★ 随机摇杆 0.8%。 ★ 放大到 3 倍(ARRIVE_PX=12)后随机到位率升到 5.8%。

⚠️⚠️⚠️ 更正(2026-10-03,后来的实测推翻了上面第一句的主要证据)

那个"到位 0 次"是【我的控制器有缺陷】造成的,不是环境不可能。 我的策略在某个分量进入容差后把它清零、然后命令摇杆 = 0, 而摇杆为 0 不等于停住 —— 方块会停在动力学决定的位置 (tol=16 时那个位置离目标 21.44 px)。

★★★ 修正后的策略在每一个容差下都是 100.0%。

仍然成立的部分:容差确实太紧 —— 摇杆归零时方块被留在 4.52 px, 而阈值是 4.0 px;半个像素就决定了判定。 而且随机地板确实随容差上升(1.4% → 5.6%)。

★ -> 严重程度是"0.5 px 之差",而不是"不可能到达"。 ★ 详见 journal/CORRECTION_TOWARD_GOAL_WAS_MY_CONTROLLER_BUG.md。

★★ 这又一次印证第 114/115 条那一族: 坏掉的工具的输出,看起来在指控被测对象。这是本会话的第四例。

★★ -> "到达"在这个世界里确实偏"恰好停住",而不只是"走到"。 这会让"撤掉进度条"这一臂的读数被【判定精度】限制。 (可复用的检查:任何带"到达/成功"判定的任务,都要先写下 【容差与动作粒度之比】。)

#21.6 ★ 本会话我自己犯的、并已更正的错误(保留现场)

#错误更正
1★★ 把日志读数当成检查点的能力TSA_ts5 日志报"二步 100%",独立复评 0.0% → 日志假象
2★★★ 我的复评工具取错了字典键(元组 vs 字符串),对任何检查点都报 0%★ 一个恒报 0% 的工具与"她确实不行"在读数上完全一样(教训 115)
3★★ "两个臂只差一个变量"没有逐项核对我按记忆给 B 安了一个它没有的差异,削弱了一个本来干净的结论(教训 123)
4★★ 用损失值代替梯度范数见 §21.4 第 2 条
5★ 哨兵值 -1 用真假值判断-1 在 Python 是真值 → 进度条从第 1 步就被关(连对照臂也一样)(教训 120)
6★★★ 拿一个"命令摇杆 = 0"当停止条件的控制器去测"能不能到达"★ 它停在离目标 21.44 px 处,我把它读成了"环境不可能到达"(教训 135)

★ 这六条里有四条是"我的测量工具本身坏了",而它们的输出看起来都在指控被测对象。


← 返回《PROJECT.md》目录