先用一句话回答

TreeHeap 的 F 函数,是决定“细粒度状态怎样组成粗粒度状态,以及状态怎样沿树继续传播”的规则。

它不是某一个已经找到的神秘公式,也不只是一个 loss。更准确地说,我们正在寻找的是一族函数:

输入:token 或 child 的状态、当前节点状态、可选的上下文
输出:parent 状态、左右路由概率、残差,以及下一层可继续使用的状态

如果 F 合理,TreeHeap 的每一层都保存同一种可继续计算的数据,只是分辨率不同;如果 F 不合理, 树仍然可以运行,却可能只是把数组换成树形摆放,或者在递归中丢掉 Decoder 真正需要的信息。

本文不要求读者先了解此前九十篇日志。我们从一个四 token 的例子开始,逐步说明 F 的对象、参数、 训练方法、实验结果和当前卡点。

为什么必须单独讨论 F

假设输入是:

西西弗 / 推 / 石头 / 上山

一个二叉 TreeHeap 可以先合并相邻状态,再继续向上:

西西弗 ─┐
         ├─ parent A ─┐
推 ──────┘             │
                       ├─ root
石头 ────┐             │
         ├─ parent B ─┘
上山 ────┘

树形拓扑只告诉我们“谁和谁先计算”,没有告诉我们“怎样计算”。真正决定 parent A 是普通平均、 概率混合、可逆编码,还是一个完全不可读向量的,就是 F。

因此,下面三件事不能混为一谈:

  1. 拓扑:哪些节点相连,计算顺序是什么;
  2. F 函数:相连以后执行什么状态变换;
  3. READ/Decoder:怎样从这些状态取信息并生成输出。

拓扑像函数调用图,F 像每次调用的函数体,READ/Decoder 则是状态的消费者。只改变其中一个, 另外两个不会自动正确。

先解决一个历史歧义:F 曾经指三种东西

过去的研究记录为了交流方便,把三种相关对象都简称为 F。这会造成“F 是共享参数吗”“F 是搜索 算法还是递归公式”之类的混乱。本文开始采用三个名字。

1. 节点函数 f_v

节点 v 上执行的局部规则记为:

$$f_v(x;\theta_v)$$

其中 x 是到达节点的状态,θ_v 是该节点自己的参数。当前概率路由版本中,θ_v 主要包含 观察轴 w_v 和阈值 b_v。

2. 整树函数 F_Θ

把所有节点函数按树的拓扑连接起来,得到整棵树的计算:

$$F_{\Theta}=f_{v_n}\circ\cdots\circ f_{v_2}\circ f_{v_1}$$

这里的 Θ 是全部节点参数的集合。输入一个 token 状态后,F_Θ 给出它的路径、各层状态、 leaf 位置和可供 READ 使用的多分辨率表示。

3. 学习算法 A

搜索或训练 Θ 的算法另记为:

$$A(D,F_{\Theta})\longrightarrow\Theta'$$

D 是语料统计或训练样本。蒙特卡洛、梯度下降、离散结构搜索都属于 A,而不是 F 本身。

这一区分非常重要:一次搜索失败,不等于 F 族必然错误;一个可微 F,也不等于训练目标能够 找到有用参数。

当前概率残差版本的数据是什么

当前实验没有把 token ID 直接当作可以计算的数。它先统计 token t 周围出现 context c 的 次数,再得到条件概率:

$$p_t(c)=P(c\mid t)$$

所以一个 token 的基础状态不是单个整数,而是一行概率:

token t -> [P(c1|t), P(c2|t), ..., P(cK|t)]

这行数据各分量非负、总和为 1,属于概率单纯形。它的物理含义也明确:描述“看到这个 token 时,它周围通常出现什么”。

为了计算路由,实验使用平方根概率坐标:

$$x_t=\sqrt{p_t}$$

这样,概率分布之间的几何距离与 Hellinger 距离相容。它不是任意随机摆放的 embedding;坐标 来自可重复计算的全语料背景场。

一个节点究竟怎样路由

在节点 v,token 状态 x_t 先投影到该节点的局部观察轴:

$$z_v(t)=x_t^{\mathsf T}w_v-b_v$$

w_v 决定这个节点观察哪些方向,b_v 决定切分位置。

硬路由只选择一侧:

$$z_v(t)\le0\Rightarrow L,\qquad z_v(t)>0\Rightarrow R$$

软路由则保留两侧概率:

$$r_v(t)=P(R\mid t,v)=\sigma\left(z_v(t)/\tau\right)$$

其中 τ 是温度。温度较低时接近硬选择;温度较高时,概率质量可以同时流向左右 child。

参数到底共享不共享

答案是:规则共享,节点参数通常不共享。

所有节点都使用同一种投影与 sigmoid 公式,这是共享的计算规则;但每个节点有自己的 w_v 和 b_v,因此它们可以观察不同的局部主轴。若所有节点强行共享同一组数值参数,树的不同位置会 反复采用同一个切分面,很难形成逐层细化的分辨率。

另一方面,FOLD 的概率守恒公式目前没有可训练参数,它是全树共享的数学合同。不要把“共享 公式”和“共享参数值”当成同一件事。

child 怎样合成 parent

设左右 child 的概率质量为 m_L、m_R,它们的 context 原型为 μ_L、μ_R。当前 FOLD 是 质量加权平均:

$$m_P=m_L+m_R,\qquad \mu_P=\frac{m_L\mu_L+m_R\mu_R}{m_L+m_R}$$

这个 parent 仍然是一行 context 概率,与 child 的数据类型和量纲一致。它不是把两个向量相加后 任其能量随深度增长。

更关键的是,它满足守恒关系:

$$m_P\mu_P=m_L\mu_L+m_R\mu_R$$

因此 root 是整批 token 的公共背景;向下走时,child 相对 parent 增加的细节记为残差:

$$\Delta\mu_C=\mu_C-\mu_P$$

沿路径累加即可恢复某一层的原型:

$$\mu_d=\mu_{root}+\sum_{k=1}^{d}\Delta\mu_k$$

这给“多分辨率”一个可检查的定义:浅层保存公共背景,深层逐步增加区分信息。它仍不等于自然 语言中的缩句或语义层级;那需要下游证据。

F 影响架构中的哪些位置

F 不是只影响一个路由开关。它至少影响四处。

位置 F 的作用 错误时的现象
embedding 安装 决定 token 在树中的路径与邻居 同类不聚合、路径随 seed 漂移
FOLD 决定 parent 保存什么以及量纲是否闭合 深层爆炸、消失或成为不可读数据
多分辨率状态 决定粗层与细层的差值 每层重复,或高层完全收不到细节
READ 接口 决定下游能否沿路径恢复有用概率场 训练 loss 下降但生成或 masked read 退化

Decoder 不必和 F 共享同一组参数,但两者必须通过串联训练或冻结接口形成协议。只要 READ/Decoder 的 loss 能通过可微状态回传到 F,F 就能接收下游任务的方向信息;是否应该允许它这样训练,取决 于我们正在检验“背景 embedding”还是“端到端任务表示”。二者不能用同一份证据替代。

怎样寻找 F

目前有三条不同路线。

路线一:蒙特卡洛搜索硬树

固定树深,每次修改一个节点的观察轴或阈值,让所有 token 重新下落,然后在未参与原型估计的 dev 共现数据上计算重建 NLL。更优方案被接受,少量更差方案按退火概率暂时接受,以跳出局部 极小值。

优点是硬树可以直接审计,路径和概率守恒都清楚。缺点是高维搜索昂贵,而且梯度不能直接告诉 离散提案下一步往哪里走。

路线二:梯度训练软树

把左右选择改成连续概率,让 loss 通过全部 soft path 回传到每个 w_v,b_v。这证明 F 的参数 可以被普通优化器更新,也能与 READ 串联。

难点在于训练得到的是概率混合场。训练结束后直接以 0.5 阈值硬化,会丢掉混合状态携带的 信息。软模型学得好,不代表硬路径导出后仍然好。

路线三:结构与参数联合搜索

更完整的 F 还可能改变树的连接方式,而不只是固定拓扑上的轴和阈值。拓扑是离散变量,节点 参数是连续变量,因此这是混合优化问题。

当前项目尚未证明动态拓扑可用。曾经比较过 left_deep、balanced、right_deep 等人工枚举 拓扑,结果说明组合顺序会改变 parent 的可读信息;它不能证明路由器自己会找到这些拓扑。

证据走到了哪里

下面不用编号代替结论,编号只作为复现入口。

实验 实际建立的证据 仍然没有建立
A11 在固定真实语料背景场上,硬树蒙特卡洛搜索优于初始树和随机路由 通用语义 F
A12 3 个搜索 seed、4 个深度均复现重建收益 最佳深度或稳定语义拓扑
A13 F 可保存为自描述 checkpoint,并精确重载 下游可用性
A14 更多语料使背景概率几何更稳定,但树分区仍明显漂移 搜索已收敛
A15 冻结坐标可被 Token READ 和 Echo 使用;masked 语义门不胜随机码 最终 embedding
A16 无训练 Bayesian READ 证明更深层保留更多背景预测信息 当前 F 已无损或最优
A17 软路由可微、可训练、会改变路径且不坍缩 重建 loss 能保护 READ
A18 READ 梯度改善了未见数据上的软概率场 硬化后的 checkpoint 可用

两组关键数字最能说明现状。

A12 中,在同一个冻结语料场上,深度 3、4、5、6 的三 seed 搜索都通过,sealed-test NLL 的 中位改善分别约为 0.0540、0.0451、0.0505、0.0296。这说明 F 不是完全随机的摆放。

但 A18 中,READ-coupled 训练后的软场 NLL 为 4.758578,硬化后变为 4.899335,损失 0.140757。这把当前卡点定位到了 soft-to-hard 交接,而不是“梯度无法穿过树”。

为什么不能直接宣布“embedding 已完成”

一个表示系统至少要通过三个不同门槛:

可编码:token 能稳定进入数值空间
可组织:背景关系能形成非随机、可复现的层级
可消费:READ/Decoder 能利用它完成未见任务

当前结果已经较好地通过“可编码”,部分通过“可组织”,但“可消费”仍是混合结果。Token READ 达到 100% 只说明 token 身份能从坐标中恢复;没有 hash 碰撞时,这本来就是较低的门槛。真正 困难的是:遮住 token 后,剩余背景关系是否比随机码提供更多有效信息,以及这些信息能否经过 递归 READ 进入生成。

当前最合理的下一步

当前不应继续无约束地搜索更低的 embedding NLL,也不应立刻把所有路由硬化。更直接的工程路线是:

  1. 保留 A18 已经表现更好的软路由,作为第一版有效 F;
  2. 让 READ 和 Decoder 在连续路径质量上工作,先建立端到端可用性门;
  3. 单独加入 soft/hard 一致性目标,逐步稀疏化,而不是训练结束后突然阈值切断;
  4. 同时记录每层残差、路径熵、节点占用和梯度贡献,确认收益来自哪些深度;
  5. 只有软模型达到应用门禁后,再比较硬路由、Top-k 路由和稀疏概率路由的成本。

这里采用的是门禁思路,不要求一次找到全局最优 F。第一阶段只要求:有限、守恒、可训练、可 重载、比随机路由有信息,并能把梯度和状态可靠交给 READ。达到以后再优化速度、稀疏度和拓扑。

如何反驳这条路线

F 路线应当被降级或修改,如果出现以下任一稳定结果:

  • 在相同数据、容量和预算下,搜索树长期不能胜过随机或简单 flat baseline;
  • parent 概率质量不能闭合,残差不能重建对应层状态;
  • 打乱 token 与概率行的对应关系后,READ 质量不下降;
  • 多个 seed 下树结构完全漂移,并且下游关系也无法复现;
  • 软路由的收益只能依赖稠密全路径计算,任何可接受成本的稀疏化都会消失;
  • matched Transformer、SGNS 或简单概率模型在同等资源下稳定占优,而 TreeHeap 没有提供新的 能力或成本优势。

负结果不是项目失败,而是缩小 F 的候选集合。我们寻找的不是一个必须存在的答案,而是一条能 被公式、代码和未见数据共同约束的函数族。

最后的简化图

语料
  -> token-context 共现计数
  -> 每个 token 的条件概率行 p_t
  -> 节点函数 f_v 计算局部路由
  -> 整树函数 F_Theta 形成多层原型与残差
  -> READ 取得一个或多个分辨率状态
  -> Decoder 形成输出概率

学习算法 A:
  Monte Carlo / gradient / topology search
              |
              +----> 更新 Theta,而不是取代 F

所以,F 函数问题最终可以压缩成一句工程问题:

能否找到一种逐层相容、概率守恒、可微、可稀疏化的状态变换,使粗层保留公共背景,深层补充 区分信息,并让 READ/Decoder 不必绕过 TreeHeap 就能使用这些信息?

我们已经知道这条链路可以开始工作,也知道它目前断在什么地方。尚未找到终点,但问题已经从 “寻找一个神秘公式”,变成了可以逐项实现、测量和反驳的架构任务。

License: GPLv3。本文中的定义、证据边界和实验入口随 SameTime / TreeHeap 项目公开。