ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Meta广告排序实战:多阶段序列模型与LLM扩展定律的工程启示

Meta广告排序实战:多阶段序列模型与LLM扩展定律的工程启示

如果你正在处理海量用户行为数据,并且想知道如何从这些看似杂乱的时间序列里,预测下一个点击、购买或转化,那么 Meta 在广告排序中应用的多阶段序列模型,以及它背后与 LLM 相似的扩展定律,是一个绕不开的实战案例。这不仅仅是学术论文里的概念,而是直接影响着每天数十亿次广告展示效果的核心工程实践。

很多人一听到“序列模型”就想到 RNN、LSTM,但在 Meta 这种体量的场景下,问题要复杂得多:用户行为序列长、噪声大、目标稀疏(比如最终转化事件很少),而且需要在极短的延迟内完成预测。更关键的是,随着模型和数据规模的扩大,性能提升的规律是什么?是否像训练大语言模型(LLM)一样,也存在一个可预测的“扩展定律”?

这篇文章不会复述论文,而是从一个工程落地的视角,拆解这套多阶段序列模型的核心思路、实现要点,以及最重要的——如何借鉴 LLM 的扩展定律思想,来规划和评估你自己序列模型的迭代路径。无论你是算法工程师、数据科学家,还是负责广告、推荐系统的技术负责人,这里面的设计权衡和规模化管理经验都值得一看。

1. 先拆解问题:为什么广告排序需要“多阶段”序列模型?

单看“用户序列”和“广告排序”这两个词,似乎用个时序模型就能解决。但在真实的生产环境里,直接用一个庞大的端到端模型处理所有信息,既不现实,也不高效。Meta 采用多阶段架构,根本上是工程和效果权衡的结果。

1.1 核心挑战:从稀疏信号到实时决策

想象一下,你要为一个用户决定展示哪条广告。你拥有他过去一段时间内的点击、浏览、搜索、加购等行为序列。这个序列可能长达几百甚至上千个事件,但真正能明确指向“会点击某个广告”的信号却非常稀疏。同时,你需要在毫秒级时间内,从上百万的广告候选集中做出选择。

这里有几个无法回避的矛盾:

  • 计算复杂度与延迟的矛盾:用最复杂的模型处理最长的序列和最全的候选集,延迟必然超标。
  • 信号稀疏与模型容量的矛盾:简单模型抓不住长序列中的微弱模式,复杂模型又容易过拟合噪声。
  • 特征实时性与系统稳定性的矛盾:用户最新的一次点击是否要立刻更新序列特征?如何保证更新的实时性和服务的一致性?

多阶段模型,本质上是一种“分而治之”的策略,把“大海捞针”的问题,拆解成“先圈定海域,再精准打捞”的流水线。

1.2 典型的多阶段架构拆解

虽然 Meta 的具体架构细节属于内部工程,但业界通用的模式可以概括为以下几个阶段,其思想是相通的:

  1. 召回阶段(Retrieval/Candidate Generation)

    • 目标:从百万级广告库中,快速筛选出数百或数千个相关候选。
    • 序列使用方式粗粒度、高效率。通常不会使用完整的原始序列。而是将用户序列通过轻量级模型(如双塔模型)编码成一个固定的“用户向量”,同时每个广告也有一个“广告向量”。通过向量近似检索(如 ANN)快速找出 top-K 候选。这里的序列信息被高度压缩和概括。
  2. 粗排阶段(Pre-ranking/Coarse Ranking)

    • 目标:对召回阶段的数百个候选进行初步打分,进一步筛选出几十个最有希望的。
    • 序列使用方式中等粒度、平衡效率。可能会引入比召回阶段更丰富的序列特征,例如用户最近 N 个行为的聚合统计特征(如点击品类分布、平均停留时长),或者使用轻量级的序列模型(如浅层 Transformer)对短序列进行建模。模型复杂度高于召回,但远低于精排。
  3. 精排阶段(Ranking)

    • 目标:对粗排输出的几十个候选进行精准打分和排序,决定最终展示顺序。
    • 序列使用方式细粒度、高精度。这是序列模型发挥核心作用的地方。模型可以获取相对完整的用户行为序列(经过截断或采样),并结合当前候选广告的上下文信息,进行精细的交叉注意力计算。模型结构最复杂,通常是深层的 Transformer 或它的工业变体。
  4. 重排/混排阶段(Re-ranking)

    • 目标:在精排结果的基础上,考虑业务规则、多样性、新鲜度等非点击率目标,进行最终微调。
    • 序列使用方式策略性使用。可能不仅考虑用户自身序列,还会考虑本次展示会话内的序列,以避免重复推荐。

注意:不要试图用一个模型解决所有问题。多阶段的核心思想是让合适的模型做合适的事。召回追求快和全,精排追求准和细。在设计你自己的系统时,首先要明确每个阶段要解决的核心子问题是什么。

2. 用户序列如何建模:从特征工程到端到端学习

有了多阶段的框架,接下来就是核心问题:如何把用户的一串行为([view_A, click_B, search_C, ...])变成模型可以理解并有效利用的信息?

2.1 传统特征工程方法:可控但表达能力有限

在深度学习普及之前,以及在一些对实时性要求极高的场景,特征工程仍然是主流。

  • 统计特征:这是最常用的。例如,用户过去1天/7天/30天的点击总数、点击率、对特定品类的偏好强度、最后一次行为的时间间隔等。这些特征稳定、可解释,但无法捕捉复杂的序列模式。
  • 序列嵌入池化:先将每个行为事件(如商品ID、品类ID)通过 Embedding 层映射为向量,然后对一段时间内的所有行为向量进行池化操作(如 Sum Pooling, Mean Pooling, Weighted Sum)。这种方法比统计特征能保留更多信息,但丢失了顺序信息。
  • Session 划分:将长序列按时间间隔(如30分钟)切分成多个 Session,分别提取 Session 级别的特征,再聚合。这比处理整个长序列更灵活。

何时用:当你的数据量不大、序列长度相对固定且较短、或者对模型推断速度有极端要求时,特征工程仍然是可靠的选择。它也是构建基线模型(Baseline)的快速手段。

2.2 深度学习序列模型:从 RNN 到 Transformer

为了捕捉序列中的长期依赖和复杂模式,深度学习模型是更优解。

  1. RNN/LSTM/GRU:经典的序列模型,能处理变长序列,但难以并行训练,且对超长序列的记忆能力会衰减。在广告排序场景,用户序列可能非常长,直接使用 RNN 族模型挑战较大。
  2. Transformer:目前的主流选择。其核心是自注意力机制,可以并行计算,并能建模序列中任意两个位置的关系。
    • 优势:强大的表达能力,尤其适合捕捉用户兴趣的转移和演变。
    • 挑战:计算复杂度与序列长度的平方成正比(O(n²))。对于超长序列(如1000个事件),直接使用全量 Transformer 计算开销巨大。

2.3 工业级实践:对 Transformer 的改造

Meta 等大厂不会直接使用标准的 Transformer,而是会进行大量工程优化:

  • 序列长度处理
    • 截断:只保留最近 N 个行为(如最近的100个)。这是最简单有效的方法,假设近期行为影响最大。
    • 采样:从长序列中随机或有策略地采样出 M 个行为(如采样50个)。可以保留更长期的信息,但可能丢失连续性。
    • 层次化建模:先对短序列(如每次会话)用 Transformer 编码,得到会话向量,再将多个会话向量作为新序列输入给另一个模型。这是处理超长序列的常用技巧。
  • 特征交叉:在精排阶段,不仅要建模用户序列,更重要的是建模“用户序列-候选广告”的交叉特征。这通常通过 Transformer 的Cross-Attention机制实现。用户序列作为 Query,候选广告的特征作为 Key 和 Value,让模型去关注序列中与当前广告最相关的部分。
  • 实时更新:用户的序列是动态变化的。工业系统通常采用“近实时更新”策略。用户产生新行为后,通过流处理系统(如 Flink)快速更新用户特征向量或序列索引,在下次请求时就能生效。但这要求特征服务具备高吞吐和低延迟的能力。

我的建议是:先从截断或采样的 Transformer 开始实验。选择一个合理的序列长度(如50或100),搭建一个精排模型。验证序列模型相比静态特征模型带来的提升。这是从0到1的关键一步。

3. 从 LLM 扩展定律中获得的启示:规模化的指导原则

这是本文最值得深入思考的部分。我们训练模型时,常凭感觉增加数据、放大模型,但效果提升是否线性?成本增加是否值得?LLM 领域著名的Scaling Laws(扩展定律)给了我们一个量化分析的框架。Meta 将类似思想应用于广告排序模型,揭示了模型性能与规模之间的规律。

3.1 什么是 LLM 的扩展定律?

简单说,扩展定律描述了语言模型的性能(通常用验证集损失表示)与三个关键规模因素之间的幂律关系:

  • 模型参数量(N)
  • 训练数据量(D)
  • 计算量(C)

其核心发现是:在数据充足、模型未过拟合的情况下,性能随着规模扩大而可预测地提升。这改变了“盲目试错”的研发模式,使得团队可以更有信心地进行资源规划和技术选型。

3.2 如何映射到广告排序序列模型?

广告排序模型的最终目标是提升线上业务指标(如点击率CTR、转化率CVR、收入RPM)。我们可以借鉴扩展定律的思想,寻找我们场景下的“规模”变量和“性能”变量。

  • 规模变量(Scaling Factors)

    1. 模型容量:不仅仅是参数量,还包括 Transformer 的层数(深度)、隐藏层维度(宽度)、注意力头数。对于序列模型,序列最大长度(L)也是一个极其关键的规模变量。
    2. 训练数据量:用于训练的用户-广告交互日志的数量和质量。注意,这里的数据量不是简单的条数,而是独立用户或独立会话的规模,以及序列的丰富程度。
    3. 特征丰富度:使用的特征类型和维度。引入更多侧信息的特征(如用户画像、广告素材特征、上下文特征)也是一种“数据”层面的扩展。
    4. 计算预算:训练所用的 GPU 时数或 TPU 时数。
  • 性能变量(Performance Metric)

    • 离线指标:验证集上的 LogLoss、AUC、GAUC 等。
    • 线上指标:A/B Test 中的 CTR、CVR、RPM 提升。

3.3 实践中的扩展规律观察

根据公开研究和工程经验,在广告排序场景中,通常可以观察到以下规律:

  1. 性能随模型容量和序列长度增加而提升,但存在收益递减点:初期,增加模型层数或序列长度,离线 AUC 会有显著提升。但当模型复杂到一定程度,或序列长度超过真实用户兴趣的有效窗口后,提升会变得非常缓慢,甚至因过拟合而下降。你需要找到自己业务场景下的“甜蜜点”
  2. 数据量的扩展至关重要,且可能比模型容量更有效:在模型结构合理的前提下,增加高质量、多样化的训练数据,往往是提升效果最稳定、最可持续的途径。这要求有强大的数据管道和负样本采样策略。
  3. 计算量并非越大越好,需要高效利用:盲目增加训练轮数或使用超大 batch size,可能会浪费计算资源。更聪明的做法是使用自适应优化器、学习率 warmup 和衰减,以及混合精度训练,让固定的计算预算产生更好的效果。

一个实用的扩展分析框架: 当你计划升级排序模型时,可以尝试设计一个小的“扩展实验”:

  1. 固定数据和特征,逐步增大模型容量(如 2层->4层->8层 Transformer),记录离线 AUC 和训练时间。
  2. 固定模型,逐步增加训练数据量(如 1周数据->1月数据->3月数据),记录指标变化。
  3. 将结果绘制在双对数坐标轴上,观察是否存在近似的幂律关系。这能帮你预测,如果想将 AUC 提升 0.001,大概需要增加多少资源。

核心洞见:扩展定律的价值不在于那个精确的公式,而在于它提供了一种系统化的思维方式。它告诉我们要有规划地探索规模维度,用数据驱动决策,而不是靠直觉“调大试试”。这对于管理大型机器学习项目的资源分配至关重要。

4. 构建你自己的多阶段序列模型:从实验到生产的路径

理解了原理和规律,我们来看如何动手实现。这个过程可以分为离线实验和在线部署两大环节。

4.1 离线实验与模型开发

  1. 数据准备与样本构建

    • 正样本:用户点击或转化了广告的日志。
    • 负样本:这是关键。不能只用展示未点击的样本,因为广告系统本身是有偏的。常用方法包括:
      • 曝光未点击:最直接,但存在选择偏差(系统之前展示的已经是它认为好的)。
      • 全局随机负采样:从全量广告库中随机抽取作为负样本,有助于模型了解全局分布。
      • Batch 内负采样:在同一个训练 batch 内,将其他样本的广告作为当前样本的负例,效率高。
    • 序列构建:为每个训练样本,关联该用户在此次交互之前的一段行为序列。注意严格防止数据穿越,必须使用时间戳确保序列信息只来自“过去”。
  2. 模型结构选型与实现

    • 精排模型:建议以Transformer Encoder为基础进行改造。可以使用 Hugging Face 或 TensorFlow 的现成模块快速搭建。
    • 输入层:将用户行为序列中的每个事件(商品ID、类型、时间差等)进行 Embedding 和拼接,形成序列矩阵[seq_len, feature_dim]
    • 序列建模层:将序列矩阵输入 Transformer Encoder,得到每个行为位置的增强表示。
    • 兴趣提取层:对 Transformer 的输出进行处理,得到代表用户当前兴趣的单一向量。常用方法有:
      • 取最后一个位置的输出:假设最后的行为最重要。
      • 加权求和(如 Target Attention):让候选广告与序列每个位置做注意力,加权聚合序列信息。这是更主流的方法。
    • 输出层:将用户兴趣向量与候选广告向量、以及其他上下文特征拼接,通过多层全连接网络,输出最终的点击率预估值。
  3. 训练技巧

    • 损失函数:二分类交叉熵(Log Loss)。
    • 优化器:Adam 或 AdamW。
    • 正则化:Dropout 在 Transformer 各层之间和全连接层中使用非常有效。Early Stopping 根据验证集 Loss 来防止过拟合。
    • 评估指标:首要看AUC,同时关注GAUC(按用户分组计算的 AUC,更能反映个性化排序能力)和LogLoss

4.2 在线服务与部署考量

离线 AUC 高不代表线上有效。线上部署要考虑更多工程约束。

  1. 模型轻量化与加速

    • 模型蒸馏:用大模型(教师模型)的输出指导一个小模型(学生模型)的训练,让小模型逼近大模型的效果。
    • 量化:将模型权重从 FP32 转换为 INT8 甚至更低精度,大幅减少模型体积和加速推断。TensorRT、OpenVINO 等工具对此支持很好。
    • 剪枝:移除模型中不重要的权重或神经元。
    • 序列长度优化:线上服务时,对序列进行动态截断或采样,确保绝大多数请求的序列长度在一个可控范围内,避免长尾请求拖慢整体延迟。
  2. 特征服务

    • 用户序列特征需要实时或近实时更新。这通常需要一个独立的特征存储系统(如 Redis、Cassandra 或专用的特征平台),由流计算作业实时写入用户的最新行为。
    • 模型服务时,通过用户 ID 从特征服务中拉取最新的序列 ID 列表,再进一步查询 Embedding 等服务,组装成模型输入。这个过程要追求极致的低延迟。
  3. A/B 测试与迭代

    • 新模型必须通过严格的A/B 实验才能全量上线。实验要观察核心业务指标(CTR,CVR,RPM)和系统指标(延迟,CPU/内存使用率)。
    • 建立自动化的模型训练-评估-部署流水线(MLOps),是持续迭代的基石。

5. 避坑指南:实战中常见的陷阱与排查思路

即使理论清晰,代码跑通,在真实场景中依然会踩坑。下面是一些高频问题点。

5.1 离线指标上涨,线上效果不变甚至下降

这是最令人头疼的问题。排查顺序如下:

  1. 检查数据穿越:这是头号杀手。确保训练样本中的特征(尤其是用户序列)在时间上严格早于标签发生时间。一个检查方法是:用“未来”的数据做特征,在离线环境下也能得到虚假的高指标。
  2. 检查线上-离线特征一致性:离线训练时特征是怎么生成的?线上服务时是不是同一个逻辑?特别是涉及实时更新的序列特征,两者的更新频率和逻辑必须完全对齐。建议对线上请求进行采样,将特征落盘,与训练样本进行对比。
  3. 检查样本分布:线上服务的流量分布和训练数据的分布是否一致?例如,新用户、冷门广告在训练数据中可能占比很少,模型对其预测不准。可以分析模型在不同用户分群或广告分群上的表现。
  4. 评估指标是否片面:离线只看了 AUC,但线上业务可能更关注 Top-1 的准确性,或者需要兼顾多样性。GAUC 和 NDCG 等指标可能更有参考性。

5.2 模型服务延迟过高

序列模型,尤其是带长序列的 Transformer,推断延迟是主要瓶颈。

  1. 定位瓶颈:用性能剖析工具(如 TensorFlow Profiler, PyTorch Profiler)分析推断过程中,时间是耗在模型计算上,还是特征获取、数据预处理上。
  2. 优化序列长度:分析线上真实用户序列的长度分布。可能 95% 的序列长度都小于 50,那么为 1000 的长度设计模型就是浪费。根据分布确定一个合理的截断长度(如覆盖 90% 请求的长度)。
  3. 使用更高效的注意力机制:标准 Transformer 的自注意力是 O(n²)。可以考虑使用Linear AttentionReformer等近似注意力机制,它们能降低长序列的计算复杂度。
  4. 硬件与推理引擎优化:使用 TensorRT、ONNX Runtime 等针对特定硬件(如 NVIDIA GPU)优化的推理引擎,并进行图优化、算子融合等。

5.3 长期迭代中的效果停滞

模型迭代几次后,发现效果提升越来越难。

  1. 回归扩展定律分析:检查是否在模型容量、数据量、序列长度等维度上遇到了瓶颈。尝试开辟新的“扩展维度”,例如引入全新的特征类型(如多模态的广告素材特征)、更细粒度的用户行为(如页面滚动、鼠标停留)。
  2. 重新审视负样本:负样本的质量极大影响模型对正样本的区分能力。尝试更复杂的负采样策略,如“困难负样本挖掘”。
  3. 尝试新的模型结构:Transformer 是主流,但并非唯一。可以探索结合了序列建模和动态兴趣网络的混合结构,如DIN(Deep Interest Network)DIEN(Deep Interest Evolution Network)等,它们在某些场景下对兴趣演化建模更有效。
  4. 考虑多任务学习:不仅预测点击率(CTR),同时预测转化率(CVR)、观看时长等。多个任务共享序列建模层,利用任务间的相关性进行联合训练,可能带来泛化能力的提升。

最后想说的是,构建一个工业级的广告排序序列模型,是一个融合了算法创新、数据工程和系统优化的复杂工程。不要期望一蹴而就。最稳妥的路径是:先从一个小而简单的序列模型开始,在离线环境验证其价值;然后解决线上服务的关键问题(特征一致性和延迟);接着通过 A/B 实验获得正向反馈;最后,再借鉴扩展定律的思想,系统化地规划模型的规模化演进。在这个过程中,对业务场景的深刻理解,往往比追求最前沿的模型结构更重要。

返回列表