链→树→图:数据结构谱系
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) 协议进行开源发布与分发。