链→树→图:数据结构谱系

Transformer 的博客写到一半,一个视角浮现:梯度传播的路径形状,决定了 encoder 的并发模型。链、树、图——不是三个架构,是同一个谱系上的三个点。

谱系

链 (RNN/LSTM)              树 (SPR)               全连接图 (Transformer)
────                        ────                   ──────────
O(n) 路径                   O(log n) 路径          O(1) 路径
1 个下一跳                  k 个分叉               n 个全连接
信息沿单线串行              信息按前缀分流          信息任意点对点直连
梯度逐站衰减                梯度沿树深衰减          梯度均匀分布
并发度 = 1                 并发度 ≈ 树宽           并发度 = n

树的拓扑复杂度正好卡在链和图之间——不是纯串行,也不是全对全,而是按前缀树的结构化分叉

数据结构决定 encoder

每种结构需要一个与之匹配的 encoder:

结构 Encoder 并发方式
RNN Encoder 逐个递归,等上一步结果,纯串行
Self-Attention Encoder 全并行,一次 matmul,O(1) 路径
??? 需要新设计

树的 encoder 不可能像 RNN 那样纯串行(浪费了分叉的并行机会),也不可能像 Transformer 那样全对全(丢失了树的稀疏性)。它应该是按层并行的——同一层的节点可以同时计算,层与层之间串行。

核心问题变成:每个 token 怎么分配到树的哪个节点? Transformer 用 softmax 打分来解决"谁关注谁",但树需要的是布尔判定——“左边还是右边”——这是 SPR 的排除法路线。

四个观察视角

回头看这三个结构,至少能从四个维度分析差异:

视角 问什么
递归/拓扑 梯度怎么流动? O(n) 串行 O(log n) 分叉 O(1) 直连
信息论 源句信息怎么到解码器? 漏斗压缩 前缀索引 按位置展开
计算并行 GPU 怎么调度? 等上一步 按层并行 全并行
线性代数 矩阵的秩和谱? 隐式 cell state 待分析 显式 Attention

TF-001 博客里已经从拓扑和并行两个视角拆了 Transformer。SPR 的后续工作——尤其是 heap 路由矩阵的线性代数性质——落在第三个和第四个视角上。

树的梯度稳定性:为什么不用除 √d

Transformer 必须除以 √d_k 来压方差——因为 Q·K^T 是 d_k 维全量点积,每对词之间做 d_k 次乘法再求和,方差按 d_k 线性膨胀,不除 √d_k 梯度直接爆炸。

树的判定是逐节点布尔运算——每个节点只做一次标量比较(比如 sign(w·x + b)),不跨维度累加,方差 O(1)。梯度路径深度是 log n(树深),不是 n(链长),也不是 d_k(点积维度)。三者不在一个量纲上。

Transformer: Q·K^T  →  方差 ∝ d_k  →  必须 /√d_k   →  softmax 打分
SPR 树:     每个节点一次标量判定  →  方差 O(1)  →  不用除  →  布尔排除

进一步——当树用堆数组表示时,H[i] 是节点的边界值,H[2i+1]/H[2i+2] 是左右子树的数组地址。二维 Attention 权重矩阵退化成了一维堆数组的连续查询:matmul 变成索引跳转,点积维度从 d_k 塌缩到了 1。这不是"树比 Attention 更高效"——是数据结构本身消解了数值不稳定性


License: GPLv3 本文《SPR》系列采用 GNU 通用公共许可证第三版 (GNU General Public License v3.0) 协议进行开源发布与分发。