TreeHeap 信息抽水机:先形成 H_state,再遮住 token,能否完整 Echo?
这篇文章要回答一个很具体的问题:
一句话已经被 encoder 写进 TreeHeap,形成完整的 (H_{state}) 以后,如果把原始 token 和 leaf 读取通道全部遮住,还能不能只凭 (H_{state}) 把它恢复出来?
答案是:
可以。
token echo = 100%
16-token exact = 100%
但这句话很容易被误解。
这里不是先把输入 token 删除,再要求模型猜出一个从未见过的答案。真正的数据流是:
完整 token
↓ WRITE
Lifting FOLD 逐层上传
↓
H_state = root + 每一层 addressed details
↓
屏蔽全部 leaf/token 读取通道
↓
从 root 开始逐层 UNFOLD
↓
恢复 token
所以,mask 的对象是已经编码完成后的表面读取通道,不是 encoder 的原始输入。
这是 TreeHeap encoder/decoder 是否形成闭合协议的测试。
1. 为什么我们之前会争论 mask
“mask 一个 token”至少有三种完全不同的含义。
1.1 编码前 mask:让模型猜缺失信息
小明 喜欢 吃 [MASK]
↓ encoder
H_state
↓
预测:米饭 / 面条 / 苹果 / 药……
原词在进入 encoder 以前就被删除了。
因此,(H_{state}) 中没有原词的完整信息。模型只能学习条件概率:
$$ P(x_{\mathrm{mask}}\mid x_{\mathrm{visible}}). $$对于“小明喜欢吃 [MASK]”,“米饭”“面条”“苹果”都可能合理,所以不能要求模型一定恢复数据集原句。
这种任务测试语言预测、世界经验和概率补全。它不是本文完成的 Echo。
1.2 编码后 mask:遮住 leaf,只读 H_state
完整句子
↓ encoder
root + details
↓ 删除原始 leaf 读取
decoder
↓
恢复完整句子
原始 token 已经参与 WRITE 和 FOLD,但 decoder 不能直接复制它。
它必须从压缩后的 TreeHeap 状态逆运算回来。本文测试的正是这一种,而且不是只 mask 一个 token,而是同时禁止读取全部 16 个 leaf。
1.3 H_state 内部 mask:删除某层 detail
第三种更加困难:
完整句子
↓ encoder
root + details
↓ 删除目标路径上的某个 detail
不完整 H_state
↓
尝试恢复 token
此时精确逆运算所需的信息真的缺失了。模型必须利用 root、其他尺度和语料中学到的规律,预测缺失 detail 的概率分布。
这是后续的“归纳补全”问题。本文只做了消融诊断,没有宣称它已经解决。
2. 上一版 FOLD 为什么没有把信息抽到高层
上一轮实验使用普通递归 FOLD:
16 leaf
↓
8 parent-1
↓
4 parent-2
↓
2 parent-3
↓
1 root
代码确实算到了 root。但是 decoder 可以为每个输出位置选择读取哪一层。训练最后找到的捷径是:
两个 token
↓
一个 parent-1
↓
直接恢复这两个 token
READ 权重分布为:
parent-1 99.9786%
parent-2 0.0084%
parent-3 0.0051%
root 0.0079%
删除 parent-1,NLL 增加 74.4254;删除 root,变化约为零。
因此,旧实验只证明一个共享 FOLD 可以把两个 token 编进一个 parent。它没有证明信息继续上传。
问题不在于 FOLD 有没有被递归调用,而在于系统缺少类似抽水机的基本规律:
- 哪部分信息必须向上;
- 哪部分细节留在本层;
- decoder 是否必须从高层向下解码;
- 有没有绕开高层的旁路。
3. 抽水机的基本规则:Lifting Scheme
我们采用 lifting scheme,也就是可逆小波中常用的“预测与更新”结构。
设左右子节点状态为 (L) 和 (R),共享 predictor 为 (P_\theta)。
先计算 detail:
$$ D=R-P_\theta(L). $$再计算向上的 parent:
$$ U=L+\frac{1}{2}D. $$其中:
- (D) 是留在当前深度的带地址细节;
- (U) 是唯一允许继续上传的 parent;
- (P_\theta) 是所有节点、所有深度共享的卷积 kernel。
当 (P_\theta(L)=L) 时:
$$ D=R-L, $$$$ U=L+\frac12(R-L)=\frac{L+R}{2}. $$这时可以直观理解为:
U = 左右子树的粗粒度轮廓
D = 左右子树之间的差异
换一个可学习 predictor 后,内部坐标系可以完全不同,但结构规律不变:
两个 child
→ 一个 upward parent
→ 一个 local detail
4. 为什么它可以严格逆运算
decoder 从 (U,D) 恢复 (L,R):
$$ L=U-\frac12D, $$$$ R=D+P_\theta(L). $$代入 FOLD 公式:
$$ U-\frac12D =L+\frac12D-\frac12D =L, $$然后:
$$ D+P_\theta(L) =R-P_\theta(L)+P_\theta(L) =R. $$因此,只要 encoder 和 decoder 使用同一个 (P_\theta),就有:
$$ UNFOLD_\theta(FOLD_\theta(L,R))=(L,R). $$这里有一个重要事实:
(P_\theta) 不需要线性,也不需要自己可逆。
decoder 不是计算 (P_\theta^{-1}),而是在恢复出 (L) 以后,再调用一次同一个 (P_\theta(L))。
这就像两个人使用同一本私人字典。字典内容可以通过数据学习,但写入和读出必须遵守同一个协议。
5. 16 个 token 如何被抽到 root
对于 16 个 leaf,编码过程是:
16 leaf
↓ FOLD
8 parent + 8 detail-1
↓ FOLD
4 parent + 4 detail-2
↓ FOLD
2 parent + 2 detail-3
↓ FOLD
1 root + 1 detail-4
最终状态不是只有 root,而是:
$$ H_{state} =(root,D^{(4)},D^{(3)},D^{(2)},D^{(1)}). $$decoder 不允许跳到 parent-1,也不能读取原始 leaf。它必须从 root 开始:
root + detail-4
↓ UNFOLD
2 个 parent-3
↓ 加 detail-3,再 UNFOLD
4 个 parent-2
↓ 加 detail-2,再 UNFOLD
8 个 parent-1
↓ 加 detail-1,再 UNFOLD
16 个 leaf state
↓ READ
16 个 token
这就是“抽上去,再放下来”。
6. 演绎 Echo 和归纳 Echo 是什么关系
6.1 演绎部分:代数保证闭包
只要保存完整的 root 和 details,无论 (P_\theta) 的参数是什么,FOLD/UNFOLD 都应该闭合。
我们用随机连续向量测试深度 1 到 6 的树:
| 指标 | 结果 |
|---|---|
| 深度 6 最大 FP32 闭包误差 | 3.70e-6 |
| 真实 token state MSE | 3.14e-14 |
| 最大 state 误差 | 2.86e-6 |
这是演绎证据:结果来自公式本身。
6.2 归纳部分:语料决定私人坐标系
如果 Echo 永远精确,单独用 Echo loss 训练 (P_\theta) 是没有意义的。
因为任何 predictor 都会被自己的 UNFOLD 抵消:
$$ UNFOLD_\theta(FOLD_\theta(X))=X. $$所以,这次没有用 Echo 作为训练 loss。训练任务是自然语料 next-token:
观察 16 个真实中文 token
↓ Lifting FOLD
root
↓
预测第 17 个自然出现的 token
其 loss 为:
$$ L_{\mathrm{next}} =-\log P(x_{17}\mid root(x_1,\ldots,x_{16})). $$这给 root 制造了真正的“压力差”:如果 predictor 产生的 root 对语料预测无用,NLL 就不会下降。
实验结果:
| 模型 | 验证 NLL,越低越好 |
|---|---|
| frozen predictor | 8.06377 |
| learned predictor | 8.03468 |
| learned 改善 | 0.02910 |
predictor 的最大梯度范数为 0.50191,参数变化量为 16.13119。语料梯度确实改变了抽水 kernel。
然后,我们使用这个经过归纳学习的 (P_\theta),遮住全部 leaf,只凭训练形成的 (H_{state}) 逆运算:
| Echo 指标 | 结果 |
|---|---|
| token top-1 | 1.0000 |
| 16-token block exact | 1.0000 |
因此,更准确的说法是:
归纳学习决定 TreeHeap 的私人坐标系;演绎闭包保证这个坐标系可以被同一协议读回。
7. 它真的使用 root 和每层 detail 吗
只看 100% Echo 仍然不够。我们继续做因果消融。
7.1 删除 root
| 条件 | token top-1 | block exact |
|---|---|---|
| 完整 H_state | 1.0000 | 1.0000 |
| root 清零 | 0.93042 | 0.0000 |
| root 换成另一句 | 0.93701 | 0.0078125 |
删除 root 后,大多数单词仍可能因为局部 detail 而落在正确 embedding 附近,但没有一个 block 能完整恢复。
所以 root 不是全部细节,却是完整闭合链的一部分。
7.2 打乱不同深度的 detail 地址
| 被换址的 detail | token accuracy 下降 |
|---|---|
| detail-1 | 49.88% |
| detail-2 | 25.00% |
| detail-3 | 12.35% |
| detail-4 | 6.32% |
这个接近逐层减半的规律很好理解:detail-1 直接区分每一对 leaf;越高层的 detail 数量越少,但覆盖范围越大。
7.3 破坏每一层的左右配对
在 next-token 任务中,分别把某一深度的右子树换成其他样本:
| 被破坏的 FOLD 深度 | NLL 增加 |
|---|---|
| depth 1 | +0.03221 |
| depth 2 | +0.03838 |
| depth 3 | +0.04324 |
| depth 4 | +0.05634 |
四个深度都产生损失。
这和旧版 99.9786% 停在 parent-1 的情况不同:新的 root 预测确实依赖完整递归路径。
8. 为什么预注册 Claim 仍然没有全过
我们事先规定:
root 被删除后,Echo token accuracy 至少下降 10%
实际下降是:
6.96%
所以 P3 没有通过,完整 Claim 必须保持 not fully supported。
我们不能看到 block exact 从 100% 降到 0% 后,再偷偷把评价标准从 token accuracy 换成 block exact。
不过可以保留一个更窄的结论:
- lifting FOLD/UNFOLD 已经闭合;
- 全部 leaf 被 mask 后,可以只凭 (H_{state}) 完整 Echo;
- 每层 detail 都是地址敏感且有因果作用的;
- root 对整块闭合和 next-token 都有因果作用;
- 真实语料梯度能够训练 predictor;
- learned predictor 小幅但明确优于 frozen predictor。
9. 高层不需要对应人类命名的语义
Houming818 对这一步提出了一个重要修正:
我们不需要证明 root 一定表示“主题”,parent 一定表示“短语”。这些结构可以通过数据涌现,而且换一种抽水算法,形成的内部意义可能完全不同,解并不唯一。
我们同意这个判断。
假设两个 TreeHeap 使用不同 predictor:
$$ P_{\theta_1},\qquad P_{\theta_2}. $$它们可能形成完全不同的 root/detail 坐标系,但只要分别满足:
$$ UNFOLD_{\theta_1}(FOLD_{\theta_1}(X))=X, $$$$ UNFOLD_{\theta_2}(FOLD_{\theta_2}(X))=X, $$并且都能降低真实任务 loss,它们就可以是两个不同但有效的私人协议。
这类似每个人的笔迹不同,但各自可以读懂自己写下的内容。
因此,我们不应强迫内部节点对应预先定义的主谓宾、词性或人工类别。真正需要验证的是操作意义:
- 能否写入;
- 能否读回;
- 地址是否有因果作用;
- 删除节点是否按结构损坏结果;
- 学习是否改善真实任务;
- 更大的任务是否能站在这个协议上继续训练。
10. 当前边界和下一步
当前已经完成的是:
完整 token
→ 归纳学习过的 lifting encoder
→ H_state
→ mask 全部 leaf
→ 演绎 UNFOLD
→ 100% Echo
还没有完成的是:
完整 token
→ H_state
→ 删除 H_state 中某个必要 detail
→ 根据其他尺度和世界经验补回缺失信息
后一种任务不再是严格逆运算,而是:
$$ P(D_{\mathrm{missing}}\mid root,D_{\mathrm{visible}},context). $$它才是从“私人可逆编码”走向“缺失信息推断”的下一步。
但至少现在,TreeHeap 不再只是执行了几次形式上的递归卷积。我们已经有了一套明确的信息流规则:
FOLD:向上抽取 parent,留下 addressed detail
UNFOLD:从 root 出发,逐层补回 detail
LEARN:真实语料梯度改变 predictor 和内部坐标系
ECHO:遮住全部表面 leaf 后,仍可精确恢复
这是一台已经能运转的信息抽水机。
它是不是语言智能,还远远没有证明;但它终于不再是一根只在第一层取水的管道。
Evidence
ARA 声明:
ara/s1-echo/logic/lifting_information_pump.md
实验代码:
ara/s1-echo/src/s1_lifting_information_pump.py
正式 Evidence:
ara/s1-echo/evidence/s1_lifting_information_pump/main/
SameTime commit:
f17ab3f
本文记录的是可复现实验和当前边界,不是对 TreeHeap 语义、意识或通用智能的完成声明。