行业洞察

Aarki 的竞标大脑进化,第 1 部分:深度学习助力移动增长

2025 年 8 月 22 日

关于作者

Ben Weber 是 Aarki 的机器学习副总裁,负责构建更智能的模型,支持每秒数百万个实时竞价决策。他曾在 McAfee、Zynga、Twitch 和 EA 担任高管。从构建竞价器到重写预测流程,他的经验都是实践经验、生产级经验,并且经过了实际检验。

机器学习是 Aarki 需求方平台 (DSP) 的核心,我们在处理的每个出价请求中都运用深度学习模型。为广告技术构建原型、部署和调整深度学习模型是一个持续的过程,而这种能力使我们能够持续改进平台,为广告主带来更佳的业绩。

在本文中我们将讨论:

  • 我们从经典定价模型转向深度学习的动机
  • 我们的第一代深度学习模型概述
  • 我们正在构建的下一代模型
  • 我们的基础设施以及我们如何使用 GPU 进行扩展

为什么我们不使用云平台进行机器学习

我们内部处理超过 500 万 QPS

我们的 DSP 部署在全球四个不同的数据中心,这些数据中心的交易地点与 Unity、Google Adx 和 Fyber 等程序化广告交易平台位于同一地点。

拥有硬件可节省每个请求的成本

我们投资了硬件,用于处理来自交易所的出价请求、移动测量合作伙伴 (MMP) 的数据以及支持我们的 Encore 平台。与使用 AWS 等公有云平台相比,这种设置降低了我们处理请求的成本。

但它也有权衡

我们缺乏根据命令启动新虚拟机的能力,也无法使用 GCP Vertex AI 等平台来服务深度学习模型。这意味着我们需要更加专注于构建基础设施。

大爆炸:构建我们自己的机器学习堆栈

所有管道均在私有数据中心运行

我们在 DSP 中训练模型和提供深度学习服务的方法是在我们的私有数据中心内构建机器学习管道。

我们依赖完整的开源生态系统

我们使用 Spark、Hadoop、Aerospike、ClickHouse、Redash、Prefect 和 Streamlit。PySpark 是我们用 Python 训练模型的主要工具,使我们的机器学习团队能够使用 Python 作为通用语言;Rust 则为我们的 DSP 提供了强大的并发性、安全性和性能。

经典的机器学习模型并非为规模而构建

逻辑回归:速度快但需要手动工程

许多需求方平台最初采用被称为浅层或经典机器学习模型的方法,其中包括逻辑回归和决策树等方法。逻辑回归非常适合入门,因为模型评估速度快,并且有分布式方法可以训练具有大量特征的模型。

如果您使用 Spark 生态系统,MLlib 就是一个示例。XGBoost 和 LightGBM 等集成学习方法对于支持大数据集分布式训练的 DSP 也很常见。

逻辑回归无法处理特征交互

在使用逻辑回归预测结果(例如用户是否会点击广告展示)时,您需要对输入特征之间的交互进行建模,以获得性能良好的模型。例如,您可能希望对所推广的移动应用与将呈现广告展示的发布商应用之间的交互进行建模。

由于逻辑回归不支持直接对这些类型的交互进行建模,因此典型的方法是使用特征工程方法,手动创建输入特征的组合,并将这个扩展的特征集传递给逻辑回归模型。

这种方法一开始效果很好,但是随着你向机器学习模型添加越来越多的功能,随着添加更多的功能交互,参数数量将开始激增。

功能爆炸式增长带来基础设施挑战

我曾开发过包含超过 1 亿个特征的点击预测模型,其中发布商应用与其他所有特征相结合,力求最大限度地提升模型性能。由于参数数量过大,Spark 中的 MLlib 实现在模型训练中遇到了问题,我们不得不探索其他经济高效的模型训练方法。

逻辑回归模型的主要问题是您必须手动定义特征之间的交互,这限制了您可以包含的特征交叉的数量,并且会导致非常大的参数模型,而训练这些模型的成本可能很高。

梯度提升模型扩展性更好,但还不够

在 Aarki,我们最初使用梯度提升算法(从 LightGBM 开始),用于预测用户转化率的定价模型。LightGBM 的一个关键优势在于它能够学习模型内部特征之间的交互,而逻辑回归则不支持这一点。

当我们只有几十个特征时,LightGBM 表现得相当不错,但当我们的模型扩展到数百个特征时,我们遇到了一些不同的问题。与大多数经典机器学习方法一样,LightGBM 难以处理高基数分类特征,例如出版商应用特征,它可能包含数百万个不同的值。

LightGBM 确实有不同的方法来处理分类特征,这些方法有点类似于深度学习模型中的嵌入,但我们无法让这些方法在我们的用例中进行有效的训练和服务。

从经典机器学习迈向深度学习

我们探索的两种为 DSP 构建预测模型的经典方法都存在一个核心问题:它们无法很好地处理大量分类特征,而这些特征是我们数据集的关键组成部分。

我们解决这个问题的方法是开始在我们的模型中使用嵌入,这提供了一种将分类数据表示为密集向量的技术,从而实现了降维和更高效的模型训练和推理。

第一代深度学习:DeepFM

我们采用了 DeepFM 模型,它结合了两个阶段:一个主要(深度)阶段,用于学习所有输入特征的嵌入;以及一个次要(因式分解机)阶段,用于建模特征交叉。这种方法使我们能够摆脱手动特征工程,并使模型能够更好地泛化到未知的特征交叉。

Rust兼容性是必须的

由于我们的 DSP 是用 Rust 编写的,因此我们需要一个支持进程内推理的解决方案。我们使用 Fwumious Wabbit 库,完全用 Rust 来训练和运行 DeepFM 模型。这让我们避免了远程调用的开销,并直接在竞价引擎内部提供预测。

对经典机器学习的改进

DeepFM 让我们能够扩展到数百个输入特征,并在保持高效的情况下做出更准确的预测。嵌入帮助我们将应用程序 ID 和用户信号等高基数特征压缩为可自动学习和更新的密集向量,从而提高模型准确率和训练效率。

但 DeepFM 也有其局限性

因式分解机阶段需要将特征分组到命名空间中,这意味着需要手动定义不同特征组之间的交互方式。我们面临的限制之一是 Fwumious Wabbit 训练库不支持 GPU 硬件加速,这限制了我们可以使用的数据量和迭代速度。

虽然 DeepFM 是一个有意义的进步,但我们知道我们需要进一步发展以支持更大的数据集、更深的模型和更快的再训练。

引领下一代深度学习

我们对下一代的期望

为了继续提升大规模性能,我们需要一类新的模型来满足更复杂的用例和更大的数据集的需求。我们的第一代深度学习模型证明了基于嵌入的架构的价值,但这还不足以释放我们预见到的所有机遇。我们对下一代模型的目标很明确:

  • 在更大的数据集上进行训练
  • 更频繁地进行再训练
  • 处理新的预测任务(排名、相关性)
  • 改进我们的定价模型

迁移到 TensorFlow 和 PyTorch

我们在私人数据中心投资了 GPU,并全面采用 TensorFlow 和 PyTorch 来训练现代深度神经网络。

市场定价模型基于数十亿行数据进行训练

我们最初的 DNN 模型专注于预测第一价拍卖的最优出价。我们使用 Spark 进行大规模数据准备,并在 GPU 机器上使用 TF 记录,以便每天高效地训练 TensorFlow 模型处理超过 10 亿条记录。

我们如何在生产中服务模型

我们将模型转换为 ONNX 格式,并使用 Rust 中的 ort 库进行进程内推理。训练在 GPU 驱动的机器上进行;服务仍然基于 CPU,在我们的 DSP 上进行。

我们正在探索的架构

对于核心转化预测模型,我们正在测试 DCNv2 和 TabTransformer。此外,我们还在探索双塔架构,以便更好地匹配广告和库存。

GPU 投资释放更高水平的模型性能

利用我们现有的基础设施和 GPU,我们正在扩展深度学习,为广告商提供更智能的竞价、更快的迭代和更好的投资回报率。

为什么这次旅程很重要

我们机器学习策略的每一次演进——从逻辑回归到 DeepFM,再到现代 DNN——都秉持着一个核心原则:为我们的广告主提供更大规模、更精准的广告效果。这篇文章介绍了我们为识别和解决传统机器学习日益增长的局限性而采取的技术路径,以及我们如何将深度学习融入到我们的 DSP 架构中。

但模型架构只是其中的一部分。在本文的第二部分,我们将深入探讨支撑这一切的基础设施:我们为何投资 GPU,如何验证这一决策,以及它为大规模模型训练带来哪些好处。

如果您喜欢这个博客,请给 Ben 留言 bweber@aarki.com。他很想听到您的消息!

zh_CNZH