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 步。
实测(六个检查点,四条训练线):
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% |
| 25 | 10.00 刻 | 20.8% |
| 50 | 19.91 刻 | 41.5% |
★ 并加了"每次启动打印生效值 + 覆盖比" —— 因为一个从来不报错的参数, 可以在整个项目里保持默认值而没人注意(教训 112)。
#21.2 ★★★★★ 三个 ts 臂在【严格两副顺序任务】上都学会了"第二步"(推翻旧结论)
独立复评(exp41.evaluate_seq,CPU,ts 各用自己值,n=48):
| 臂 | 覆盖比 | 右->下 第一步 | ★★ 第二步 | ★★ 条件率 = 整对÷第一步 |
|---|---|---|---|---|
TSA_ts5 | 4.2% | 100.0% | 15.6–18.8% | 16.7% |
TSA_ts25 | 20.8% | 100.0% | 16.7% | 16.7% |
TSA_ts50 | 41.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.00 | 0.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 ★★ 一个设计层面的缺陷:"到位容差"正好等于"一步的位移"
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) |
★ 这六条里有四条是"我的测量工具本身坏了",而它们的输出看起来都在指控被测对象。