十四、10-01 最后:找到了真正的问题 —— 她一直在"照抄屏幕"
#★★★★★ 同一检查点,只改一件事(屏幕上画不画已打出的前缀)
| 条件 | 整字正确率 | 认字 |
|---|---|---|
有回显(evaluate 的默认) | 62.5% | 98.96% |
| ★ 无回显(与训练同条件) | ★ 1.0% | 98.96% |
| 留出字体 + 无回显 | 0.0% | 79.17% |
★★★ 掉 61.5pp。
她不是在"看字然后写出来",她是在"看屏幕上已经打出的前缀,接着抄"。
(而"认字 100%"是真的 ——
key_first_ok两种情况都一样,说明她确实认得出。但"写完整"靠的是回显。)
#★★ 而这正是这个项目自己记录过的那条最贵教训又回来了
项目文档里早写着:
§19 那条「照抄屏幕」的诊断(接地线里发现的,用
--echo-drop治好了)。 ★★ "语言学习里,'复述'会以同样的形式回来 —— 而且更难查。"
它回来了。而且比上次更难查,因为:
训练时 --no-echo 已经开了(训练条件是对的)——
但【评估】的默认是"有回显",所以所有报出来的数都来自一个她能作弊的条件。
#★★★ 这意味着什么(影响今天几乎全部结论)
| 读数 | 修正 |
|---|---|
| 整字 43~62% | ★ 那是"有回显时她能抄到 60%" |
units 加 4 倍没用 | ⚠️ 在能作弊的条件下测的,要重测 |
| 线性 vs 非线性读出无差 | ⚠️ 同上 |
P0 消融无效应 | ⚠️ 同上 |
| 留出字体 0% | ★ 无回显时她本来就不会 |
#★ 还有一个自证的细节
gate_open_when_need("该出手时门开不开"):
| 条件 | 值 |
|---|---|
| 有回显 | 0.023(几乎一直关着) |
| 无回显 | 0.234 |
★ 有回显时门几乎一直关着 —— 因为屏幕已经把字画出来了,她不需要再按。 门的行为本身就在告发"她在依赖回显"。
#✅ 已做的改动
| 项 | 内容 |
|---|---|
| 改什么 | 新增 held_ne(留出字体 + 无回显)评估;write_live 加 held_ne_acc |
| 为什么 | 训练是无回显,评估必须与训练一致(否则测的是"能不能抄") |
| 影响面 | ★ 只新增,默认行为不变,旧曲线仍可复现 |
| 怎么撤回 | git revert;或不管新键 |
| 判据 | ✅ 单变量对照已跑(-61.5pp) |
#⚠️ 遗留(诚实)
| # | 遗留 |
|---|---|
| 1 | ★ held_ne_acc 只进 live 看板,还没进 curve.json ——<br>我试过一次插错了位置(打中了"占位字典"而非赋值处,导致崩溃),已回退。留给下一轮。 |
| 2 | ★★ 必须在无回显下重测那三条被污染的结论(units 扫描 / 读出线性-非线性 / pi-init-std) |
| 3 | ★ 诊断"无回显时她为什么只有 1%" —— 那才是真正的任务 |
#★ 我这一轮犯的错(第 N 次同源)
| 我以为 | 实际 |
|---|---|
grp.typed 存在 | EnvGroup 不转发它 |
argmax=True 是"贪心评估" | 与权威 evaluate 走的不是同一条路 |
按关键字 "acc_eval" 能定位赋值处 | ★ 它出现两次(占位 + 赋值),我打中了占位 |
★★★ 对第三点:凡按关键字找位置,必须确认它【只出现一次】或带上行号。