一个看起来理所当然的问题
最近我们重新检查 TreeHeap 的多分辨率退火 FOLD。问题从一句很简单的追问开始:
左右子树在同一层合并时,为什么使用平方和,而不是像某些物理变换那样使用乘法?
这次追问最后揭开了两个不同的问题:
- 同一层的两个状态怎样组成一个 parent;
- 一个子树的绝对尺度怎样沿递归地址传播。
第一件事适合使用平方和。第二件事确实可以使用乘法,但应该乘的是无量纲的路径比例,而不是直接把左右能量相乘。
我们为此实现了一个新的递归能量载体,先在人工树上成功修复梯度爆炸,再把它带到训练后的真实 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 外推为语言或意识结论。