许多大数据驱动的产品,在技术架构上往往落地成 一个个性化系统,即根据用户、上下文信息投送个性化内容,千人千面。在线广告也是典型的个性化系统,由于其业务的特殊性,在具体规模的设置上会比一般的个性化系统更复杂
个性化系统框架 不同产品的个性化系统之间存在着许多共同点,一般的个性化系统由4个主体部分相互配合,完成数据挖掘和在线决策任务
个性化系统一般框架
协作流程为:在线投放系统的日志接入数据总线,由数据总线快速传输到离线数据处理平台和在线流式计算平台;离线数据处理平台周期性地以批处理方式加工过去一段时间的数据,得到人群标签和其他参数模型,存放在缓存中,供在线投放系统决策时使用;在线流式计算平台负责处理最近一小段时间的数据,得到准实时的用户标签和其他参数模型,作为对离线处理结果的补充和调整,也存放于缓存系统中供在线投放系统决策时使用。整个系统形成一个有效全量利用大数据且基本依靠机器运算来完成决策的闭环
除上述共性外,不同个性化系统其数据来源、产品形态、优化目标不同,系统架构的细节也会呈现出很大的差别。以最典型的两种个性化系统广告和推荐以及不需要深度个性化的搜索系统为例,将规模问题做简单对比
规模问题比较
广告系统优化目标 广告系统的优化目标是提高广告产品的利润,任何一个具体的计算广告系统,都为优化式(1)这个目标而设计
(1)
在广告系统中,每次展示的r是由在线投放引擎来决策的,在线流计算平台和离线计算平台所做的,都是为了准备ai, ui, ci 这三个变量或其他组合特征。不同广告系统中,上述优化目标的具体表现形式可能会有所不同,也可能会有额外约束。几种主要广告产品的优化目标如下表
几种主要广告产品优化目标
在线广告系统架构 广告系统属于大数据产品的一种形态,在一个完整的广告系统架构中数据的记录、交易、流转、建模和使用,是最核心的驱动力,从本质上决定了广告产品的变现能力和利润空间
广告投放引擎 实时响应广告请求并从全局收益最优的角度出发决策广告投放,采用检索加排序的两阶段决策过程,由以下几个模块组成
数据总线 将在线投放的数据准实时传输到离线计算平台与实时流计算平台上,供后续处理和建模使用
在线广告在解决工业界问题过程中需要大量用到相关学科的一些基本技术和算法,涉及信息检索、机器学习、最优化及大数据工程等领域
合约广告
广告排期系统 对于按CPT结算的广告位合约,媒体一般采用广告排期系统来管理和执行。广告排期系统的一般技术方案是将广告素材按照预先确定的排期直接插入媒体页面,并通过内容分发网络(Content Delivery Network, CDN)加速访问。需要注意的环节是与其他动态广告混合投放时的调度策略,对一个广告位合约与动态广告混合投放的系统来说,需要同时考虑CPT广告和方天窗广告的投放逻辑
排期与动态广告混合投放决策逻辑
担保式投送系统 用到的核心技术有
在线分配的第一个约束条件是分配给某广告合约a的收益要至少等于其约定的量da, 这个约束称为需求约束(demand constraint) 其中qia表示将供给节点i连接到需求节点a的单位流量惩罚
(2)
实际产品中常见的需求约束有两类:预算、服务成本等的上线要求和合约的下限要求
在线分配问题的另一个约束条件是每个供给节点被分配出去的量不能多于其总流量,称为供给约束(supply constraint)
(3)
从式(1)定义的广告目标出发,引入供给约束和需求约束,得到下面在线分配优化问题框架表示
(4)
受众定向受众定向技术是对广告(a),用户(u),上下文(c)三个维度提取有意义的特征的过程,按照计算框架不同可将受众定向技术分为3种类型
竞价广告
// 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遮盖、点击滥用与点击注入
本文是对在线广告架构及核心技术思路的简单概述,以