TreeHeap 的存在性:编码结构与共轭 Kernel

这篇文章修正一个重要问题。

上一版 SPR-018 把重点放在了 subheap kernel relocation

给定一个人工 pattern,
看 TreeHeap kernel 能不能在新地址找到它。

这个实验有用,但太弱。

它只能说明:

显式 subheap kernel 可以做局部模式检测。

它不能证明我们真正关心的东西:

TreeHeap 能不能自己把输入数据 encode 成一种可搜索、可压缩的结构?
查询 kernel / 解码 kernel 能不能沿着这个结构工作?
encoder 和 decoder 是否形成一对共轭过程?

所以现在的 claim 要重新写清楚。

现在真正的 Claim

TreeHeap 不是要证明自己是“完全不同”的东西。

它应该先证明自己和实数域、MLP、CNN、Transformer 一样,能用于构造预测函数:

输入 x
参数 theta
预测 y_hat = f_theta(x)
loss(y_hat, y)
gradient
update theta

然后再证明:

在需要结构编码、路径搜索、前缀压缩、延迟坍缩的问题上,
TreeHeap 的显式结构归纳偏置能带来更好的样本效率、外推稳定性或计算效率。

更具体地说,我们现在要证明的不是:

TreeHeap 会匹配一个 pattern。

而是:

TreeHeap encoder 能把数据组织成一种结构;
TreeHeap decoder/query kernel 能利用这个结构完成搜索或解码。

这就是:

learned encoder + conjugate kernel

中文可以叫:

学习到的编码器 + 共轭查询/解码核

为什么旧 B 实验不够

旧 B 实验是这样的:

pattern:
      1
     / \
    2   3

训练时 pattern 出现在:

positions = {0, 1, 2}

测试时 pattern 出现在:

positions = {6, 10, 13}

结果:

method accuracy mean min max
TreeHeap kernel 1.0000 1.0000 1.0000
flatten MLP 0.4996 0.4258 0.5703
sequence CNN 1.0000 1.0000 1.0000
small Transformer 0.9846 0.6055 1.0000

这个表说明:

局部 kernel 迁移是有效归纳偏置;
MLP 展平后不擅长;
CNN 和 TreeHeap kernel 擅长;
Transformer 大多能学到,但有失败尾部。

但它不说明:

TreeHeap 能学习建堆。
TreeHeap 能学习编码。
TreeHeap 能执行查询路径。
TreeHeap 能压缩数据。

所以旧 B 只能作为 smoke test。

它证明的是:

kernel 这个方向值得继续。

而不是最终 proof。

新实验方向一:学习建堆 + 查询搜索

第一个真正应该做的实验是:

learned ordered TreeHeap search

也就是:

输入一组 key/value
encoder 把它们建成 TreeHeap
query kernel 根据查询 key 在树上走 stop / left / right
最后返回 value

注意关键点:

树不是人工提前建好的。
树应该由 encoder 学出来。

Toy 数据

给一批 key/value:

[(8, A), (4, B), (12, C), (2, D), (6, E), (10, F), (14, G)]

查询:

query = 6
answer = E

如果 TreeHeap encoder 学到了类似有序树的结构,它可能形成:

          8:A
         /   \
      4:B     12:C
     /  \     /   \
  2:D   6:E 10:F 14:G

这个结构不是我们强行塞给模型的目标,而是它为了让查询 kernel 更容易工作,应该自己学出来的中间结构。

查询 Kernel

查询 kernel 可以很简单:

query_kernel(node, query):
  if query == node.key:
    return stop
  if query < node.key:
    return left
  if query > node.key:
    return right

查找 query = 6 的过程:

step 1:
  node = 8:A
  6 < 8
  action = left

step 2:
  node = 4:B
  6 > 4
  action = right

step 3:
  node = 6:E
  6 == 6
  action = stop
  output = E

路径:

root -> left -> right -> stop

地址:

0 -> 1 -> 4

这就是一个查找算法。

但在 TreeHeap 视角下,它可以被看成:

subheap
-> query kernel
-> next address
-> subheap
-> query kernel
-> ...

也就是一个局部 kernel 的迭代。

这里的共轭关系

encoder 和 query kernel 必须配合。

如果 encoder 学出的结构是乱的:

          10:F
         /    \
      2:D      6:E

那么简单的 query < root -> left 就可能走错。

所以训练压力会迫使 encoder 学一种结构,使得 decoder/query kernel 能工作。

这就是共轭关系:

encoder 学会如何摆放节点;
query kernel 学会如何沿结构读取。

一个好的 proof 应该观察:

查询准确率是否上升;
路径长度是否接近 log n;
树结构是否接近有序树;
OOD key 数量变大时是否还能泛化。

Predict B-new

如果 TreeHeap 的结构归纳偏置成立,
TreeHeap encoder 会学习出一种可被局部 query kernel 搜索的结构。

相比 flatten MLP,
它应该更省样本、更容易外推到更多 key。

相比普通 Transformer,
它应该在路径长度、计算量、失败尾部上更稳定。

这才是搜索能力的 proof。

新实验方向二:加权前缀树 + Huffman-like 解码

第二个方向是你提到的加权树。

这里最接近的经典对象是 Huffman coding。

Huffman 编码做的事是:

高频符号用短路径;
低频符号用长路径;
整棵树是 prefix-free 的;
decoder 沿路径还原符号。

TreeHeap 里可以问一个类似问题:

encoder 能不能学习一棵加权前缀树?
decoder kernel 能不能沿路径把符号还原?

Toy 数据

假设符号频率是:

A: 0.50
B: 0.25
C: 0.15
D: 0.10

一个理想的 Huffman-like 编码可能是:

A -> 0
B -> 10
C -> 110
D -> 111

对应树:

root
├── 0: A
└── 1
    ├── 0: B
    └── 1
        ├── 0: C
        └── 1: D

平均路径长度:

E[length]
= 0.50 * 1
+ 0.25 * 2
+ 0.15 * 3
+ 0.10 * 3
= 1.75

如果不用加权前缀树,而给每个符号固定 2 bit:

A -> 00
B -> 01
C -> 10
D -> 11

平均长度:

E[length] = 2.00

这个 toy 里 Huffman-like 树更短。

Encoder / Decoder

TreeHeap encoder 的任务:

输入符号分布
输出一棵前缀 TreeHeap

TreeHeap decoder 的任务:

输入路径 bits
沿 TreeHeap 走 left/right
遇到 leaf 后输出符号

例如路径:

110

解码:

root -> right -> right -> left
output = C

这和前面的搜索任务一样,也是 kernel 迭代:

current node + next bit -> next node

但这里的目标不是搜索 key,而是还原压缩编码。

这里的共轭关系

encoder 和 decoder 也是共轭的:

encoder 决定符号放在哪条路径;
decoder 沿路径还原符号。

如果 encoder 把高频符号放得很深,平均路径长度就会变差。

如果 encoder 生成的树不是 prefix-free,decoder 会混淆。

所以训练目标可以是:

reconstruction loss
+ expected path length penalty
+ prefix-free constraint penalty

Predict C-new

如果 TreeHeap 的加权路径结构成立,
encoder 应该能学习一棵接近 Huffman oracle 的前缀树;
decoder kernel 应该能沿路径稳定还原符号;
平均路径长度应该低于固定长度编码 baseline。

这才是“路径前缀压缩”的 proof。

不是简单地数 toy trie 节点。

这两个实验和机器学习的关系

这两个实验不是手写算法炫技。

真正的目标是:

让 encoder 的结构由梯度学习出来。

也就是:

输入数据
-> TreeHeap encoder(theta)
-> 结构状态 H
-> query/decoder kernel(phi)
-> 输出
-> loss
-> gradient update theta, phi

这和 MLP / Transformer 一样,仍然是机器学习。

区别只是:

MLP 学的是展平向量上的函数;
Transformer 学的是 token 序列上的 attention 函数;
TreeHeap 学的是结构编码 + 路径 kernel。

所以 TreeHeap 的存在性不是“完全不同”。

而是:

同样做预测函数学习,
但结构归纳偏置不同。

旧 B 表应该怎么使用

旧 B 表还可以保留,但只能作为弱证据。

它说明:

显式 kernel 在局部结构迁移任务上是有用的;
这个方向不是空想。

但下一轮 proof 应该升级为:

B-new:
  learned encoder builds searchable ordered tree
  query kernel walks stop/left/right

C-new:
  learned encoder builds weighted prefix tree
  decoder kernel reconstructs symbols from paths

我们之后要聊的 predict 和 proof,就应该围绕这两个实验设计。

当前总 Claim

最终 claim 可以写成:

TreeHeap 是一种和 MLP / CNN / Transformer 同属机器学习家族的计算结构。

它的独特性不是“完全不同”,
而是把结构编码、路径搜索、前缀压缩、概率坍缩显式化。

如果 claim 成立,
TreeHeap encoder 应该能学习可搜索/可压缩的结构;
共轭 query/decoder kernel 应该能利用该结构完成搜索和解码;
并在相应结构任务上获得更好的样本效率、外推稳定性或计算效率。

下一步不是继续做 pattern matching。

下一步是 proof:

能不能 learn to build the tree?
能不能 learn to search/decode through the tree?
能不能比 MLP / Transformer 更省样本、更稳?

这才是 TreeHeap 的存在性问题。

License: GPLv3