关于自研序列架构 Beta12Transformer 的技术文章。
参考实现:tnl_torch/torch_models.py中的Beta12Transformer/Beta12Layer,
测试配置t19_flash、beta_1.2_test及其消融臂族。
1. 一句话定位
beta_1.2 在标准 decoder-only Transformer 的骨架完全不变(残差流 + pre-norm + SwiGLU + 因果掩码 + next-token 预测)的前提下,唯一改动一处:每层注意力的 KV 源不再只取前文的当前层表示,而是取前文 token 已完工的更深层的表示。这个改动把"模型深度"从串行堆叠的层数,变成一个可以沿上下文长度免费生长的维度。
2. 动机:标准 Transformer 的深度天花板
标准 Transformer 有两个深度相关的天花板:
- 串行深度恒等于层数 L。每跳回一个 token 必须降一层(层 l 的注意力读层 l 的 KV),信息在 token 维度的传播与深度轴是绑死的。要传播 T 步串行依赖,就需要 T 层——这在长上下文推理(状态跟踪、多步组合、代码数据流)中是不现实的。
- 循环加深要花真金白银。层间循环/迭代方案(Universal Transformer、looped Transformer)用同一组权重重复应用 R 次来扩深度,但每 token 计算量变成 R×L——深度是用 FLOPs 买的,且权重循环带来训练稳定性问题。
beta_1.2 的出发点:token 反正要逐个生成,让同层权重沿 token 链复用(RNN 式的水平链)是免费的串行深度。问题只在于:如何让一个 token 在一次前向里读到前文"已经算得更深"的信息?答案是直接把 KV 的来源扩展到深度轴。
3. 核心机制
3.1 施工态与成品
- 施工态:token 当前正在第 l 层被加工时的输入残差流
h^(l-1)(还没算完)。 - 成品:token 已完成第 m 层计算后的表示
h^(m)(对 m 层来说已完工)。
标准 Transformer 中,层 l 的注意力里,query 与 KV 都取自施工态(本层输入)。beta_1.2 中:
- query 来自本 token 的施工态
h_i^(l-1); - KV 来自前文 token 的成品
h_j^(m),且允许 m ≥ l(同层或更深)。
两侧来自不同 token、不同层,天然是 cross-attention。
3.2 KV 源集合(形式化定义)
S(i,l)={(j,m):j<i, l≤m≤top(l)}∪{σ},top(l)=min(l+k, L−1) S(i,l) = \{(j,m) : j < i,\; l \le m \le \mathrm{top}(l)\} \cup \{\sigma\}, \qquad \mathrm{top}(l) = \min(l+k,\, L-1)S(i,l)={(j,m):j<i,l≤m≤top(l)}∪{σ},top(l)=min(l+k,L−1)
即:层 l 的注意力可以读取前文所有 token 在层 l…l+k 的成品 KV,外加一个自身槽位 σ。其中 k 是深度窗口(depth_window),是本架构的核心超参数。
3.3 一次 softmax 里的三组 key
| 组 | 来源 | 掩码 | 说明 |
|---|---|---|---|
| ① 跨层窗口组 | 更早块中前文 token 在层 l…top(l) 的成品KV | 仅 j < i | 每组一个源层 m;KV 经过该层自己的 RMSNorm 与 K/V 投影 |
| ② 块内组 | 本块内 j ≤ i 的施工态KV(源 = 本层输入) | 严格下三角 | c=T 时①为空,②即完整因果注意力 |
| ③ 自身槽位 σ | token 自己 | 对角线 | 深度偏置取 0,另加每层可学习标量 b_σ |
3.4 深度轴的相对位置编码
深度窗口让"读第几层"成为新的自由度,必须告诉模型它在读多深。两个机制,都只走注意力通路:
- 深度偏置:每头一个标量 λ_h,对跨层组分数减
λ_h·(m−l)(组序号 g)。λ_max 上界约 2.0,depth_bias开关控制。 - 层编码:每层一对可学习向量 e_m^K / e_m^V 直接加进 KV 投影输出,f_l 加进 Q(
layer_enc开关)。
3.5 参数量与标准层同构
每个 Beta12Layer 的参数 = 4d²(QKVO)+ 3·d·hidden(SwiGLU)+ 2d(两个 RMSNorm),与标准层完全一致。新增仅:每层 e_k/e_v/f_q 三个 d 维向量(O(Ld))、每头一个 λ_h、每层一个 b_σ。同参数公平对比成立——消融实验用resolve_fair_config协议(同参数预算下缩放宽度/层数)保证这一点。
4. 依赖图与波前调度
m > l 的成品要等层 m 算完才存在,因此前向计算必须沿反对角波前推进:token 每减 1、层升 k。
实现上按块切分(block_size = c),这是理解该架构的关键开关:
- c = 1:严格按规范逐单元串行,块内无任何近似,墙钟最贵(约 T×L 倍标准前向的关键路径)。
- c = T:整段一块,历史集合为空,只剩块内严格下三角注意力——精确退化为标准 RoPE Transformer。这既是理论上的特例,也是实现正确性的自检臂。
- 中间值(如 c = 32):块内各层的跨层源 =之前块的成品 KV(增量 KV 在整块完成后才整体重绑,块内读到的始终是块开始时的状态)。块内读不到本块更早 token 的深层成品,是对规范的小偏差,但换来块内大矩阵并行。
消融结论:c 对质量的影响在噪声级(见 §7),对速度影响巨大——c 越大越快。
5. 深度分析:两种口径
口径一:单跳聚合深度 = L + k
一个 token 一次前向内,最深读到的成品经过了 (top(0)+1) 次层计算,再爬完自身栈。对 t19_flash(L=4, k=2):6 次层应用。这是"表达深度"的保守口径,注意它是同权重栈的复用,不是异权重堆叠。
口径二:链式串行深度 ≈ (T/c) × L,随 seqlen 线性增长
层 l 的块内组构成水平链(i,l) ← (i-1,l) ← ...(RNN 性质)。串行关键路径约 (T/c)×L:
| 架构 | 串行深度 | 深度的成本 |
|---|---|---|
| 标准 Transformer | 恒为 L | — |
| 层间循环 TF(looped) | R × L,恒定 | 每token R×L 次层应用(真金白银的 FLOPs) |
| beta_1.2 | (T/c) × L,随上下文增长 | 链是因果结构免费给的;每 token 只花 L×(1+α) 次层应用(α≈跨层组开销) |
这是 beta_1.2 与循环 TF 的本质区别:循环 TF 是"每 token 自适应加深"(可控但要买),beta_1.2 是"随上下文自动加深"(免费但不可控)。对串行依赖超过物理层数的任务(长状态跟踪、长链组合推理),beta_1.2 原理上没有固定层数上限。
6. 推理与工程实现
6.1 两种推理模式
- 增量解码:state 接口与标准 Transformer 的逐层 (K,V) 缓存格式一致,可直接增量解码。
- 有状态 RNN 模式(
inference_mode='auto'):首轮对前缀做一次 prefill,之后每步只算最新 token + 缓存状态,O(1) 每 token——链深度带来的 RNN 性质在推理端兑现为常数成本。
6.2 生产路径:use_sdpa
把跨层窗口组 + 块内组 + 自身槽位合并为单一 KV 序列,深度偏置、因果掩码全部编码进加性 float bias,一次F.scaled_dot_product_attention完成(flash kernel,不物化 attn 矩阵)。三组 key 的语义完全保留,只是调度方式合并。
6.3 确定性与显存
- KV 增量按块累积、块完成后整体重绑:块内读到的始终是块开始时的状态,梯度检查点重算读同一引用,数值确定性成立。
- 按波前块做梯度检查点:把跨块 KV 拼接链的中间激活峰值压到"一个块"的量级,长上下文/大模型训练不爆显存。
- 可选
qk_norm(Q/K 投影后 RMS 归一)与deep_token_window(深层源组只看最近 w 个 token,长上下文下控制跨层组检索成本)。
7. 实验证据(消融)
7.1 c(block_size)消融——质量噪声级,速度敏感
~10M 参数、20k batch、B=16、seed 42(summary_20260925_021817):
| 模型 | test loss | ppl | 时间 |
|---|---|---|---|
| beta_1.2_test (c=32) | 2.6924 | 14.77 | 0.876 s/batch |
| beta_1.2_c256 (c=256) | 2.6951 | 14.81 | 0.124 s/batch |
| t16_std_tf_rope(标准 TF 对照) | 2.6947 | 14.77 | 0.094 s/batch |
c=32 与 c=256 的质量差 ~0.003(噪声级),速度差 ~7×;prefill 基准(@8192 上下文)同样显示 c 大幅加速(0.24 vs 1.45 ms/tok)。c 是纯效率旋钮,k 才是效果杠杆。
7.2 深度效率消融——10 层跨层模型打平 20 层标准 TF
同参数公平协议(物理层数减半、加宽 SwiGLU 补齐总参数)、600 batch(内部实验记录summary_20260925_105014):
| 模型 | 配置 | test loss | 时间 |
|---|---|---|---|
| t16_std_tf_rope | L=20 标准 TF | 2.8139 | 0.094 s |
| beta_1.2_de10k6 | L=10, k=6 | 2.8125 | 0.398 s |
| beta_1.2_de10k2 | L=10, k=2 | 2.8128 | 0.341 s |
| beta_1.2_stride2 | L=10, 深度采样步长2 | 2.8169 | 1.289 s |
- 半物理层的 beta_1.2 打平/略优于全深度标准 TF(等效倍率约 2×),且与 k 关系不大——深度主要来自链,深度窗口的边际收益递减快。
- 代价是墙钟慢 3.6–4.2×(训练时块间串行的账,目前用 c=32 部分偿还)。
7.3 早期串行能力证据
beta_1 的串行测试台(变量搬运通道):n8 0.859→0.968,n32 0.374→0.432——链深度确实在做标准 TF 结构上做不到的事,但长链利用率不完全,这是当前明确的短板与改进方向。
8. t19_flash:当前主力配置
't19_flash':{'vocab_size':-1,'d_model':1600,'hidden_dim':3200,'num_heads':8,'num_layers':4,'dropout':0.0,'max_seq_len':16384,'depth_window':2,'block_size':32,'lambda_max':2.0,'depth_bias':True,'layer_enc':True,'self_slot':True,'qk_norm':False,'deep_token_window':0,'tie_embedding':True,'use_sdpa':True,},约 0.19B 参数(含 tied embedding)。物理上只有 4 层,单跳聚合深度 6,串行深度在 16K 上下文下关键路径约 (16384/32)×4 ≈ 2048 次层应用——以 4 层的钱买循环 500 轮的依赖深度。
9. 相关工作定位
- 标准 Transformer:c=T 特例,是本架构的自检臂。
- RNN / 状态空间模型:共享"串行深度随序列增长"的性质,但 beta_1.2 保留了注意力一次检索全上下文的宽度优势,且 KV 范式与现有推理栈兼容。
- Universal / looped Transformer:同为权重复用扩深度,但方向不同——循环 TF 在深度轴循环(每 token 付 R×L FLOPs),beta_1.2 在序列轴循环(链深度免费)。相同 FLOPs 预算下,looped 的 R 被压缩,beta_1.2 的深度/算力比更高;looped 则保留 per-token 自适应计算(ACT)的优势。
- 跨层 KV 复用(CLA 类):那些工作是复用 KV省算力;beta_1.2 是读取更深层 KV扩能力,方向相反。
10. 局限与进行中的工作
- 训练墙钟:块间串行使同参数训练比标准 TF 慢数倍;c 调大可偿还大部分,但块内施工态注意力的显存随 c 增长,存在权衡。
- 深度窗口边际递减:k=2→k=6 几乎无增益,深度来源已经从"窗口"转移到"链",窗口更多是给链提供重组接口。
- 长链利用率:串行深度纸面无限,实际利用受训练梯度穿过链的程度限制(beta_1 搬运通道证据)。
- 评测口径:现有结论均为 LM loss 口径、单 seed、早期 batch 数(600–20k);推理能力(编程、状态跟踪)的同台对比尚未完成。已规划的方向:参数公平 sweep 标准 TF 层数、串行状态跟踪测试台、与 looped TF 臂的直接对比。
11. 总结
beta_1.2 用一个最小侵入的改动——把注意力的 KV 源沿深度轴打开——同时拿到了三样东西:
- 免费生长的串行深度(RNN 性质),突破固定层数的推理天花板;
- 与标准 Transformer 完全同构的参数量与骨架,公平可比、即插即用;
- c=T 退化为标准 TF 的理论闭环,使它成为标准架构的严格超集而非另一个模型。
它的性格可以概括为一句话:深度不靠堆层,靠上下文。
实验数据来源于小思框架内部,所有消融为单 seed 结果,解读请参考 §10 的局限性说明。