TreeHeap 语义前缀压缩:从 word bag 到可迁移的结构状态

这篇重写 046。

之前版本把太多中间修正写进正文:查找树、route、content-aware、compact state、H/Q/Theta、霍夫曼类比、语义前缀 proof 混在一起。读起来像沿途事故记录,不像一篇能帮助后续工作的文章。

现在从基本知识重新讲。

这篇只回答一个问题:

TreeHeap 的 root / internal node 如果不是 word bag,那它应该是什么?

我的当前答案是:

TreeHeap state 应该是可解码、可压缩、可迁移的语义前缀结构。

也就是说,root 不是把所有词混在一起。

root 应该保存一种结构状态,使得模型在给定问题 Q 时,可以从中坍缩出需要的信息。

第一件事:Transformer 也不是把所有可能性存下来

先拿 Transformer 做参照。

假设语料里有很多句子:

我 吃 米饭
我 吃 面条
我 吃 苹果
我 吃 药
我 吃 阿莫西林

我们可能会误以为 Transformer 学到的是一个巨大表:

吃 -> {米饭, 面条, 苹果, 药, 阿莫西林, ...}

但这不是准确理解。

Transformer 不会为每个词保存“后面所有可能词的完整集合”。

它学的是一个条件概率函数:

P(next token | context)

训练时,模型看到大量上下文和目标 token。

例如:

context = 我 正在 吃
target  = 米饭

模型会生成一个 hidden state:

h = Transformer(context)

然后输出词表概率:

logits = W_vocab h
P(token) = softmax(logits)

如果正确答案是“米饭”,loss 会推动参数,让“米饭”的概率更高。

长期训练后,模型不是记住一张简单共现表,而是在参数矩阵里形成一个分布式函数。

这个函数会捕捉类似:

吃 后面常接可摄入对象
可摄入对象包括食物、药品、某些抽象对象

但这些结构通常是隐式的。

也就是说,Transformer 的强项是:

用大规模参数矩阵学习 flat context -> probability 的函数。

它不枚举所有可能。

它学习一个能泛化的概率曲面。

第二件事:word bag 不够

现在回到 TreeHeap。

如果一句话是:

I like small cats

一个 word bag 表示是:

{I, like, small, cats}

这个表示能回答:

cats 出现过吗?

但它不能回答:

第 1 个词是什么?
small 修饰谁?
small cats 是不是一个 subheap?
I like small cats 和 cats like small I 是否不同?

所以 word bag 不是 echo 所需的 root state。

Echo 要求至少能恢复:

token identity    有哪些 token
address / path    token 在哪个结构位置
composition       token 如何组成 subheap / sentence

如果 root 只保存 bag,那顺序和结构已经丢了。

所以更合理的说法是:

root 不是词集合。
root 是一个可解码的结构状态。

给一个 query:

Q = read position 2

decoder 应该能读出:

small

给另一个 query:

Q = read subheap containing adjective+noun

decoder 应该能读出:

small cats

也就是说,root 的含义不是靠我们肉眼解释出来的。

它靠读出能力证明:

Decode(root, Q) -> expected information

第三件事:TreeHeap 的不同假设

Transformer 做的是 flat context function。

TreeHeap 想做的是 structured heap context function。

可以写成:

Transformer:
  H_flat = sequence hidden states
  Q      = decoder step / attention query
  Theta  = attention + MLP + vocab head parameters
  output = token probability

TreeHeap:
  H_tree = TreeHeap states
  Q      = read / write / generate intent
  Theta  = TreeHeap kernel parameters
  output = route / read / token probability

所以 TreeHeap 不是要比 Transformer 更神秘。

它的假设更具体:

语言信息本身有层级、前缀、子结构和组合关系。
如果模型的状态空间也显式支持这些结构,
就可能在某些任务上更容易泛化。

这里的重点不是“树比矩阵高级”。

重点是 TreeHeap 可能提供一种归纳偏置:

address
path
subheap
compose
decompose
prefix compression
probabilistic collapse

这些结构在普通 flat 表示里不显式。

第四件事:语义前缀压缩

现在进入这篇的核心。

TreeHeap root / internal node 不应该只是频率压缩。

也不应该只是 word bag 压缩。

它应该尝试形成语义前缀压缩。

什么叫语义前缀?

例如:

阿莫西林 -> 药品 -> 可摄入对象 -> 物体
米饭     -> 食物 -> 可摄入对象 -> 物体
面条     -> 食物 -> 可摄入对象 -> 物体
苹果     -> 食物 -> 可摄入对象 -> 物体

如果模型只记 pair,它只知道:

吃 + 米饭
吃 + 面条
吃 + 苹果

如果新组合出现:

吃 + 阿莫西林

pair memory 没见过,就容易失败。

但如果模型有语义前缀,它可以做一个演绎迁移:

阿莫西林 是 药品
药品 是 可摄入对象
吃 接受 可摄入对象
所以 吃 + 阿莫西林 可以成立

这就是 TreeHeap 可能比 word bag 更有意义的地方。

它不是保存所有句子。

它保存可复用的中间语义节点。

这些节点可以支持未见组合的推理。

第五件事:这和霍夫曼树像在哪里,不像在哪里

霍夫曼树是一种编码树。

它把高频符号放到短路径,低频符号放到长路径。

它的目标是压缩长度。

TreeHeap 的语义前缀树可以借用这个直觉:

路径是一种编码。
internal node 是一组可以共享前缀的信息。
leaf 是更具体的信息。

但 TreeHeap 不应该只按频率压缩。

它更应该按可推理性压缩。

也就是说,internal node 应该回答:

哪些叶子共享同一种语义规则?
哪些组合可以通过这个节点迁移?
哪个前缀能最大化当前任务的信息增益?

所以它更像:

Huffman-like semantic prefix tree

而不是普通 Huffman coding。

第六件事:route 不是查找树,而是信息坍缩

这点也要说清楚。

以前我把 TreeHeap route 讲成:

从 root 开始,找 cats,走 left/right/stop。

这个类比太像二叉搜索树。

二叉搜索树的问题是:

给定 key
比较大小
往左或往右找

TreeHeap 的目标不是这个。

更准确地说,TreeHeap route 是:

在当前问题 Q 下,
从当前 node 的信息分布里,
选择是否停下,或者坍缩到哪个子信息分支。

动作不是“找 key”。

动作含义应该是:

动作 含义
stop 当前 node 的信息已经足够回答 Q
left 左分支的信息对 Q 更有用
right 右分支的信息对 Q 更有用

所以更准确的名字是:

InformationCollapseRoute

它输出的是一个概率桶:

P(stop), P(left), P(right)

如果要硬执行,就坍缩成一个动作。

如果还不确定,就保留概率容器。

这和我们之前一直说的“延迟坍缩”是一致的。

第七件事:H、Q、Theta 的位置

现在把对象定义清楚。

H      = 当前样本形成的 TreeHeap state
Q      = 当前任务意图 / query / read-write intent
Theta  = 可学习的参数 TreeHeap 或 kernel 参数
Output = 概率桶

形式上:

Route_Theta(H, Q, node=i)
  -> P(stop), P(left), P(right)

这里 H 不是长期参数。

H 是输入样本的运行时状态。

比如:

H = Encode("I like small cats")

Theta 才是训练后保留下来的东西。

类比线性回归:

y = w x + b

x    是输入
w,b  是参数

TreeHeap 里:

H      是输入形成的状态
Theta  是模型学到的参数
Q      是这次要解决的问题
P      是输出概率

训练时,loss 会更新 Theta

如果 encoder / compose / route / read 都是可学习的,那么可能有多组参数:

Theta_encode
Theta_compose
Theta_route
Theta_read
Theta_decode

但现在不能把这些混在一起。

否则即使实验成功,我们也不知道到底是谁学会了东西。

第八件事:当前证据 1,content-aware dense route

先说已经做过的 route proof。

实验:

S1-CONTENT-ROUTE-C01

问题是:

kernel 能不能真的读 arr[i] / arr[left] / arr[right] 的内容,
而不是读几何答案 feature?

dense 版本把每个 subheap 表示成 vocab-count 向量。

也就是说:

arr[i] = 这个子堆里有哪些 token 的清单

这不是最终语义表示。

但它可以作为机制尺子:

如果清单都跑不通,route 机制就有问题。

结果:

指标 数值
samples 20000
train route steps 352110
OOD route steps 44130
dense feature memory 6191.25 MB
OOD step acc 0.9983
OOD route exact 0.9902
flat length-matrix OOD exact 0.0000
pilot pass true

这说明:

content-aware route 可以读 subheap 内容并完成递归 stop/left/right。

边界:

这不是语义理解。
这不是翻译。
这仍然使用 supervised query token。
这仍然依赖 dense vocab-count state。

第九件事:当前证据 2,compact state 失败在哪里

接着做 compact 版本。

目标是把 dense vocab-count state 换成小向量。

做法:

token id -> 固定随机向量
arr[i]   -> 子堆 token 向量求和

64D 结果:

指标 数值
compact memory 324.84 MB
dense prior memory 6191.25 MB
memory reduction 19.06x
OOD step acc 0.9973
OOD route exact 0.9838
pilot pass false

128D 结果:

指标 数值
compact memory 637.59 MB
memory reduction 9.71x
OOD step acc 0.9973
OOD route exact 0.9837
pilot pass false

这个结果说明:

随机 token sum 能大幅省内存,
但会损失路径级 exactness。

而且 128D 没有明显变好。

所以问题不是简单的维度不够。

更可能是:

随机向量求和不是好的 subheap state。

下一步应该学:

learned token embedding
learned subheap compose
learned prefix state

第十件事:当前证据 3,语义前缀 toy proof

为了验证“语义前缀能带来演绎迁移”,我做了一个很小的 toy proof。

它不是自然语料实验。

它只测试一个基本机制:

如果语义前缀结构存在,
它能不能支持未见 pair 的推理?

Toy ontology:

rice        -> entity -> consumable -> food
noodle      -> entity -> consumable -> food
apple       -> entity -> consumable -> food
amoxicillin -> entity -> consumable -> medicine
ibuprofen   -> entity -> consumable -> medicine
water       -> entity -> drinkable  -> beverage
shirt       -> entity -> wearable   -> clothing
car         -> entity -> drivable   -> vehicle

谓词规则:

eat   accepts consumable
take  accepts medicine
drink accepts drinkable
wear  accepts wearable
drive accepts drivable
visit accepts visitable

关键设置:

训练集不包含 eat + amoxicillin。

但是训练集包含:

eat + rice
eat + noodle
eat + apple
take + amoxicillin

对照组:

pair_memory       只记见过的正例 pair
pair_logistic     只用 verb-object pair id
token_additive    只用 verb id + object id
semantic_prefix   使用 object 的语义前缀 path

结果:

模型 test acc
pair memory 0.4
pair logistic 0.4
token additive 0.6
semantic prefix 1.0

关键 held-out case:

Question:
  Can eat + amoxicillin be accepted without that pair in training?

pair_memory:
  gold = 1
  pred = 0

semantic_prefix:
  path = [entity, consumable, medicine]
  gold = 1
  prob = 0.7088
  pred = 1

这支持一个很窄的 claim:

有监督的语义前缀结构,
可以支持 pair memory 不具备的演绎迁移。

边界必须写清楚:

ontology 是手工给的;
prefix path 是监督的;
这不证明模型能从自然语料自动学出 medicine / consumable;
这不证明 WMT;
这不证明自然语言理解。

当前假设

现在我会把假设写得更干净。

Hypothesis 1: root 不是 word bag

TreeHeap root 应该是可解码结构状态。

它至少要支持:

read token
read path
read subheap
read semantic prefix

如果只能回答“某词是否出现”,那只是 bag,不够。

Hypothesis 2: internal node 应该承载可迁移前缀

internal node 不只是左右孩子求和。

它应该尽可能形成:

可复用的语义类
可组合的短语结构
可迁移的推理前缀

例如:

medicine -> consumable
food -> consumable

这样新的 leaf 可以继承规则。

Hypothesis 3: route 是信息坍缩

Route 不应该理解成查找树搜索。

它应该是:

Collapse(H_i, Q; Theta) -> ProbabilityBucket(stop, left, right)

其中 left/right 代表信息分支,stop 代表当前信息已经足够。

Hypothesis 4: Theta 应该逐步 TreeHeap 化

当前实验里的 Theta 还常常是普通 MLP 或 logistic 权重。

这只是工程近似。

更强的目标是:

Theta_encode
Theta_compose
Theta_route
Theta_read

都逐步变成显式 TreeHeap kernel / parameter heap。

否则我们只是在普通模型外面套 TreeHeap 词汇。

下一步怎么走

我建议下一步不是继续写更大口号。

而是做三个 proof。

Proof A: learned prefix induction

现在 semantic prefix 是手工给的。

下一步要从数据里学出来。

例如只给训练事实:

eat rice
eat noodle
eat apple
take amoxicillin
take ibuprofen

看模型能否形成隐含前缀:

food
medicine
consumable

这是最关键的一步。

Proof B: prefix state + echo

不仅要判断 pair 是否成立,还要能 echo。

也就是说:

root state
  -> read position
  -> read subheap
  -> read semantic prefix

三件事要同时成立。

否则语义前缀可能破坏 echo。

Proof C: TreeHeap Theta

把普通 logistic/MLP 参数替换成更明确的参数 TreeHeap。

目标是证明:

Theta 本身可以按 root/left/right/prefix slot 组织,
并通过 loss 学会坍缩规则。

这是从工程近似走向 TreeHeap 理论闭包的关键。

结论

SPR-046 现在的结论是:

TreeHeap 的核心不应该是 word bag root。

更合理的方向是:

root/internal node 形成可解码、可压缩、可迁移的语义前缀结构。

Transformer 学的是:

flat context -> probability

TreeHeap 想学的是:

structured heap context -> probability

当前证据支持三个很小的点:

1. content-aware route 可以读 subheap 内容;
2. random-sum compact state 不够好;
3. supervised semantic prefix 可以支持 toy deductive transfer。

但还没有证明:

TreeHeap 能从自然语料学出语义前缀;
TreeHeap 能翻译;
TreeHeap 已经优于 Transformer;
Theta 已经是严格参数 TreeHeap。

所以当前航行问题已经变清楚了:

不要再争 root 是不是 word bag。
它不应该是。

下一步要证明:
语义前缀能不能从数据里学出来,
并且不破坏 echo / route / read。

ARA: claims / experiments / content route evidence / compact evidence / semantic prefix evidence