1. 问题与动机
TransX 针对工业推荐中一个很具体、却常被“统一序列”掩盖的问题:长期用户行为流与系统曝光流不是同一种过程。搜索、浏览主页、关注、发帖等行为由用户主动产生,时间轴与某次广告或内容推荐请求并不对齐;曝光候选、上下文及点击反馈则由系统在请求时刻产生。GRM、MTGR 一类单体序列模型把两者全部 token 化后拼在一起,虽然形式统一,却模糊了“历史意图”和“当前系统决策”的不同因果角色,还会为每个服务事件重复编码长历史。
论文给出的生产约束很硬:LinkedIn 主社交推荐每天处理数亿次交互,使用 180 天行为窗口,线上需承载几十万级 QPS、数百毫秒 p99 SLA 和每请求数百个候选。传统逐事件训练让同一用户历史随每个标签反复前向;直接在线运行长序列 Transformer,又让计算和缓存随历史长度增长。作者因此把目标重新表述为序列到序列的“动作转导”:行为流负责提供可复用的长期上下文,服务流负责提出候选,模型只在两条流交叉处预测 click/no-click 等动作。
这项工作的意义不只在模型结构。论文把训练、近线编码、磁盘缓存、请求级 KV cache、冷启动回退和版本一致性作为一个共同问题处理,试图证明推荐模型扩容并不必然等比例增加线上硬件。它继承 SASRec、TransAct 和生成式推荐的序列建模能力,但把昂贵的序列计算从在线关键路径移到可摊销的近线路径。
2. 方法详解
2.1 两条流与不对称编码器—解码器
对用户 u,系统服务事件 E_t 包含本次请求的用户特征、上下文、m 个候选的物品特征和 user-item 交叉特征;反馈 Y_t 是每个候选的动作 token。用户行为流 H 则由行为主体 embedding、行为类型 embedding 和相对位置编码拼成,例如搜索、主页浏览或连接行为。两条流可以异步发生,模型学习的是 p(Y_t | E_t, H_<t)。
行为编码器由 2 层因果 Transformer 构成,Pre-LN、残差和 FFN 沿用标准设计。因果 mask 保证每个历史表示只依赖过去,因此一条 180 天行为序列可从左到右编码一次,任意服务事件只切取对应前缀,无需重新计算。相对位置偏置也使新增 token 的近线增量编码只计算新位置,旧缓存不变。
2.2 Stream Crossing:分组稀疏交叉注意力
当前候选先经 MLP 形成候选专属 query;历史编码产生的 key/value 在同一请求的所有候选间共享。这样既保留每个候选对历史兴趣的不同选择,又避免为 m 个候选重复生成 K/V。作者没有让 query 关注全部 L 个历史 token,而是使用 local-global 稀疏集合:最近 L_local 个行为表达短期意图,再加入一个通过 attention pooling 学得的全局锚点表达长期偏好。主实验取 L_local=10。
单个事件的交叉注意力因此从依赖完整历史的 O(mL) 降到 O(mL_local),而行为 K/V 可提前缓存。交叉结果与当前候选、用户及上下文特征进入解码头。论文的 action decoder 维护 click、no-click 等动作查询向量,对每个候选并行生成动作分布;query-key softmax 将动作概率估计与上游表示分开,减少 logit 尺度漂移和多任务干扰。所有候选非自回归并行解码,不会再引入候选之间的串行链。
2.3 单次 seq-to-seq 训练
传统 DLRM 逐服务事件构造样本,T 个事件就可能把同一历史重算 T 次。TransX 按用户聚合整条服务事件序列,一次前向编码 H,再对所有 E_t 计算候选动作损失;每个用户的总损失是各事件、各候选二元交叉熵之和,一次反向传播完成。复杂度从近似 O(TL²d) 变为 O(L²d + TmL_local d + Tmkd),T 不再乘在长序列编码项上。论文实测每 epoch 训练时间相对逐事件方案降低约 50%。
生产数据使用 180 天时间窗,按时间切分训练、验证和测试;真实点击正例率约 3%,训练时把 no-action 下采样到与正例相同数量,验证和测试保持真实分布。所有模型用 Adam,初始学习率 0.001,线性 warmup 后余弦衰减,验证 AUC 早停;实现基于 TensorFlow 2.11,在本地 NVIDIA H100 集群训练。Transformer 基线统一为 2 个 block,并通过宽度匹配 MFLOPs。论文没有披露 batch size、总训练步数、H100 数量和完整训练时长,这些是复现缺口。
2.4 服务侧协同设计
最重的行为编码在近线完成并存入每用户磁盘 cache;缓存表示由 float32 量化成 bf16,作者称精度影响可忽略。请求到来后只取最近窗口和全局 token,在内存构建共享 K/V,再为候选做 grouped multi-query attention 与并行动作解码。在线复杂度 O(md² + mL_local d + mkd),与总历史长度 L 无关,请求内存也被限制为 O(L_local d)。
cache 采用模型 ID 与特征 schema 双版本、TTL 淘汰和故障回退。高活跃用户由 Kafka 事件流近实时增量刷新,其他用户由 HDFS 定时批处理。无缓存或无历史用户走不含行为编码器与交叉注意力的轻量备份模型,生产约 2% 流量触发该回退;短于 10 条行为的用户无需单独逻辑。
3. 核心技术贡献
- 把异质过程显式解耦。 TransX 不再把用户行为、系统曝光和反馈压成一个单体 token 流,而以不对称 encoder-decoder 建模 p(动作 | 当前候选, 历史行为)。交叉注意力只出现在真正需要候选条件化的位置,因此比“全序列统一建模”更符合数据生成过程。
- 把 seq-to-seq 训练变成摊销机制。 因果行为编码一次服务多个事件,损失在整条事件序列上累积,昂贵历史计算从乘法项变成一次性项。该设计在保持相近离线 MFLOPs 的同时,把训练时间约减半,也为近线增量更新提供同一套前缀复用语义。
- 局部—全局稀疏交互兼顾短期与长期。 最近 10 个行为提供强时效信号,attention-pooled 全局 token 保留 180 天兴趣;候选共享 K/V 又保留各自 query。相比完整交叉注意力,离线 AUC 只少量下降,却把在线计算压到原方案约 20%。
- 模型与基础设施共同推进 Pareto 前沿。 磁盘行为缓存、请求级 KV cache、bf16、版本管理和冷启动回退不是附录装饰,而是让模型在平均 80K 请求/秒下落地的必要部分。平均 500 候选时 p99 最多降低约 80%,同时取得 CTR +6.0% 和转化 +4.4%。
4. 实验结果分析
离线数据来自 LinkedIn 最大社交推荐应用,含数亿级日交互和 180 天历史。比较对象包括生产 LiDLRM、扩容 LiDLRM、SASRec、TransAct 两种接入方式和类似 Meta GRM 的生成式基线。主要结果如下:
| 模型 | AUC | AUPR | gAUC | 离线/在线 MFLOPs |
|---|---|---|---|---|
| LiDLRM-prod | 0.846 | 0.257 | 0.636 | 80 / 80 |
| TransAct-append | 0.860 | 0.271 | 0.644 | 400 / 400 |
| GRM | 0.858 | 0.269 | 0.645 | 410 / 410 |
| TransX | 0.862 | 0.273 | 0.648 | 380 / 60 |
TransX 的离线算力与强序列模型相近,但在线 MFLOPs 仅为 GRM 的约 15%。消融更能说明结构贡献:移除交叉注意力后 AUC/AUPR/gAUC 相对下降 13.4%/10.6%/7.3%;移除行为编码器下降 28.3%/22.5%/15.8%。把稀疏 attention 换成全局 attention 虽让三项指标相对增加 4.5%/3.6%/2.1%,在线 MFLOPs 却从 40 增至 220,说明完整历史交互的边际精度代价过高。
编码器消融显示 2 层、因果 mask、相对位置偏置的 AUC 为 0.862;增加到 3 层只到 0.863。局部窗口从 5 增到 20 时,attention-pooled 全局 token 的 AUC 从 0.857 升到 0.865,主模型选 10 是效率折中。没有全局 token 时 L_local=10 只有 0.856,证明长期汇总并非可省。
50%–50% 在线 A/B 中,CTR +6.0%、转化 +4.4%,p 均小于 10^-4;平台级日活 +0.26%,主页浏览 +0.08%。实验持续 5 周。按历史长度看,长/中/短用户 CTR 分别 +6.2%/+6.0%/+5.5%,转化 +4.8%/+4.3%/+4.1%;无历史用户两项均为 0。按活跃度看,高、中、低活用户 CTR +6.6%/+5.5%/+1.8%,冷启动近乎中性,收益明显依赖可用历史。
服务实验在平均 80K 请求/秒下测试 300、400、500 候选:仅摊销编码可让 p99 降低 58%、64%、73%,再加 KV cache 后为 63%、71%、83%。更长尾的 100–300、300–500、500–1000、1000+ 候选桶中,原始模型推理 p99 为 201/255/289/330ms,完整优化后降到 43/49/58/74ms。收益在大候选集合更明显,没有出现 cache 延迟导致的质量回退。
5. 局限与未来方向
论文没有独立 Limitations 章节,但正文明确暴露了几条边界。第一,收益对历史依赖强:无历史用户在线提升为零,约 2% 流量必须使用备份模型;低活用户的 CTR 增益也显著小于高活用户。作者用回退保证“不退化”,并未解决真正的冷启动个性化。
第二,在线效果来自 LinkedIn 单一主社交推荐应用,数据和特征均不公开。论文给出 H100、优化器和学习率,却没有 batch size、训练步数、集群规模、token 词表、cache 命中率与磁盘容量,因此外部团队难以准确估算复现成本。报告的硬件节省还依赖近线 Kafka/HDFS、版本化 cache 和故障回退已经成熟,不是只替换模型即可获得。
第三,local-global 设计把大部分中远程行为压成一个全局 token。完整 attention 的离线指标更好,说明被舍弃的细粒度长期交互确实有价值;论文没有分析哪些意图被池化抹平,也没有报告兴趣突变、跨域行为或 cache 陈旧的最坏切片。作者只说明延迟刷新下结果稳定。
第四,作者将统一召回与排序列为未来方向:在共享行为/候选编码器上加入 InfoNCE 检索目标,使候选生成与动作转导共模。目前结果仍是候选集后的排序,不能证明端到端召回收益。论文也未讨论多目标动作间冲突、长期用户满意度或公平性,在线指标集中于 CTR、CVR、DAU 和浏览量。
6. 工业实践意义
对社区 UGC 搜索推荐,最可借鉴的是“数据流先分清,再决定交互位置”。可把跨产品的搜索、浏览、关注、发帖历史放入行为 encoder,近线生成用户兴趣 cache;本请求的 query、地域、频道和候选帖子作为 serving stream,仅在交叉 attention 中访问最近行为与全局兴趣。这样既避免每次排序重算长历史,也不会把系统曝光当成用户主动兴趣。
落地宜分四步。第一,复刻离线双流样本并做时间因果校验,尤其避免未来行为通过前缀泄漏;第二,用 2 层 causal encoder、L_local=10 和 attention pooling 建最小版本,对比现有 DLRM、SASRec 与全局 attention;第三,影子流量验证 cache 命中、版本切换、p50/p99、候选桶和故障回退;第四,再做用户互斥 A/B,并按历史长度、活跃度、地域与 query 类型切片。
验收不能只看总体 CTR。建议同时跟踪 nDCG、长点击或完读、转化、无历史回退比例、cache 陈旧度、近线刷新延迟、每请求 MFLOPs、磁盘占用和单位 QPS 成本。若完整 attention 离线收益很大,可增加少量按兴趣簇选出的远程 token,而不是简单把 L_local 拉长;若 cache 体系尚未成熟,应先建设幂等版本和冷启动回退,否则模型收益可能被线上不一致抵消。
TransX 还提醒团队,模型与基础设施的接口必须共同设计。行为表示需要稳定 schema、可增量位置编码和量化容忍度;服务侧要能共享候选 K/V、批量并行解码。只有这些契约在训练时就固定,才可能把 180 天行为窗口带来的质量增益转化为实际可承受的延迟与成本。