世界模型坐标系第一试:Frozen Embedding 不是胜利,是一把尺

SPR-027 之后,我们有了 TreeHeap 的差分代数:

Zero
Diff
Norm
Cosine
Finite Difference
Gradient Signal

这说明 TreeHeap 已经可以定义:

写入结果和目标之间的距离

但马上出现下一个问题:

目标从哪里来?

也就是我们说的:

世界模型坐标系

如果没有世界模型坐标系,TreeHeap 只能学 echo。

如果有一个坐标系,它才知道:

foot + ball 应该靠近 football
hand + ball 应该靠近 handball
rain + coat 应该靠近 raincoat

这次用什么坐标系?

这次采用 Houming818 选的 A 方案:

用现成 embedding。

具体是:

sentence-transformers/all-MiniLM-L6-v2

在 io 上使用的是本地缓存:

/home/nio/.cache/huggingface/hub/models--sentence-transformers--all-MiniLM-L6-v2/snapshots/1110a243fdf4706b3f48f1d95db1a4f5529b4d41

所以这次没有用 proxychains4

如果后面要加载新模型或新语料,且本地没有缓存,就应该在 io 上用:

proxychains4

并把下载命令记录到 evidence。

防蒸馏边界

这里必须说清楚:

冻结 embedding 不是 TreeHeap 自己学出的世界模型。

它只是一个外部坐标尺。

我们用它来问:

TreeHeap 写入后的向量,能不能靠近这个坐标尺里的目标点?

这不是说:

TreeHeap 已经拥有 all-MiniLM 的知识。

更不是说:

TreeHeap 蒸馏了一个大模型。

本实验只验证:

TreeHeap encoder 能否在一个冻结坐标系里学习组合映射。

实验任务

任务是复合词组合:

left + right -> target

例子:

foot + ball -> football
basket + ball -> basketball
hand + ball -> handball
rain + coat -> raincoat
book + shelf -> bookshelf
flash + light -> flashlight

数据规模:

Split Count
train 20
test 11
OOD 6
targets 37

embedding 原始维度:

384D

固定随机正交投影到:

128D

这样和 TreeHeap 的 128D 方向一致。

三个模型

vector_add

最简单:

y = normalize(left + right)

没有训练参数。

concat_mlp

普通 MLP:

[left, right, left*right, abs(left-right)] -> target

它有训练参数,会拟合训练集。

treeheap_prob_vector_plus

TreeHeap 版本:

H0 = Zero
H1 = ProbVectorPlus(H0, left)
H2 = ProbVectorPlus(H1, right)
y  = Read(H2)

其中写入是:

H'[i] = H[i] + p_i · update(x)

也就是:

用概率路由把 128D word vector 写入 TreeHeap 节点。

结果

结果如下:

Model Train cosine Test cosine OOD cosine Test top1 OOD top1
vector_add 0.7117 0.7256 0.7198 0.909 0.833
concat_mlp 1.0000 0.6269 0.5766 0.000 0.000
treeheap_prob_vector_plus 0.9999 0.5051 0.3919 0.000 0.000

这个结果非常明确:

TreeHeap 没赢。

更准确地说:

当前 TreeHeap prob vector plus 过拟合训练集。

训练集上接近 1.0:

train cosine = 0.9999

但 OOD 很差:

OOD cosine = 0.3919
OOD top1 = 0.0

反而最简单的:

vector_add

表现最好:

OOD cosine = 0.7198
OOD top1 = 0.833

Claim 状态

所以这次结论是:

S1-WM-C01 -> rejected pilot

这个 rejected 很重要。

它说明我们不能说:

只要把 TreeHeap 接到 embedding 坐标系,就自然有世界模型。

事实正好相反:

当前 unconstrained TreeHeap reader 太自由,
会记住训练集,
但没有学到可泛化的复合词结构。

为什么 vector_add 会这么强?

因为 frozen embedding 里已经包含大量语言共现和语义关系。

对很多复合词来说:

left + right

本身就已经靠近:

target compound

例如:

rain + coat

在 embedding 空间里天然接近:

raincoat

这说明:

外部 embedding 坐标系已经有强世界知识。

TreeHeap 如果只是用一个大 reader 去拟合它,很容易变成小数据过拟合。

这不是 TreeHeap 的优势区。

这对下一步意味着什么?

下一步不要简单增加参数。

也不要把 reader 做得更大。

因为这会更像:

小 MLP 记训练集。

下一步应该限制 TreeHeap,让结构真的参与计算。

例如:

1. 共享 family slot
   ball / coat / book / light 这些右侧词应该形成可复用子结构。

2. route entropy / collapse control
   防止所有词都写到同一个节点。

3. subheap reuse
   foot+ball, basket+ball, hand+ball 应该共享 ball 子堆。

4. copy/read pointer constraint
   readout 不应该完全自由生成,而应该读取 TreeHeap 中的组合状态。

5. 更强 baseline
   vector_add 必须作为第一 baseline。

也就是说,下一版不是:

TreeHeap + 更大 MLP。

而是:

TreeHeap + 更强结构约束。

这次仍然有价值吗?

有。

因为它告诉我们三件事。

第一:

冻结 embedding 可以作为世界模型坐标尺。

第二:

vector_add 是一个很强的 compound baseline。

第三:

当前 TreeHeap prob vector plus 还没有把结构优势用出来。

这比一个虚假的正结果更有用。

它把下一步的任务变清楚了:

不是证明 TreeHeap 能拟合训练集。
而是证明 TreeHeap 能利用地址、路径、子结构复用,
在 OOD compound 上超过 vector_add。

总结

这篇的结论是负面的:

S1-WM-C01 rejected pilot。

但路线更清楚了:

M0 给了差分和学习接口。
Frozen embedding 给了外部坐标尺。
当前 TreeHeap encoder 没有泛化。
下一步必须加入结构约束和 subheap reuse。

我们没有输给问题。

我们只是终于看清了问题站在哪里。