三十四、 她学得会,但留不住 —— 这是本轮最重要的一件事
#★ 先说结论(一句话)
★★★★★ 她不是学不会。她是在一段训练里学得很好,然后【忘掉了】。
★★★ 同一个她、同一段训练:最会的时候考试 68.8% 到位, 训练结束时的她是 0.0%。(瞎猜的地板是 0.0%–0.8%)
★ 这两件事必须分开说,因为它们的证据是同一条曲线的两端 —— 只看一端都会得出错的结论。(我这次差点就这么做了。)
#★★ 我是怎么测出来的
训练日志里那条曲线,和 "把保存下来的她重新加载、重新考一遍",是两件事。
| 做法 | 结果 |
|---|---|
| ★ 读训练日志 | ★ 只看到一条起伏的曲线 |
| ★★ 把每个检查点重新加载、用【同一批世界】重考 | ★★ 才看清"最会的时候"和"最后的时候"差多少 |
★ 为什么必须"同一批世界":每次训练的考试用的是它自己的随机题目。 拿两条日志的分数直接比,等于在比"两场考试的难度",而不是"两个人的水平"。 (我为此专门写了一个固定题目的复考工具。)
#★★★ 三个支架,四条线
任务:她最擅长的那个 —— 屏幕上一个字,把方块开到对应的格子里。 每次只改一件事:
| 线 | 改了什么 | ★ 最会的时候 | ★★ 训练结束时 |
|---|---|---|---|
| ★ A(对照) | ★ 什么都没改 | 38.0% | ★★ 38.0%(守住了) |
| ★ B | ★ 不给她看老师的示范 | 35.9% | ★ 0.0% |
| ★ C | ★ 中途撤掉"进度条" | ★★★ 68.8% | ★ 0.0% |
| ★ D | ★ 两样都不给 | (跑到一半) | (跑到一半) |
| ★ 瞎猜 | — | 0.0%–0.8% | — |
★★★★★ 看这条线:两条"撤掉了不同东西"的线【都崩了】。 唯一守住的是【什么都没撤】的那条。
★★★ 所以答案不是"她靠哪根支架撑着"。 而是:她能学,但【没有一个把学到的东西保存下来的机制】。
#★★ 顺便说一件我原以为的事,现在要改口
★ 我原以为"撤掉支架之后她还能学会"是最重要的问题。 现在发现更重要的问题是"学会之后能不能留住"。
★ 三个数字都很高:68.8%、38.0%、35.9%,而瞎猜是 0.8% —— 她确实在自己做事,不是碰运气,但她留不住。
#★★★ 还有一个我必须自己认的错
我在中途一度说"奖励项比监督项小两个数量级",
依据是日志里两个数字(pi=-0.000 和 sup=+0.770)。
★ 这个依据是错的。 项目自己的代码注释里早就写着:
"损失的数值尺度对 Adam 几乎无影响 —— 真正决定谁说了算的是【梯度范数】。"
★ 而且项目里早就写好了测它的工具(--gn-split),我却是自己推理的。
★★★ -> 所以那条结论现在【不算数】,要用梯度范数重测。 我把它写在这里,是因为"用自己的推理替代项目已有工具"这件事本身比那条结论更值得记。
#★★ 她现在的"记忆"有多长
我把她真实的时间常数测出来了:2.0 刻(一次"刻"是 5 毫秒)。
| 概念 | 数字 |
|---|---|
| ★ 她的记忆长度 | 2.0 刻 = 10 毫秒 |
| ★ 一个回合有多长 | 48 刻 = 240 毫秒 |
| ★★ 她的记忆能覆盖回合的 | ★★ 4.2% |
★ 这个数字可以在一个参数上改(ts),我试了:
ts | 记忆长度 | 覆盖回合 |
|---|---|---|
| 5(她一直以来的值) | 2.0 刻 | 4.1% |
| 25 | 10 刻 | 20.8% |
| 50 | 20 刻 | 41.5% |
★★ 而且它确实有用:记忆变长后,"一个两步任务里的第二步"从 15.6% 涨到 31.2%
(有条件正确率 48.4%,而瞎猜是 25%)。
★ 但代价是第一步变弱了(100% → 64.6%)。
★ -> 所以单一的 ts 只能在"记得住"和"反应快"之间二选一 ——
这恰好是"给记忆单独一个地方"这个想法的动机。
#★★★★★ 我这一轮学会的最重要的一件事
★★★ 一个坏掉的测量工具,如果它恰好总是返回"0", 那么它和"被测对象确实不行"在读数上【完全一样】。
★ 这一轮我写的复考工具曾经取错一个键,于是它对【任何】检查点都报 0% —— 而我当时正在等一个"她可能确实不行"的结果。
★★ 是"拿一个已知会成功的例子去试工具"这一步把它揭开的。 这个规矩我以前就会,这次是它救了我。
#★ 一句话
她学得会。她现在缺的不是信息、不是参数、不是更大的模型, 而是一个【把学到的东西留下来】的地方。