梯度到底改什么:TreeHeap 状态松弛的边界

这篇是 SPR-038 的修订版。

原版里有一个说法不够严谨:

函数不变。
地址规则不变。
kernel 系数不变。
只有 arr[i] 的状态在移动。

Houming818 指出这里混淆了几层东西。

这个批评是对的。

TreeHeap 里至少要区分五个对象:

Theta  = parameter TreeHeap,也就是模型参数
H      = activation / memory TreeHeap,也就是当前样本上的状态
A      = physical address rule,比如 left(i)=2i, right(i)=2i+1
K_Theta = kernel operator,由参数 Theta 定义的局部卷积算子
L      = scalar loss / energy,用来产生梯度

类比线性回归:

y = w*x + b

普通机器学习里,wb 是参数。

放到 TreeHeap 口径里,wb 可以不是两个孤立标量,而是一个很小的参数堆:

Theta = {
  w,
  b
}

所以“参数就是一个 TreeHeap”是合理的。

更一般地:

H_next = K_Theta(H, A)
L = loss(H_next)

如果训练模型参数,就是:

Theta <- Theta - eta * grad_Theta L

如果调整当前 heap 状态,就是:

H <- H - eta * grad_H L

这两件事不是一回事。

物理地址和语义地址

原文说“地址规则不变”,也需要修正。

严格说,不变的是物理寻址规则:

left(i)  = 2i
right(i) = 2i + 1

也就是数组位置和父子索引关系没有变。

但是 arr[i] 的向量状态一旦变了,它在语义空间里的位置当然也变了。

所以应该写成:

物理地址 A 不变。
语义状态 H[i] 可变。
语义地址 / 向量位置会随 H[i] 改变。

这点很重要。

否则会误以为 SPR-038 证明了“地址不变还学习了结构”。

它没有。

它只证明:

在固定物理地址规则下,当前 heap state 可以被一个 scalar energy 推动,向低能量状态移动。

SPR-038 到底证明了什么

SPR-038 的 claim 是:

S1-RELAX-C01:
A differentiable energy over the current TreeHeap state can generate gradients
that relax arr[i] toward a lower-energy equilibrium while kernel parameters
and address rules remain fixed.

修订后,这句话要更精确地理解为:

Theta 不更新。
K_Theta 不更新。
物理地址规则 A 不更新。
当前样本的 heap state H 更新。

也就是:

这不是参数学习。
这是状态松弛。

它更像一个物理系统:

给定能量函数 E(H),
当前状态 H 沿着 -grad_H E(H) 移动。

Proof 1:标量能量只说明 loss 能产生梯度

第一个 toy 是:

root  = 2.0
left  = 1.0
right = 3.0

能量函数:

E = (left - right)^2
  + (root - (left + right) / 2)^2

梯度下降后:

[2.0, 1.0, 3.0]
-> [2.0, 2.0, 2.0]

实验结果:

initial energy = 4.0
final energy   = 9.86e-31
energy ratio   = 2.47e-31

这个 proof 的意义很窄:

只要有 scalar loss / energy,
就能对当前 H 求梯度,
并让 H 沿低能量方向移动。

它不说明 kernel 结构已经学习了。

它也不说明参数 TreeHeap Theta 已经被训练。

Proof 2:7 节点 TreeHeap 状态松弛

第二个 toy 使用 7 节点树:

        1
      /   \
     2     3
    / \   / \
   4   5 6   7

其中:

4,5,6,7 是固定叶子向量
1,2,3 是可更新 internal heap state

注意:

更新的是 H[1], H[2], H[3]
不是更新 Theta

能量有两部分:

E_consistency:
  parent 应该接近 children 的局部组合

E_relation:
  internal node 应该接近固定 relation anchor

总能量:

E_total(H) = E_consistency(H) + E_relation(H)

32 次随机初始化结果:

指标 数值
scalar energy ratio 2.47e-31
mean vector energy ratio 1.24e-13
max vector energy ratio 3.69e-13
mean centroid error drop 3.0393
pass rate 1.0000
pilot pass true

这说明:

在这个 toy 能量场里,
TreeHeap state H 可以稳定收敛。

但仍然要强调:

这不是 kernel 参数学习。

kernel 卷积到底应该是什么

Houming818 给了一个更贴切的例子。

还是这棵树:

        1
      /   \
     2     3
    / \   / \
   4   5 6   7

如果 kernel 是:

[root, left, right] = [1, 1, 1]

对每个内部节点做局部卷积:

H'[1] = 1*H[1] + 1*H[2] + 1*H[3] = 1 + 2 + 3 = 6
H'[2] = 1*H[2] + 1*H[4] + 1*H[5] = 2 + 4 + 5 = 11
H'[3] = 1*H[3] + 1*H[6] + 1*H[7] = 3 + 6 + 7 = 16

叶子暂时保持不变,则得到:

[6, 11, 16, 4, 5, 6, 7]

这个例子比 SPR-038 更接近 TreeHeap kernel 的核心。

因为 kernel 不是抽象地“调状态”,而是在做:

观察一个局部 subheap
计算一个新 state
把局部结构信息写回当前节点

也就是:

S_i = [H[i], H[left(i)], H[right(i)]]
H'[i] = K_Theta(S_i)

如果 kernel 是线性的:

H'[i] = theta_root * H[i]
      + theta_left * H[left(i)]
      + theta_right * H[right(i)]

那么 [1,1,1] 就是一个最简单的 TreeHeap 卷积核。

和 Transformer 的关系

Transformer 里常见的核心相似度是:

score(i,j) = Q_i dot K_j

它是在 flat token 空间上做全连接关系计算。

TreeHeap kernel 可以看成:

score / state = K_Theta(root, left, right)

也就是在局部子堆上做结构化关系计算。

所以更合理的类比不是:

TreeHeap 已经替代 Transformer

而是:

Transformer 在 flat all-to-all token 图上学习共现关系。
TreeHeap 希望在 address/path/subheap 结构上学习局部卷积关系。

如果 K_Theta 学到的是类似 [1,1,1][0.2,0.5,0.3]、镜像 kernel、stop/left/right kernel 这样的结构算子,那么 TreeHeap 才真正有自己的归纳偏置。

修订后的结论

SPR-038 支持的结论是:

TreeHeap 的当前状态 H 可以在 scalar energy 下做梯度松弛。

SPR-038 不支持的结论是:

TreeHeap kernel 参数 Theta 已经能通过梯度学会卷积结构。

所以 SPR-038 的位置应该是:

状态梯度 proof
不是参数学习 proof

下一步 SPR-039 应该转向:

parameter TreeHeap / kernel Theta learning proof

最小实验就是:

输入 H = [1,2,3,4,5,6,7]
目标 H' = [6,11,16,4,5,6,7]

模型不知道 kernel = [1,1,1]
只通过 loss 学 theta_root, theta_left, theta_right

如果训练后得到:

Theta ~= [1,1,1]

那才说明:

TreeHeap kernel 的参数可以通过 loss / gradient 学到局部卷积规则。

这会成为 SPR-039 的核心。

ARA: heap-state relaxation / claims / evidence