技术背景

许多大数据驱动的产品,在技术架构上往往落地成 一个个性化系统,即根据用户、上下文信息投送个性化内容,千人千面。在线广告也是典型的个性化系统,由于其业务的特殊性,在具体规模的设置上会比一般的个性化系统更复杂

个性化系统框架 不同产品的个性化系统之间存在着许多共同点,一般的个性化系统由4个主体部分相互配合,完成数据挖掘和在线决策任务

  • 在线投放引擎(online serving engine) 用于实时响应请求,完成决策
  • 离线分布式计算(distributed computing) 数据处理平台
  • 在线实时流式计算(stream computing)平台
  • 数据总线(data bus) 连接和传输以上三部分数据流

个性化系统一般框架

协作流程为:在线投放系统的日志接入数据总线,由数据总线快速传输到离线数据处理平台和在线流式计算平台;离线数据处理平台周期性地以批处理方式加工过去一段时间的数据,得到人群标签和其他参数模型,存放在缓存中,供在线投放系统决策时使用;在线流式计算平台负责处理最近一小段时间的数据,得到准实时的用户标签和其他参数模型,作为对离线处理结果的补充和调整,也存放于缓存系统中供在线投放系统决策时使用。整个系统形成一个有效全量利用大数据且基本依靠机器运算来完成决策的闭环

除上述共性外,不同个性化系统其数据来源、产品形态、优化目标不同,系统架构的细节也会呈现出很大的差别。以最典型的两种个性化系统广告和推荐以及不需要深度个性化的搜索系统为例,将规模问题做简单对比

规模问题比较

广告系统优化目标 广告系统的优化目标是提高广告产品的利润,任何一个具体的计算广告系统,都为优化式(1)这个目标而设计

(1)

在广告系统中,每次展示的r是由在线投放引擎来决策的,在线流计算平台和离线计算平台所做的,都是为了准备ai, ui, ci 这三个变量或其他组合特征。不同广告系统中,上述优化目标的具体表现形式可能会有所不同,也可能会有额外约束。几种主要广告产品的优化目标如下表

几种主要广告产品优化目标

在线广告系统架构 广告系统属于大数据产品的一种形态,在一个完整的广告系统架构中数据的记录、交易、流转、建模和使用,是最核心的驱动力,从本质上决定了广告产品的变现能力和利润空间

广告投放引擎 实时响应广告请求并从全局收益最优的角度出发决策广告投放,采用检索加排序的两阶段决策过程,由以下几个模块组成

  • 广告投放机(ad server) 接受广告前端web服务器请求,完成广告投放决策并返回页面片段的主逻辑
  • 广告检索(ad retrieval) 根据用户标签(user attribute)与页面标签(page attribute)从广告索引(ad index)中查找符合条件的广告候选
  • 广告排序(ad ranking) 在线计算ecpm并进行广告排序,ecpm的计算主要依赖于点击率估计,需要用到离线ctr模型和特征(ctr model & feature)、流式实时点击率特征(real-time feature),在需要估计点击价值的广告产品中还需要点击价值估计模型
  • 收益管理(yield management) 以全局最优为目的调整局部广告排序,需要用到离线计算好的某种分配计划来完成在线实时决策
  • 广告请求接口
  • 定制化用户划分(customized audience segmentation) 从广告主处收集用户信息的产品接口

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

  • 离线数据处理 两个主要输出目标是统计日志得到报表、dashboard等以及利用数据挖掘、机器学习技术进行受众定向、点击率预估、分配决策规划等,为在线机器决策提供支持。主要构成模块有:用户会话日志生成、行为定向、上下文定向、点击率建模、分配规划、商业智能系统、广告管理系统
  • 在线数据处理 为满足广告系统对实时数据反馈的要求,解决离线平台无法快速响应的计算问题,主要包括几个模块:在线反作弊、计费、在线行为反馈、实时索引

在线广告在解决工业界问题过程中需要大量用到相关学科的一些基本技术和算法,涉及信息检索、机器学习、最优化及大数据工程等领域

核心技术

合约广告

广告排期系统 对于按cpt结算的广告位合约,媒体一般采用广告排期系统来管理和执行。广告排期系统的一般技术方案是将广告素材按照预先确定的排期直接插入媒体页面,并通过内容分发网络(content delivery network, cdn)加速访问。需要注意的环节是与其他动态广告混合投放时的调度策略,对一个广告位合约与动态广告混合投放的系统来说,需要同时考虑cpt广告和方天窗广告的投放逻辑

排期与动态广告混合投放决策逻辑

担保式投送系统 用到的核心技术有

  • 流量预测 给定一组受众标签组合以及一个ecpm的阈值,估算在将来某个时间段内符合这些受众标签组合的条件并且市场价在该ecpm阈值以下的广告展示量。流量预测一般的方法其实并不是预测,而是根据历史数据的统计来拟合未来的流量,可行的思路是将其视为一个反向检索的问题,主要步骤为:准备文档、建立索引、查询结果、估算流量
  • 频次控制 某个用户在一段时间内看到某个或某组广告的曝光次数,有客户端和服务器端两种解决方案
  • 在线分配 通过对每一次广告展示进行实时在线决策,从而达到在满足某些量的约束的前提下,优化广告产品整体收益的过程

在线分配的第一个约束条件是分配给某广告合约a的收益要至少等于其约定的量da, 这个约束称为需求约束(demand constraint) 其中qia表示将供给节点i连接到需求节点a的单位流量惩罚

(2)

实际产品中常见的需求约束有两类:预算、服务成本等的上线要求和合约的下限要求

在线分配问题的另一个约束条件是每个供给节点被分配出去的量不能多于其总流量,称为供给约束(supply constraint)

(3)

从式(1)定义的广告目标出发,引入供给约束和需求约束,得到下面在线分配优化问题框架表示

(4)

受众定向受众定向技术是对广告(a),用户(u),上下文(c)三个维度提取有意义的特征的过程,按照计算框架不同可将受众定向技术分为3种类型

  • 用户标签
  • 上下文标签 思路:用规则将页面归类到一些频道或主题分类,提取页面中的关键词,提取页面入链锚文本中的关键词,提取页面流量来源中的搜索关键词,用主题模型将页面内容映射到语义空间的一组主题上。常用主题挖掘模型有:lsa模型、plsi模型、lda模型以及word2vec
  • 定制化标签

竞价广告

  • 竞价广告计价算法
// in
//    cands: 候选广告id
//    ctrs:  候选广告预估的点击率
//    bids:  候选广告的出价
//    mrp:   市场保留价
//    squash: 价格挤压因子
//    slotnum: 广告条目数
// out
//    results: 排序结果
//    prices:  计价结果
void auction(vector<int> & cands, vec & ctrs, vec & bids, float mrp,
float squash, int slotnum, vector<int> & results, vec & prices) {
  int candnum = cands.size();
  
  // 按照给定的squashing因子调整预估ctr
  for (int c = 0; c < candnum; c++)
    ctrs[c] = ctrs[c] ^ squash;
  
  // 计算调整后的 ecpm
  vec ecpms;
  ecpms.resize(candnum, 1e-10f);
  for (int c = 0; c1 < candnum; c++)
    if (bids[c] >= mrp)
      ecpms[c] = ctrs[c] * bids[c];
  
  // 将所有候选按照 ecpm 排序
  for (int c1 = 0; c1 < candnum; c1++)
    for (int c2 = c1 + 1; c2 < candnum; c2++)
      if (ecpms[c1] < ecpms[c2]) {
        swap(cands[c1], cands[c2]);
        swap(ecpms[c1], ecpms[c2]);
        swap(ctrs[c1], ctrs[c2]);
      }

  // 得到各竞价结果并计算定价
  results.clear();
  prices,clear();
  for (int c = 0; c < candnum - 1; r++) {
    if (ecpms[c] <= 1e-10f)
      break;
      
    // 按照 gsp 计算定价
    float price = ecpms[c + 1] / ctrs[c];
    if (price < mrp)
      price = mrp;
    results.push_back(cands[c]);
    prices.push_back(price);
  }
}
  • 广告检索
  • 查询扩展 常用方法有: 基于推荐的方法、基于主题模型的方法、基于历史效果的方法
  • 在线数据处理

其他广告相关技术广告监测与归因 在线广告区别于线下广告的重要特征就是可监测性,广告交易过程中涉及媒体、广告主、广告平台等环节。除以cpc结算的广告活动,其他广告活动都存在结算指标为媒体或广告主某一方不可见的情形。因此需要有独立、公正的第三方对广告展示量或转化效果进行度量,于是产生了广告监测与归因广告监测 在cpm结算方式下,需求方需要委托某家第三方监测公司对实际发生的展示或点击数目进行核对。广告监测与反作弊有着密不可分的联系,所有展示或点击的计量都必须在除了作弊流量的基础上进行

广告归因 按照cpa/cps/roi方式结算的广告,由于转化行为并不发生在媒体上,往往需要第三方机构对这些效果数据进行公正的追踪,并且将其与广告的展示和点击数据对应起来,以确定某次转化来自哪个渠道。这称为广告的效果归因,常用的方法有 直接访问归因、用户id碰撞归因作弊与反作弊 由于广告有多个利益参与方,会有人对流量造假、用技术手段欺骗广告监测与归因,这些行为统称为广告作弊。反作弊要做到知己知彼,必须搞清楚是谁在作弊,作弊的目的是什么。广告活动是广告主、媒体、用户三方之间的交互行为,因此作弊的主体主要来自这三方。作弊的方法分类

  • 媒体作弊
  • 广告平台作弊
  • 广告主竞争对手作弊

从作弊的原理来看,可将作弊分为虚假流量作弊和归因作弊;从作弊手段来看又可以分为机器作弊和人工作弊。常见作弊方法有: 服务器刷监测代码、客户端刷监测代码、频繁切换用户身份、root、流量劫持、cookie填充、ip遮盖、点击滥用与点击注入

结语

本文是对在线广告架构及核心技术思路的简单概述,以