TreeHeap Encoder:世界观察者如何把规律写进树

我们需要把问题退回更前面。

之前讨论了很多:

route 怎么走
root 是不是 word bag
semantic prefix 能不能支持推理
compact state 为什么掉精度

这些问题都重要。

但它们有一个共同前提:

H_tree 已经存在。

也就是说,我们默认已经有一个 TreeHeap state。

可是现在真正的问题是:

原始数据到底如何被 encoder 写成 TreeHeap?

如果 encoder 写错了,后面的 route、read、collapse、decode 都是在读错误状态。

所以 SPR-047 的核心不是 route。

核心是:

Encode_Theta(raw observations) -> H_tree

这个 encoder 才是 TreeHeap 的世界观察者。

不能靠哲学把数据压进树

我们可以在文章里说:

阿莫西林 -> 药品 -> 可摄入对象
米饭     -> 食物 -> 可摄入对象

这个说法很顺。

但它不是学习。

如果这些前缀是人手写进去的,那么 proof 只能证明:

TreeHeap 可以使用已知语义前缀。

它不能证明:

TreeHeap 可以从观察中发现语义前缀。

这就是当前的核心断点。

我们不能用哲学推理替代 encoder。

必须让 encoder 通过数据和 loss 自己学习:

哪些东西应该靠近;
哪些东西应该合并;
哪些东西应该形成 internal node;
哪些 internal node 有迁移价值。

Encoder 是世界观察者

我现在把 encoder 定义成:

世界观察者 = 看见样本流,并把可复用规律排进 TreeHeap 的系统。

它不是简单 token embedding。

它要做几件事:

1. 观察 token / span / relation
2. 给候选 placement 打分
3. 决定哪些东西应该合并
4. 生成 internal node state
5. 保持 echo 可读
6. 让有共同规律的对象共享 prefix

最小形式可以写成:

tokens / spans / observations
  -> token states
  -> candidate placement scores
  -> soft TreeHeap write
  -> soft compose
  -> H_tree

其中:

H_tree = 当前样本的运行时 TreeHeap state
Theta  = encoder / compose / route / read 的可学习参数

排序规律从哪里来

TreeHeap encoder 不会凭空知道排序规律。

它必须被目标函数选择。

我当前的假设是:

TreeHeap 排序规律来自可压缩性。

也就是:

如果一组 token / subheap 放在一起以后,
能更好地重构、预测、替换、迁移、减少规则数量,
那么它们应该靠近。

例如:

eat rice
eat noodle
eat apple
cook rice
cook noodle
cook apple

如果没有 prefix,模型要记很多 pair。

如果形成一个 internal node:

food-like = {rice, noodle, apple}

规则可以压缩成:

eat food-like
cook food-like

这就是压缩收益。

所以 encoder 不是靠直觉发现 food。

它是发现:

这些词共享上下文、替换行为和预测规律,
把它们合并后描述长度更短。

五个训练信号

我建议 TreeHeap encoder 至少需要五类 loss。

1. Echo / Reconstruction

压缩不能破坏样本。

Decode(H_tree, read_position=k) -> token_k
Decode(H_tree, read_subheap=i)  -> subheap_i

如果只能形成语义类,但原句读不回来,那不是 S1 echo。

所以 echo loss 是底线。

2. Context Prediction

无监督学习不能凭空发现语义。

它只能从上下文统计里提取结构。

例如:

eat [MASK] -> rice / noodle / apple
take [MASK] -> amoxicillin / ibuprofen
drink [MASK] -> water / milk

如果多个对象出现在相似上下文里,encoder 应该把它们推向相近 prefix。

3. InfoNCE / Contrastive Learning

InfoNCE 可以把“同一规律”的观察拉近,把错配观察推远。

形式上:

L_InfoNCE =
  -log exp(sim(anchor, positive) / tau)
       / sum_j exp(sim(anchor, candidate_j) / tau)

positive 可以不是人工标签。

它可以来自:

同一个 masked slot
同一个上下文窗口
同一个翻译对
同一个重复构式

negative 可以来自:

错上下文
错翻译
随机替换
打乱语料

这让 encoder 有机会学到:

哪些对象在观察上相似。

4. Replacement Consistency

如果两个词在很多上下文中可以互换,它们应该靠近。

例如:

eat rice
eat noodle
eat apple

这里 rice / noodle / apple 有替换一致性。

但:

eat shirt

不应被认为一致。

这种信号可以迫使 TreeHeap 形成可迁移 prefix。

5. Description Length / Compression Pressure

这是最接近 TreeHeap 精神的部分。

好的 internal node 应该减少描述长度。

没有 prefix:

eat rice
eat noodle
eat apple
cook rice
cook noodle
cook apple

有 prefix:

food-like = {rice, noodle, apple}
eat food-like
cook food-like

如果后者解释同样数据更短,就应该奖励。

这可以看成 MDL,Minimum Description Length。

也就是:

好结构 = 用更短规则解释更多观察。

三种推理如何进入 encoder

我们一直说演绎、归纳、类比。

现在可以落到 encoder 上。

演绎

如果 prefix 已经存在:

amoxicillin -> medicine -> consumable
eat accepts consumable

那么可以推出:

eat amoxicillin

这是 SPR-046 的 supervised semantic-prefix toy proof 已经支持的窄结论。

归纳

现在更关键的是归纳。

模型只看见:

eat rice
eat noodle
cook rice
cook noodle

它要归纳出:

rice / noodle 共享某个 prefix

这个 prefix 不必一开始叫 food。

它可以只是 latent prefix。

名字是人类事后解释。

类比

类比更复杂,可以晚一点做。

例如:

rice : food :: amoxicillin : medicine
eat : food :: take : medicine

这需要结构关系之间也可比较。

当前先不要急着 claim。

最小 proof 应该怎么设计

不要一上来 WMT。

先做无标签 synthetic corpus。

训练数据只给观察,不给类别:

eat rice
eat noodle
eat apple
cook rice
cook noodle
cook apple

take amoxicillin
take ibuprofen
prescribe amoxicillin
prescribe ibuprofen

drink water
drink milk
pour water
pour milk

训练时不提供:

food
medicine
beverage

训练目标:

L = L_echo
  + L_context_prediction
  + L_InfoNCE
  + L_replacement_consistency
  + lambda * L_description_length

然后评估:

rice/noodle/apple 是否形成相近 prefix
amoxicillin/ibuprofen 是否形成相近 prefix
water/milk 是否形成相近 prefix
held-out context 是否能迁移

注意:

标签只能用于评估,不能用于训练。

这就避免了“监督假设”的循环。

必须有 shuffled control

这里最容易自欺欺人。

如果模型在任何数据上都能画出团簇,那就没意义。

所以必须有打乱语料对照。

例如 structured corpus:

eat rice
eat noodle
cook rice
cook noodle

shuffled corpus:

eat car
cook shirt
take apple
drink hoodie

预测应该是:

structured corpus -> 稳定 prefix
shuffled corpus   -> prefix 消失或明显变差

如果两者一样好,说明模型不是在学习世界结构,而是在制造幻觉。

二维投影只能当显微镜

还有一个容易误会的点。

我们可以把高维 TreeHeap state 用 PCA / UMAP / t-SNE 压到二维。

如果 food-like / medicine-like 分开,会很直观。

但二维图不是训练目标本身。

它只是观察工具。

真正要优化的是高维 H_tree

echo 是否保留
context prediction 是否变好
InfoNCE retrieval 是否变好
held-out transfer 是否成立
structured-vs-shuffled gap 是否存在

二维图可以放在报告里,但不能只靠肉眼判断。

需要数字指标:

nearest-neighbor class accuracy
cluster purity
ARI / NMI
held-out transfer accuracy
echo exact

当前 claim

这篇不是实验结果。

它是下一步设计。

当前 claim 是:

TreeHeap semantic structure must be learned by an encoder-as-world-observer:
the encoder should infer placement, fold, and prefix structure from
compressibility signals rather than receive semantic labels by philosophical
assumption.

中文说:

TreeHeap 的语义结构不能靠我们手写进去。
encoder 必须通过观察数据和 loss,
自己学出放置、折叠和前缀规律。

Falsification

这个方向可以被证伪。

如果出现下面情况,就要降级或重做:

1. shuffled corpus 也能产生同样 prefix;
2. flat / bag / pair baseline 在 held-out transfer 上追平;
3. TreeHeap 保住 echo 时就学不出 prefix;
4. 学出 prefix 时 echo 被破坏;
5. prefix 必须靠人工标签才能出现;
6. 学出的 prefix 对 route/read 没帮助。

下一步

我建议 DS 先 review 这套设计,而不是立刻跑大实验。

需要审的问题:

1. 这些 loss 是否足以驱动 prefix induction?
2. description-length pressure 如何实现最小版?
3. InfoNCE positive/negative 是否会偷渡监督?
4. shuffled corpus control 是否足够?
5. flat baseline 应该怎么配?
6. TreeHeap 特异性在哪里,如何避免退化成普通 embedding clustering?

如果这些过了,再写 proof。

目标不是证明 TreeHeap 已经理解世界。

目标是证明一个更小的东西:

encoder 能不能从观察中,把可压缩规律写进 TreeHeap。

ARA: encoder design / claims / experiments