← Back to list
STCA

Make It Long, Keep It Fast: End-to-End 10k-Sequence Modeling at Billion Scale on Douyin

判别式推荐 ByteDance
Abstract 8 Reading 9 Rating —
2025-11-08
Lin Guan, Jia-Qi Yang, Zhishan Zhao, Beichuan Zhang, Bo Sun, Xuanyuan Luo, Jinan Ni, Xiaowen Li, Yuhang Qi, Zhifang Fan, Hangyu Wang, Qiwei Chen, Yi Cheng, Feng Zhang, Xiao Yang
ByteDance
提出 STCA+RLB+Extrapolation 三位一体方案,将端到端长序列推荐从 500 扩展到 10k,在抖音全流量上线并观测到类 scaling law 增益
transformer industrial parameter-scaling

Make It Long, Keep It Fast: End-to-End 10k-Sequence Modeling at Billion Scale on Douyin

1. 论文定位与核心贡献

本文来自字节跳动,解决短视频推荐中端到端长序列建模的工程与架构难题。在抖音(Douyin)场景下,用户历史行为序列通常长达数千甚至上万条。现有方案要么采用两阶段检索+排序(如 TWIN(10k)),打断端到端优化;要么使用 Transformer 自注意力,$O(L^2)$ 复杂度使序列长度难以超过 500。

本文提出三个互补组件,实现序列长度从 500 到 10k 的端到端扩展,同时满足线上延迟约束:

  1. Stacked Target Cross Attention (STCA):用 target-to-history 单查询交叉注意力替代历史自注意力,复杂度从 $O(L^2)$ 降至 $O(L)$
  2. Request Level Batching (RLB):在请求级别复用用户编码,多个候选共享同一份用户历史编码,大幅降低存储、通信和计算开销
  3. Train Sparsely, Infer Densely:训练时用平均约 2k 的短序列,推理时外推到 10k,解耦训练成本与部署序列长度

核心发现:随着序列长度和模型容量的增长,模型质量呈现类 scaling law 的单调递增趋势(Figure 1),与大语言模型中观察到的 scaling law 行为一致。

2. 方法详解

2.1 Stacked Target Cross Attention (STCA)

核心思想

排序任务中预测用户对目标 $t$ 的反馈,主要信号来自目标 $t$ 与历史物品之间的直接交互,而历史物品之间的二阶关系信息量较低。因此放弃历史序列内部的自注意力,转而使用以目标为唯一查询的单查询交叉注意力

输入编码

每个历史元素 $(v_j, a_j)$(视频特征 + 行为类型)编码为 $\mathbf{x}_j \in \mathbb{R}^d$,历史矩阵 $X = [\mathbf{x}_1, \ldots, \mathbf{x}_L] \in \mathbb{R}^{L \times d}$。目标编码为 $\mathbf{x}_t \in \mathbb{R}^d$。

使用保维度的 SwiGLUFFN 模块:

$$\text{SwiGLUFFN}(\mathbf{x}) = \left((\mathbf{x} W_u) \odot (\mathbf{x} W_o \odot \text{sigmoid}(\mathbf{x} W_o))\right) W_o \quad (1)$$

其中 $W_u, W_o \in \mathbb{R}^{d \times rd}$,$r \geq 1$,$\odot$ 为逐元素乘积。

编码后: $$\widetilde{X}^{(i)} = \text{LN}(\text{SwiGLUFFN}^{(i)}(X)) \in \mathbb{R}^{L \times d} \quad (2)$$ $$\mathbf{q}^{(1)} = \text{LN}(\text{SwiGLUFFN}^{(1)}(\mathbf{x}_t)) \in \mathbb{R}^d \quad (3)$$

多头 target-to-history 交叉注意力

第 $i$ 层、第 $r$ 个头:

$$\alpha^{(i,r)} = \text{softmax}\left(\frac{\mathbf{q}^{(i)} W_Q^{(i,r)} \left(\widetilde{X}^{(i)} W_K^{(i,r)}\right)^\top}{\sqrt{d_h}}\right) \in \mathbb{R}^{1 \times L} \quad (4)$$

$$\mathbf{o}^{(i,r)} = \alpha^{(i,r)} \left(\widetilde{X}^{(i)} W_V^{(i,r)}\right) \in \mathbb{R}^{1 \times d_h} \quad (5)$$

拼接所有头并投影: $$\mathbf{o}^{(i)} = \left[\mathbf{o}^{(i,1)} \| \cdots \| \mathbf{o}^{(i,h)}\right] W_O^{(i)} \in \mathbb{R}^d \quad (6)$$

每层成本为 $O(Ldh)$,对单目标查询为线性;而自注意力 $[t; \mathcal{H}]$ 的成本为 $O(L^2 dh)$。

堆叠与 target-conditioned fusion

堆叠 $M$ 层交叉注意力,通过可学习投影更新查询:

$$\mathbf{q}^{(i+1)} = \text{SwiGLUFFN}^{(i+1)}\left(\left[\mathbf{o}^{(1)} \| \cdots \| \mathbf{o}^{(i)} \| \mathbf{x}_t\right] W_C^{(i+1)}\right) \quad (7)$$

其中 $W_C^{(i+1)} \in \mathbb{R}^{(i+1)d \times d}$。$M$ 层后收集:

$$Z_{\mathcal{H}} = \begin{bmatrix} \mathbf{o}^{(1)} \\ \vdots \\ \mathbf{o}^{(M)} \end{bmatrix} \in \mathbb{R}^{M \times d} \quad (8)$$

预测头

将所有层的摘要与目标压缩:

$$\mathbf{z} = \text{SwiGLUFFN}\left(\left[\mathbf{o}^{(1)} \| \cdots \| \mathbf{o}^{(M)} \| \mathbf{x}_t\right] W_Z\right), \quad W_Z \in \mathbb{R}^{(M+1)d \times d} \quad (9)$$

构造混合输入 $\mathcal{X}_{\text{mix}} = \text{concat}(\mathbf{z}, \{\mathbf{u}_k\}_{k=1}^K, \{\mathbf{c}_l\}_{l=1}^C)$,其中 $\{\mathbf{u}_k\}$ 为用户侧特征(如画像),$\{\mathbf{c}_l\}$ 为候选侧特征。送入 RankMixer 预测:

$$\mathbf{h} = \text{RankMixer}(\mathcal{X}_{\text{mix}}; \Theta), \quad \hat{y} = \text{sigmoid}(\mathbf{w}^\top \mathbf{h} + b) \quad (10)$$

优化二分类交叉熵:

$$\mathcal{L}_{\text{BCE}} = -y \log \hat{y} - (1-y) \log(1 - \hat{y}) \quad (11)$$

计算优化:重排序 matmul

标准单查询交叉注意力:

$$\text{Attn}(q, X) = \text{softmax}\left(\frac{(qW_Q)(XW_K)^\top}{\sqrt{d_h}}\right) \cdot (XW_V) \quad (12)$$

需要对所有 $L$ 个 token 做两次投影。通过重排序:

$$u = (qW_Q) W_K^\top \in \mathbb{R}^{1 \times d}, \quad \alpha = \text{softmax}\left(\frac{uX^\top}{\sqrt{d_h}}\right) \in \mathbb{R}^{1 \times L}$$

$$o = (\alpha X) W_V \in \mathbb{R}^{1 \times d_h} \quad (13)$$

长度相关 FLOPs 从 $\approx 2d_h$ 缩减为 $\approx 2d_h / h \cdot 2d/h = 2d_h$...更精确地说,缩减约 $\sim 64\times$(当 $d=256, h=8, d_h=32$)。

2.2 Request Level Batching (RLB)

动机

STCA 使得每目标的序列计算为 $O(L)$(线性),但实际日志中同一用户/请求通常包含多个候选目标。若按独立三元组 $(u, v, y)$ 训练,同一历史 $\mathcal{H}$ 会被重复序列化、传输(CPU→GPU)和编码,存储和带宽成为瓶颈。

基本思想

将同一用户的 $m$ 个样本聚合为一个用户微批次 $\mathcal{B}_u = \{(u, v_k, y_k)\}_{k=1}^m$。用户/历史路径 $\Phi_{\text{user}}(\mathcal{H})$ 只计算一次,复用于所有 $\{v_k\}_{k=1}^m$。

每用户损失和总损失:

$$\mathcal{L}_u = \frac{1}{m} \sum_{k=1}^{m} \mathcal{L}_{\text{BCE}}(\hat{y}(u, v_k), y_k), \quad \mathcal{L} = \frac{1}{|\mathcal{U}|} \sum_{u \in \mathcal{U}} \mathcal{L}_u \quad (14)$$

无偏性:将常规的实例级平均替换为用户内无放回平均,期望不变(期望的线性性),RLB 只改变计算布局,不改变学习目标。

系统级收益

  • Host↔Device I/O:三元组批处理传输 $m(U+T)$,RLB 传输 $U + mT$,节约 $\approx (1-\frac{1}{m})U$。$m=8$ 时用户负载节约 87.5%,端到端实测节约 77-84%
  • 峰值内存:历史编码的中间状态(K/V 张量)在 $m$ 个目标间共享,每目标内存从 $O(L)$ 降至 $O(L/m)$
  • Kernel 效率:复用编码合并为更大的 GEMM,配合 ragged/compacted 序列减少 padding,单 GPU 吞吐提升 2.2×
  • 分布式训练:更少的用户编码减少梯度聚合和 PS/allreduce 流量,PS CPU 和模块间带宽均降低 50%

RLB 还可扩展到多请求共享:同一用户/session 的多个请求复用编码,进一步减少冗余,实测达到 8× 的带宽节约。

2.3 Extrapolation: Train Sparsely, Infer Densely

动机

STCA 使每目标计算线性于 $L$,RLB 分摊用户路径到多目标。但训练均匀长历史时,每批次 token 数仍线性增长。为解耦训练成本与部署序列长度,引入长度外推策略。

部署目标 $L_{\text{infer}} = 10k$,训练均长 $L_{\text{train}}^{\text{avg}} = 2k$,外推比 $\rho_{\text{extra}} = L_{\text{infer}} / L_{\text{train}}^{\text{avg}} = 5$。

Stochastic Length Sampling

从 Beta 分布采样归一化长度比 $s$:

$$s \sim \text{Beta}(\alpha, \beta), \quad s \in (0,1)$$

$$L_{\text{train}}^{\text{raw}} = L_{\text{train}}^{\min} + s \cdot (L_{\text{train}}^{\max} - L_{\text{train}}^{\min}) \quad (16)$$

对齐到 8 的倍数得到 $L_{\text{train}}$。给定目标均长 $L_{\text{train}}^{\text{avg}}$,由期望约束得:

$$\beta = \alpha \cdot \frac{L_{\text{train}}^{\max} - L_{\text{train}}^{\text{avg}}}{L_{\text{train}}^{\text{avg}} - L_{\text{train}}^{\min}} \quad (17)$$

序列稀疏度 (Sequence Sparsity):

$$\text{SS} = \frac{\mathbb{E}[L_{\text{train}}]}{L_{\text{train}}^{\max}} = \frac{L_{\text{train}}^{\text{avg}}}{L_{\text{train}}^{\max}} \quad (15)$$

实验表明调整 $\alpha \to 0$ 使 Beta 分布趋于 U 形(bimodal)效果最佳。

元素选择策略

给定 $L_{\text{train}}$,从完整历史(截断到 $L_{\text{infer}}$)中选择 $L_{\text{train}}$ 个元素。实验证明保留最近的 $L_{\text{train}}$ 个交互(temporal suffix)始终最优。

批次级负载均衡

变长序列导致 GPU 负载不均。引入两步批次级负载均衡算子: 1. 全局长度分配:随机截断使总 token 数恰好为 $B \cdot L_{\text{train}}^{\text{avg}}$,保证 GPU 利用率 2. 序列压缩:将序列压缩到等长 $L_{\text{train}}^{\text{avg}}$,多余 token 重分配给短序列,消除 padding

使用 Ragged Target Attention 机制处理变长压缩序列,利用辅助索引张量标记段边界,避免 padding,每个查询只关注对应的 K/V 段。

3. 实验结果

3.1 离线实验(Douyin 数据集)

评估三个目标:finish(完播)、skip(快速跳过)、head(创作者主页点击)。报告 AUC 和 NLL。

所有 baseline 均增强了 TWIN(10k)(10k 长度行为搜索的检索式模块),而本文方法移除 TWIN(10k),纯端到端建模。在匹配计算量条件下比较。

Table 1: Douyin 离线结果(相对于 Baseline: RankMixer + Single-layer Target Attention + TWIN(10k) 的变化百分比)

Model Finish ΔAUC↑ Finish ΔNLL↓ Skip ΔAUC↑ Skip ΔNLL↓ Head ΔAUC↑ Head ΔNLL↓
Baseline 0.00 0.00 0.00 0.00 0.00 0.00
DIN +0.19 -0.17 +0.23 -0.18 +0.19 -0.21
Transformer +0.25 -0.46 +0.27 -0.36 +0.38 -0.27
HSTU +0.31 -0.86 +0.52 -0.62 +0.36 -0.43
Ours (STCA+RLB+Ext) +0.49 -1.16 +0.71 -1.14 +0.39 -1.41

结论:STCA+RLB+Ext 在所有任务上取得最强改进,尽管不使用 TWIN(10k)。在 finish 上 +0.49/-1.16,skip 上 +0.71/-1.14,head 上 +0.39/-1.41。NLL 改善特别显著(如 head -1.41),说明校准能力大幅提升。各 baseline 在匹配计算下也有提升,但幅度均不及本文方法。

3.2 消融实验:架构组件(Table 2)

在 4 层 STCA(L=512)上的消融:

Component Δ AUC Notes
Enlarge sparse ID embedding: 128→320 +0.08% 视频 ID 嵌入宽度,需更小初始范围和学习率避免不稳定
Add sequence-side FFN; depth 2→4 +0.18% 历史路径上加 token-wise FFN,STCA 深度从 2L 到 4L
FFN → SwiGLU +0.11% FFN 升级为 SwiGLU,隐层宽度 ×2
Attention heads: 8→16 +0.05% 更多头提升 target-conditioned 选择性
Query fusion +0.06% 第 i+1 层拼接所有历史层摘要 $[\mathbf{o}^{(1)} \ldots \mathbf{o}^{(i)}, \mathbf{x}_t]$ 后 SwiGLU
Time-delta side info +0.08% 请求时间减物品时间戳作为 recency prior

3.3 Compute-Quality Scaling(Figure 3)

在匹配 depth/width 下比较 STCA 与 Transformer 的 FLOPs-NLL 曲线:

  • 线性 vs 二次:STCA 的序列侧 FLOPs 线性增长;Transformer 二次增长。从 $L=500 \to 10k$,STCA 从 1.06→21.06 GFLOPs(~19.9×),Transformer 从 2.08→236.26 GFLOPs(~113.6×)
  • 长 $L$ 时更优前沿:在相近 NLL(≈0.396)下,STCA 在 $L=10k$ 用 21.06 GFLOPs,Transformer 在 $L=8k$ 需 156.24 GFLOPs(~7.4× 更高)

3.4 RLB 效果(Section 4.3)

  • 带宽:$L=512$ 时减少 77%,$L=2k$ 时减少 84%
  • 吞吐:相对于逐点 baseline 1×,RLB 提供 2.2× 端到端吞吐提升;配合 kernel 优化(重排序 matmul、高吞吐 SwiGLU、优化 LayerNorm)达到 5.1×
  • 最大可训练序列长度提升约 8×(原来在长度 $L$ 受限于内存/IO,现在 $\approx 8L$ 可训练)
  • Parameter Server:PS CPU 减少 50%,训练侧 PS CPU 同步减少 50%,模块间带宽减少 50%

3.5 外推实验(Section 4.4)

Table 3: 最大训练长度的影响

Metric $L_{\text{train}}^{\max} = 2k$ $L_{\text{train}}^{\max} = 4k$ $L_{\text{train}}^{\max} = 10k$
Finish AUC lift +0.03% +0.09% +0.21%

结论:$L_{\text{train}}^{\max}$ 从 2k 增到 10k,AUC 提升从 +0.03% 增到 +0.21%,证实训练时需暴露长上下文尾部。

Table 4: 平均训练长度的影响

Metric $L_{\text{train}}^{\text{avg}} = 1.0k$ $L_{\text{train}}^{\text{avg}} = 2.0k$ $L_{\text{train}}^{\text{avg}} = 2.5k$
Finish AUC lift +0.09% +0.21% +0.22%
Sequence Sparsity 10.0% 20.0% 25.0%

结论:均长从 1k 增到 2k 有明显收益,2k 到 2.5k 收益递减。SS ≈ 20% 为最优平衡点。相比 HSTU 的 SL(SS=57.6%),本文以更低计算量达到更好精度。

Table 5: Beta 分布形状参数分析

Metric $\alpha = 0.02$ $\alpha = 0.5$ $\alpha = 10$
Finish AUC lift +0.21% +0.11% +0.08%
Shape U-shaped Decreasing Skewed

结论:U 形分布($\alpha=0.02$)效果最佳(+0.21%),优于递减型(+0.11%)和偏斜型(+0.08%),验证 bimodal 采样优化训练课程。

效率-精度权衡:10k 推理时达到 +0.23% 离线 AUC 提升,捕获完整 10k 训练增益(+0.30%)的约 80%,计算成本仅为全长训练的 1/3。线上 A/B 测试验证可行性(+0.17% finish AUC)。

3.6 Scaling Law 行为(Figure 1)

Finish AUC lift(百分点)随序列长度和模型容量变化:

序列长度 $L$ Simple (6M) Medium (23M) Complex (133M)
500 0.40 0.56 0.89
2k 0.53 1.09
10k 1.15 1.60/1.68

序列长度和模型容量同时增长时,AUC 提升单调递增,展现类 scaling law 行为。

3.7 线上 A/B 实验(Table 6)

抖音抖音极速版(Douyin Lite)上部署一个月,替换 TWIN(10k) 增强的检索特征为 STCA 端到端序列编码器。报告相对于对照组的百分比提升:

Table 6: 一个月线上 A/B 提升(%)

抖音(Douyin):

Segment 30-day Act. Stay Time Finish Comment Like
Low 0.3659% 2.0070% 5.4987% 2.6848% 2.4367%
Medium 0.3788% 1.7065% 5.2062% 0.7028% 2.1455%
High 0.1396% 1.1262% 3.7973% 1.4012% 0.1604%
All Users 0.1161% 0.9266% 3.3454% 1.5678% 1.8282%

抖音极速版(Douyin Lite):

Segment 30-day Act. Stay Time Finish Comment Like
Low 0.3575% 1.3888% 6.2808% 6.3385% 3.1623%
Medium 0.2832% 1.3172% 5.9688% 5.7934% 5.6372%
High 0.0987% 0.9872% 4.9922% 2.8496% 3.1752%
All Users 0.1281% 0.8467% 4.2275% 2.6167% 2.3828%

结论:两个产品在所有指标和所有用户分层上均获得一致且显著的正向提升。Finish 和 App Stay Time 整体提升,互动信号(Comment、Like)大幅上涨。低/中活跃度用户获益最大,说明长历史建模对稀疏/噪声行为的个性化效果尤为显著。30-day Activeness 也稳定提升。

4. 系统实现细节

训练课程(Appendix A.1)

  • 先在 $L=512$ 预训练建立稳健的 token 级滤波和注意力模式
  • 再在 $L=2048$ 继续训练
  • 架构迭代阶段在 $L=512$ 原型化以降低资源消耗
  • 集成到更大生产栈时,先训练序列子网络至收敛,加载参数到复合模型,最终联合微调

推荐操作点

4 层 STCA(含 SwiGLU 和 query fusion)+ time-delta 特征 + RLB + 随机长度训练(小 $\alpha$,训练均长 ≈ 2k)+ 推理长度 10k(5× 外推比)。

5. 相关工作与讨论

本文关键区分点:

  • 与两阶段方法(SIM、UBR4CTR、TWIN/TWIN-V2)相比:STCA 在完整历史上执行端到端单查询交叉注意力,避免检索/截断,保持全程可微
  • 与用户表征压缩方法(PinnerFormer)相比:直接在完整序列上操作,不做压缩近似
  • 与稀疏注意力/工程方法(SAMN、Sparse Attention)相比:RLB 在请求/用户级别分摊,正交于 kernel 级优化
  • LLM 中的长度外推(ALiBi、RoPE、Longformer、BigBird):本文将"train sparsely, infer densely"思想适配到推荐场景,利用 STCA 的线性复杂度和 RLB 的分摊使外推在生产中可行

6. 总结与评价

优势

  • 三组件方案互补性强,STCA 解决架构复杂度、RLB 解决系统开销、外推解决训练成本
  • 在抖音全流量验证,线上效果显著(Finish +3.3%/+4.2%),为工业级长序列方案提供了完整路径
  • Scaling law 行为的发现对推荐系统领域有启示意义
  • 实验充分,消融、scaling 分析、外推策略分析、线上 A/B 均覆盖

局限

  • STCA 去掉历史自注意力后丢失了序列内二阶关系,论文认为在排序任务中这些信息量较低,但在某些场景(如强时序依赖)可能有损
  • 线上实验只报告了相对提升,未给出绝对指标值
  • 外推比 5× 的理论分析较少,主要靠经验验证