计算广告技术概览

个性化系统框架

一般的个性化系统主要由以下 4 个主体部分组成:

  1. Online Serving Engine:用于响应实时请求,完成决策的“在线投放引擎”;
  2. Offline Distributed Computing:离线的分布式计算数据处理平台;
  3. Stream Computing:在线实时反馈的流计算平台;
  4. Data Highway:连接和转运以上三个部分数据流的数据高速公路;

广告系统优化目标

广告系统的核心优化目标是下面的回归值:

  • $$\displaystyle \hat{a_{1,\dots, T}} = max_{a_1, \dots, T} \sum_{i=1}^{T}{r(a_i, u_i, c_i) - q(a_i, u_i, c_i)}$$
  • 其中:$$r(a_i, u_i, c_i) = eCPM = \mu(a_i, u_i, c_i) * v(a_i, u_i, c_i)$$
  • 使得约束满足:$$\displaystyle \sum_{i = 1}^T d(a_i, u_i, c_i, k) \le D_k, \forall k$$

变量含义:

  • $$a$$:是指广告产品的利润;$$r$$:表示单词展示的预估收益;$$q$$:是指单次展示广告的成本;
  • $$\mu$$:是指点击率;$$v$$:表示的点击价值;
  • $$k$$:参与广告活动的单个广告主;$$D_k$$:表示这个广告主的成本约束;

计算广告系统架构

广告系统架构与“个性化推荐系统架构”类似。它由以下几个部分组成:

广告投放引擎

广告投放引擎的核心职能是:实时响应广告请求、并且决策广告的投放。可以细分为以下的几个模块:

  1. 广告投放机(AdEngine):核心模块,接受一个广告请求,通过调用组合其他各个模块后决策并返回广告结果;
  2. 广告检索(召回):在线时根据“用户特征”、“上下文特征”、“广告特征”找到符合条件的广告候选;
  3. 广告排序(粗排精排混排):在线高效准确地预估广告的 eCPM,并依据它对广告进行排序;
  4. 收益管理(出价):对局部广告排序结果进行进一步调整,以达到全局最优的目的;
  5. 广告请求借口:前端接口;程序化交易市场的请求接口建议使用 IAB 的 OpenRTB 协议(作为需求方使用的 RTBS、作为供给方使用的 RTBD);
  6. 定制化用户划分:程序根据广告主的逻辑来划分用户群;

数据高速公路

将在线投放的数据准确实时地传输到离线分布式计算平台与流式计算平台上,供后续处理和建模使用。

离线数据处理

计算广告最具有挑战的算法问题。离线处理由两个输出目标:

  1. 统计日志得到报表、仪表盘等,供人进行决策;
  2. 利用数据挖掘、机器学习等技术进行受众定向、点击率预估、分配策略规划等,为在线的机器决策提供支持(为了对大规模数据进行分布式的处理加工,一般会选用 Hadoop 这样的分布式存储、或者 MapReduce 计算框架);

离线处理的主要模块有以下几个:

  1. 用户会话日志(session log)生成:整理成以 用户ID 为键的统一存储格式;
  2. 行为定向:挖掘用户日志,打上行为标签,并且存储在用户标签的在线缓存中,供广告投放机使用;
  3. 上下文定向:与行为定向类似,供广告投放机使用;
  4. 点击率建模:通过数据集中的特征训练预测点击率,并且加载到缓存中供线上投放系统决策时使用;
  5. 分配规划:根据广告系统全局优化的具体需求,学习离线日志数据,得到合适的线上分配方案;
  6. 商业智能系统:所有面向人,为最终数据分析导出对象的系统,它包括 ETL、仪表盘、Cube 等;
  7. 广告管理系统:所有面向广告主的系统;

在线数据处理

可以认为是“离线数据处理”的镜像功能,它是为了满足广告系统对实时数据反馈的要求,而单独剥离出来的职能。

它主要包括以下几个模块:

  1. 在线反作弊(Arbiter):将作弊流量从计价和统计中去掉;
  2. 计费:耗尽预算的广告,系统必须马上通知广告索引系统将其下线;
  3. 在线行为反馈:将短时间内发生的用户行为和广告日志及时地加工成实时用户标签,以及实时的点击率模型特征;
  4. 实时索引:实时接收新的广告投放数据,并建立倒排索引;

常用开源工具

对于初创企业和变现业务方向需要探索的企业,需要根据最小值原型(Mininum Value Prototype, MVP)的原则,低成本、短平快地搭建系统,然后在世纪业务中进行快速迭代。以下是计算广告系统中经常用到的一些开源工具:

  1. Web 服务器 Nginx:提供了 fastCGI 这一与各种编程语言之间的通信接口,开发者可以很方便地实现插件而无需关心请求细节;
  2. 分布式配置与集群管理工具 ZooKeeper:为分布式应用建立更高层次的同步 (synchronization)、配置管理 (configuration maintenance)、群组 (group)、命名服务 (naming) 等的通用工具,底层应用的是 Raft 算法;
  3. 全文检索引擎:
    • Lucene:方便地实现全文索引(indexing)和检索(retrieval)功能;它除了高效简单外,还允许用户对其中的关键环节自定义逻辑功能,不过一些特殊的检索算法,需要另行开发;
    • Elasticsearch:一个基于 Lucene 构建的开源、分布式、RESTful 搜索引擎,能够稳定可靠地实时搜索、并具有良好的水平扩展性;
  4. 跨语言通信接口 Thrift:IDL;
  5. 数据高速公路 Flume:高可用、高可靠、分布式的海量数据采集、聚合和传输的系统;
  6. 分布式数据处理平台 Hadoop:存储和加工海量数据的基础设施,几乎是工业界的标准选择。Hadoop MapReduce 是一种分布式计算框架。为了降低 MapReduce 复杂度,人们还开发了 HivePig 等开源工具。
  7. 特征在线缓存 Redis:NoSQL 数据库;
  8. 流计算平台 Storm:在线的、响应速度极快的流计算框架;
  9. 高效的迭代计算框架 SparkHadoopmapreduce 两个阶段之间需要进行硬盘数据交换,因此在需要多次迭代的任务时处理效率相当低(比如文本主题模型、点击率预估等)