一个看起来理所当然的问题

最近我们重新检查 TreeHeap 的多分辨率退火 FOLD。问题从一句很简单的追问开始:

左右子树在同一层合并时,为什么使用平方和,而不是像某些物理变换那样使用乘法?

这次追问最后揭开了两个不同的问题:

  1. 同一层的两个状态怎样组成一个 parent;
  2. 一个子树的绝对尺度怎样沿递归地址传播。

第一件事适合使用平方和。第二件事确实可以使用乘法,但应该乘的是无量纲的路径比例,而不是直接把左右能量相乘。

我们为此实现了一个新的递归能量载体,先在人工树上成功修复梯度爆炸,再把它带到训练后的真实 TreeHeap checkpoint 上审计。最后的决定却是:暂时不要把新公式放进训练。

原因不是候选算错了,而是它修复的病灶没有出现在当前真实数据中,同时它削弱了另一个此前没有被单独披露的功能:当前 FOLD 会在每一层重新归一化,因而隐式补偿递归深度带来的梯度衰减。

这项功能不是我们刻意隐藏的。恰恰相反,直到这次正反对照完成,我们才确认它一直存在于公式中。

1. 当前 FOLD 到底做了什么

设左右子节点相对零点的状态为 $a$ 和 $b$。当前零点参考系 FOLD 计算:

$$ s=\sqrt{\lVert a\rVert^2+\lVert b\rVert^2+\varepsilon} $$$$ P=\frac{a+b}{\sqrt{2}s} $$$$ D=\frac{b-a}{\sqrt{2}s} $$

其中:

  • $P$ 是继续向 root 递归的 parent;
  • $D$ 是保存左右差异的 detail;
  • $s$ 是本层保存的尺度;
  • 当前实现取 $\varepsilon=10^{-8}$。

只要同时保留 $P,D,s$,就能恢复左右状态:

$$ a=\frac{s(P-D)}{\sqrt{2}} $$$$ b=\frac{s(P+D)}{\sqrt{2}} $$

所以这个变换在连续数值上是可逆的。它还有一个直接的前向性质:分子变大时,分母也随之变大,因此 parent norm 被限制在有限范围。

但这里容易产生一个误会:

前向状态有界,不代表反向梯度也有界。

反向传播关心的是 parent 对输入变化的敏感度。Jacobian 中包含近似的 $1/s$。当某层输入尺度非常小时,微小变化会被放大。

2. 人工树第一次暴露了近奇异点

我们先构造 8 个 leaf:

[a, -a, a, -a, a, -a, a, -a]

第一层每对强信号都精确抵消:

a + (-a) = 0

第一层的 detail 和 scale 仍然保存了信息,因此 UNFOLD 可以精确恢复。但是只有 parent 会继续向上参加下一层 FOLD。下一层看到的是:

[0, 0, 0, 0]

此时新的局部尺度只能落到:

$$ s=\sqrt{\varepsilon}=10^{-4} $$

连续两层 Jacobian 中的 $1/s$ 相乘,理论量级接近 $10^8$。float64 toy 的实际 root-to-leaf 梯度 norm 为:

输入 当前 FOLD 梯度 norm
所有 leaf 同向 0.34761
正负交替、精确抵消 70,710,677.94

与此同时,parent 仍然有界,FOLD/UNFOLD 最大闭包误差只有约 $4.3\times10^{-14}$。这里必须把两个指标严格分开:

$$ e_{closure}=\left\lVert\operatorname{UNFOLD}(\operatorname{FOLD}(x))-x\right\rVert_\infty $$

衡量的是:把同一次 FOLD 保存下来的 $P,D,s$ 全部交还给 UNFOLD,原输入能否恢复。它是一项当前点上的代数闭包检查

而梯度实验衡量的是:

$$ g=\left\lVert\frac{\partial\,\operatorname{root}(x)}{\partial x}\right\rVert $$

它描述的是:输入在当前点附近稍微移动,root 会移动多快。这是一项邻域敏感度检查。文中的“爆炸”指 $g$ 爆炸,不是 parent 数值爆炸,也不是 $e_{closure}$ 爆炸。

一个最简单的类比是 $y=10^8x$:在 $x=0$ 时,$y$ 仍然等于 0;若同时保存逆变换,$x=y/10^8$ 也能精确还原。但它的导数仍然是 $10^8$。在本次正负交替 toy 中,把第一个 leaf 从 $1$ 改为 $1+10^{-10}$,scalar root 会从 0 移动到约 $2.5\times10^{-3}$,局部放大约 $2.5\times10^7$。这才是巨大梯度对应的实际含义。

因此,闭包误差很小并不反驳梯度爆炸。相反,两者同时出现,说明这个变换可逆但条件很差。这说明三件事可以同时成立:

前向状态值不爆炸
携带完整 P、D、s 时可以精确还原
root 对 leaf 的反向梯度仍然可能病态

3. 新候选:让节点携带绝对能量

当前算法会保存每层的 $s$,但保存它只是为了以后 UNFOLD。下一层 FOLD 只接收 $P$,并不知道这个零是“没有信号”,还是“两个强信号抵消形成的零”。

新候选让每个节点携带二元状态:

(u, E)

其中 $u$ 是归一化方向,$E$ 是该子树的绝对能量。leaf 初始化为:

$$ E_{leaf}=\sqrt{\lVert x\rVert^2+\varepsilon} $$$$ u_{leaf}=\frac{x}{E_{leaf}} $$

左右子树合并时,同层能量仍然使用平方和:

$$ E_P=\sqrt{E_L^2+E_R^2} $$

方向和差异则计算为:

$$ P=\frac{E_Lu_L+E_Ru_R}{\sqrt{2}E_P} $$$$ D=\frac{E_Ru_R-E_Lu_L}{\sqrt{2}E_P} $$

这样,即使 $P=0$,上层仍然知道 $E_P$ 很大。

乘法出现在纵向地址传播。定义无量纲比例:

$$ r_{child}=\frac{E_{child}}{E_{parent}} $$

沿一条 root-to-leaf 路径:

$$ E_{leaf}=E_{root}\prod_{d=1}^{D}r_d $$

所以,更准确的规则是:

同层左右合并使用平方和,跨层地址上的相对尺度使用乘法。

4. 为什么不能直接把左右能量相乘

我们还实现了一条直接乘法反例:

$$ s_{product}=\sqrt{\lVert a\rVert\lVert b\rVert+\varepsilon} $$

它在左右能量接近时看起来正常,却会在能量失衡时破坏 parent 有界性。

输入 直接乘法的最大 parent norm
左右幅度 100 与 0.01 70.71775
一侧正常、一侧为零 7,071.0678

问题很直观:一侧为零时,乘积也为零,分母重新落到 $\sqrt{\varepsilon}$,而另一侧的强信号仍留在分子中。

乘法不是不能用,而是不能用在量纲不合适的位置。

5. toy 上,新候选成功了

同样的正负交替树上,递归能量载体得到:

输入 当前 FOLD 能量载体 FOLD
同向 leaf 梯度 0.34761 0.34761
抵消 leaf 梯度 70,710,677.94 0.35355

新候选同时满足:

  • parent 有界;
  • FOLD/UNFOLD 闭包误差约 $2.8\times10^{-14}$;
  • root-to-leaf 路径能量乘法重建误差为 0;
  • 抵消时的梯度回到正常输入同一数量级。

如果研究在这里停止,我们很容易得出一个漂亮但危险的结论:新候选已经修好了当前 FOLD。

于是我们继续做了真实 checkpoint 审计。

6. 真实数据中,病灶根本没有出现

我们冻结 S3-STONE2-INTEGRATED-C03 的 pretrain checkpoint,使用它训练后的 token embedding 和 Native XOR Butterfly 输出。数据不是重新编造的 toy,而是 224 个真实自然文本验证窗口:

source width 样本数
4 / 8 / 16 / 32 / 64 / 128 / 256 每档 32

为了量化左右子树是否抵消,定义共同方向比例:

$$ q=\frac{\lVert left+right\rVert}{\lVert left\rVert+\lVert right\rVert+tiny} $$

$q$ 越接近零,左右状态越接近反向抵消。

审计结果:

全部节点 q < 0.10 的数量:0
全局最小 q:0.58384
样本最小 q 的中位数:0.65610

也就是说,在这个训练后的 TreeHeap 状态里,左右节点普遍同向成分很强。人工 alternating tree 所揭示的数学边界真实存在,但它没有成为当前自然文本状态的实际病灶。

7. 此前没有单独披露的功能出现了

真实数据上,能量载体确实让梯度更小。但按句长拆开后,我们发现“小”并不自动等于“稳定”:

width 当前 FOLD 梯度 p50 能量载体梯度 p50 current/carrier
4 0.04459 0.03131 1.419
8 0.04404 0.02183 2.023
16 0.04111 0.01524 2.690
32 0.03622 0.01076 3.408
64 0.03035 0.00757 4.005
128 0.02153 0.00528 4.068
256 0.01483 0.00370 3.994

从 width 4 增加到 256:

  • 能量载体梯度下降约 8.5 倍;
  • 当前 FOLD 梯度只下降约 3 倍。

能量载体把绝对尺度一路保存下来,也让 root probe 的梯度自然分摊到越来越多的 leaf。当前 FOLD 每一层都从当层 parent 重新估计尺度,相当于在递归路径上反复做局部增益调整。它并没有消除长程衰减,却补回了相当一部分梯度压力。

这就是此前没有单独披露、也没有被我们明确识别的功能:

当前 FOLD 不只是前向退火编码器,它还是一个隐式的逐层梯度补偿器。

需要强调,这不是说当前公式已经正确,也不是说梯度越大越好。它只说明,贸然把每层重新归一化替换为严格的绝对能量传播,可能在修复一个未出现的极端奇点时,先破坏真实训练所需的长深度学习压力。

8. 能量和学习压力不是同一个量

这次实验帮助我们区分了四个经常混在一起的概念:

概念 它回答的问题
状态幅度 当前节点的数值有多大
子树能量 节点覆盖的信息载体总尺度有多大
前向可逆性 保存 root、detail、scale 后能否恢复输入
梯度压力 task loss 能以多强的信号修改远端参数

能量守恒解决不了梯度压力。前向可逆也不能保证反向条件良好。反过来,梯度较大也不能证明信息更多,它可能是有效补偿,也可能是病态放大。

因此,TreeHeap 的递归退火算法至少需要同时审计:

前向状态是否有界
FOLD/UNFOLD 是否闭包
不同深度梯度是否衰减
极端抵消处是否近奇异
真实语料是否真的进入这些极端区域

任何单一指标都不足以决定公式。

9. 为什么我们没有继续训练新候选

真实 checkpoint 审计在执行前预注册了停止条件:只有自然数据存在可测抵消尾部,并且能量载体显著改善梯度尾部,才允许进入短训练 ablation。

最终结果为:

A0 数值闭包与有限性:通过
A1 真实抵消尾部存在:失败
A2 current 梯度 p99 至少是 carrier 两倍:失败
A3 抵消指标与梯度比相关:通过,但与句长共同变化,不能独立解释
最终决定:do_not_train_energy_carrier_yet

所以我们没有用更多训练掩盖问题,也没有因为 toy 漂亮就宣布改进成功。

能量载体作为一个数学候选和边界修复工具保留。当前正式 FOLD 不修改。下一步回到真实 task loss,分离每个深度对共享 READ、depth embedding、branch 和 recurrent decoder 的参数梯度,寻找多深度负交互真正发生的位置。

10. 一句话结论

TreeHeap 的递归能量载体能够修复人工反向抵消造成的梯度奇点,但这个病灶没有出现在当前真实文本 checkpoint 中;反而是现有逐层归一化暴露出一个此前未被明确识别的功能,它会补偿部分长深度梯度衰减。能量守恒不等于学习压力守恒,因此新候选在训练前被主动停止。

完整 ARA、代码与 Evidence:


原创与 License: 本文中的 TreeHeap 递归能量载体、路径比例传播设计、梯度补偿解释、Claim、反证条件与实验流程由 Houming818 与 Codex 在 TreeHeap 研究过程中共同提出和验证。代码与 ARA Evidence 依 SameTime 仓库许可证开放;本文内容采用 GPLv3,可复现、审计和修改。本文不声明该候选优于其他架构,也不把数值 smoke 外推为语言或意识结论。