TreeHeap 的代数 Decoder:internal state 不是没信息,而是需要正确读法

SPR-032 做了一个概率读取核实验。

它证明:

从 arr[1] 开始,用 stop/left/right 走到目标节点,这件事可以学会。

但是它也暴露了一个问题:

叶子节点很好读。
内部节点不好读。

当时我把问题说成:

internal node state 没有学好。

这个说法不够准确。

你指出了更关键的一点:

internal node state 可能已经编码了信息,
只是它像 hash / latent vector 一样,不能直接用眼睛看懂。
我们需要 decoder。

而且 TreeHeap 不是普通的训练数据集合。它应该是一个带数论和代数结构的集合。

所以 decoder 不应该只有:

learned decoder = 训练一个 MLP 去猜

还应该有:

algebraic decoder = 从 TreeHeap 的数学结构直接读

SPR-033 就是为了验证这件事。

两种 decoder

我们先把 decoder 分成两类。

第一类是学习 decoder:

h_internal -> MLP -> label

比如:

internal state -> checksum bucket
internal state -> phrase vector
internal state -> syntax label

SPR-032 里的 checksum decoder 属于这一类。

第二类是代数 decoder:

h_internal -> projection / decompose / mod / mirror

它不是靠训练猜出来的,而是由 TreeHeap 的结构定义出来的。

类比十进制数字:

321

你不需要训练一个神经网络去知道百位是 3、十位是 2、个位是 1

因为十进制系统自带 decoder:

hundreds decoder -> 3
tens decoder     -> 2
ones decoder     -> 1

TreeHeap 也应该类似。

如果 TreeHeap 有路径、地址、子堆、左右对称,那么它应该自带一些读法:

left-subheap decoder
right-subheap decoder
path projection decoder
mod residue decoder
mirror/conjugate decoder

这就是 SPR-033 的核心。

实验设计

这次先不做语言,不做 WMT。

我们先做纯数学 toy。

定义一个有限域:

field = Z_1000003

也就是所有计算都在一个大质数取模的数论空间里进行。

TreeHeap 设置:

max_len = 8
channel_dim = 16
vocab = 257
samples = 5000

每个 token id 映射到一个确定的 primitive vector:

token\_id \rightarrow v_{token} \in Z_p^{16}

然后把 token 写入叶子槽位:

state[leaf_slot] = v_token

一个 internal node state 就是它覆盖的叶子槽位集合。

注意,这个 state 对人眼来说不好懂。

它不是:

[cat, run, fish]

而是:

Z_p 里面的一堆高维向量

所以它像 hash,或者说像 latent state。

问题是:

能不能用 TreeHeap 的代数 decoder 把它读出来?

这次测哪些 decoder?

1. Projection Decoder

投影 decoder:

project(H, node)

意思是:

只保留某个 node 覆盖的子堆槽位。

比如:

node = 2
span = [0, 4]

那就只读左半棵子树。

2. Decompose Decoder

分解 decoder:

decompose(H, node) -> left_state, right_state

然后检查:

compose(left_state, right_state) == project(H, node)

这就是 TreeHeap 的 compose/decompose 对偶。

3. Mod Residue Decoder

取模 decoder:

residue(H, m)

比如 m = 2

偶数地址槽位聚合到 bucket 0
奇数地址槽位聚合到 bucket 1

这就是你之前说的取模思想。

它不是普通数组上的取模,而是:

TreeHeap 地址空间上的取模。

4. Conjugate / Mirror Decoder

共轭 decoder:

mirror(H)

它把左右结构翻转。

实验检查:

mirror(mirror(H)) == H

这说明 mirror 不是随便改数据,而是一个代数对称操作。

5. Length Decoder

长度 decoder:

norm0(H)

它数有多少个非空叶子槽位。

6. Ordered Slot Decoder

有序槽位 decoder:

decode_ordered_tokens(H)

它不是靠 MLP 猜,而是用 primitive vector 的反查表读出每个槽位的 token。

这类似:

从十进制数字里读取每一位。

实验结果

运行在 io:

host = io.grepcode.cn
samples = 5000
field = Z_1000003

结果:

Metric Value
projection_exact 1.0000
decompose_recompose_exact 1.0000
mirror_involution_exact 1.0000
mod_residue_exact 1.0000
length_decode_exact 1.0000
ordered_token_decode_exact 1.0000
checksum_stability_exact 1.0000

ARA 结论:

M0-DEC-C01 -> supported pilot

一条例子:

tokens = [120, 142, 246, 0, 0, 0, 0, 0]
query_node = 2
span = [0, 4]
decoded_tokens = [120, 142, 246, 0, 0, 0, 0, 0]
subheap_length = 3
subheap_checksum = 914574

这说明:

internal state 虽然不是人眼可读,
但可以通过代数 decoder 读出子堆、长度、顺序槽位、模余数和镜像关系。

这如何修正 SPR-032?

SPR-032 的 internal checksum 表现不好:

128 bucket internal OOD acc = 0.2214
32 bucket internal OOD acc  = 0.4332

当时可能会误解成:

internal node state 没有信息。

SPR-033 说明,这个结论太急了。

更准确应该是:

internal node state 可能有信息,
但 checksum bucket 不是一个自然的 decoder。

TreeHeap 的第一组自然 decoder 应该来自代数:

projection
decompose
mod residue
mirror
length
ordered slot

然后,语言 decoder 应该站在这些代数 decoder 上继续学习。

也就是说:

先有数学读法。
再有语义读法。

和 MLP / Transformer 的区别

MLP hidden state 当然也可以训练 decoder。

Transformer hidden state 也可以训练 probe。

但 TreeHeap 的特点应该是:

它的结构本身规定了一些 decoder。

比如:

左子堆怎么取
右子堆怎么取
路径怎么投影
镜像怎么翻转
地址怎么取模

这些不是从数据里硬学出来的,而是 TreeHeap 的代数地基。

这可能就是 TreeHeap 的存在性之一:

它不是一个完全不同于 ML 的东西。
它仍然可以训练。
但它比 flat hidden state 多了一组结构化、可解释、可组合的数学 decoder。

这次没有证明什么?

没有证明语言语义。

没有证明 WMT 翻译。

没有证明 learned decoder 不需要。

没有证明压缩最优。

没有证明带噪声的神经 encoder 写入后,代数 decoder 仍然稳定。

这次只证明:

在一个有限域/path-address TreeHeap toy 中,
internal state 有一组精确的代数 decoder。

下一步

我认为 SPR-034 应该把 SPR-032 和 SPR-033 接起来。

也就是:

不要再让 internal node 直接预测任意 checksum bucket。

而是让 internal read 先输出代数可读属性:

subheap length
first token
last token
ordered prefix
bag sketch
mod residue
left/right projection

然后再训练 learned decoder:

algebraic decoder output -> semantic decoder

这样 TreeHeap 的路线会更稳:

M0: 数学 decoder
S1: 数据写入后保持 decoder 可读
S2: 在可读子堆上做结构折叠
S3: 翻译/生成

总结

SPR-033 的核心结论是:

internal node state 不是必须直接被人看懂。
它可以是 hash/latent state。
关键是 TreeHeap 必须提供 decoder。

这次证明的是第一组 decoder:

projection
decompose
mod residue
conjugate mirror
length
ordered slot readout

这让我们可以更冷静地看 SPR-032:

读路径已经成立。
内部节点不是没信息。
问题是要为不同问题选择正确 decoder。

这也是下一阶段继续往 S1 走的基础。