Adtributor: Revenue Debugging in Advertising Systems

原文:https://www.usenix.org/system/files/conference/nsdi14/nsdi14-paper-bhagwan.pdf

本文主要解决在广告系统中,当指标异常波动时在和收益相关的指标的各个维度中去定位根因。

本文实现了一个名为Adtributor的工具,其中实现了一个属性算法,以及一个可视化的接口。该工具可以帮助故障派出人员快速识别异常的潜在原因,在一个大型广告系统中取得了良好的效果。

1. 综述

维度根因定位问题有三大特点:

  1. 系统规模
    每天有大量的用户使用,所以在单个搜索或者点击级别去定位问题不现实,只能在一些聚合的指标上去定位问题。问题定位系统也只有在发现了异常时才触发。
  2. 在指标的多个维度中首先找到能解释异常的维度
  3. 衍生指标的普遍性问题

本文有三点主要贡献:

  1. 提出了一个根因定位的算法。
  2. 对于衍生指标的根因定位问题。
  3. 实现了根因定位的算法,并且开发了一个可视化的工具。

2. 问题引入

2.1 异常检测部分

利用ARMA模型进行预测,当预测结果和实际结果超出一定的百分比偏差时告警。

2.2 问题范围限定

下面的例子,在某个时刻,广告收益的预测值为100 , 实 际 只 有 50 ,实际只有50 50,触发异常告警,并且执行根因分析。
image
这里假设和收益相关只有三个维度分别是数据中心(DC),广告商(AD),设备类型(DT)。上图是该时刻三个维度的实际值和预测值的情况。算法需要定位是哪些维度的哪些元素导致了这次收益下降。

布尔表达式

用如下的布尔表达式描述50$收益下降:

  1. Recenue_drop(DC=X)=47$
  2. Recenue_drop(AD=A1 | AD=A3 | AD=A4)=51$
  3. Recenue_drop(DT=Mobile | DT=Tablet)=49$

作者团队经过长期的案例学习发现,一个异常的根因由多个维度共同导致的情况非常罕见。因此本文将问题限制在只在一个维度的元素组合中寻找异常的根因。

2.3 Explanatory Power(EP) & Succinctness§ & Surprise(S)

稻草人方法(strawman): 我们寻找的解满足以下情况,该维度的一组元素其收入下降达到总收入下降的阈值分数 T E P T_{EP} TEP,并且是最简洁的组合。

Explanatory Power( E P EP EP): 一组元素解释指标变化的分数。

Succinctness( P P P): 一组元素中元素的个数。

稻草人方法就是去寻找个数最少的一组元素,该组元素的解释力超过 T E P T_{EP} TEP

但是仅用稻草人方法有一些不足。如上例所示,数据中心维度中,X的预测收入占比94%,实际收入占比94%,Y的预测收入占比和实际收入占比均为6%。设备类型维度中,PC的预测占比为50%,但是实际占比为98%,Mobile和Tablet的预测占比均为,但是实际占比一个是2%一个是0%。这种变化在广告商维度变化也挺大。

根据稻草人原则,我们会最终定位根因为X数据中心,但是如上所述在设备类型维度元素的预测和实际收入占比的这种变化是让人感到surprise的,所以引入一个新的概念 Surprise( S S S): 来描述这种变化。

3. 根因定位算法

3.1 符号

  1. D D D: 维度,例如:广告商,数据中心。
  2. C i C_i Ci: 维度的基数,例如:广告商共有100个取值。
  3. E i E_i Ei: 维度的元素,例如:可口可乐是广告商之一。
  4. M M M: 指标,例如:总收入,总搜索次数。
  5. F i j ( m ) F_{ij}(m) Fij(m): 对于指标 M M M的元素 E i j E_{ij} Eij的预测值。
  6. A i j ( m ) A_{ij}(m) Aij(m): 对于指标 M M M的元素 E i j E_{ij} Eij的实际值。
  7. F ( m ) F(m) F(m): 指标 M M M的整体的预测值。
  8. A ( m ) A(m) A(m): 指标 M M M的整体的实际值。

3.2 Explanatory power

给定元素的 E P EP EP值是该元素的变化在该维度整体变化的占比。例如维度 i i i j j j元素的解释力为:
E P i j = A i j ( m ) − F i j ( m ) A ( m ) − F ( m ) EP_{ij}=\frac{A_{ij}(m)−F_{ij}(m)}{A(m)−F(m)} EPij=A(m)F(m)Aij(m)Fij(m)

3.3 Surprise

对于每个元素 E i j E_{ij} Eij,用 p i j p_{ij} pij表示预测占比或者叫先验概率

p i j = F i j ( m ) F ( m ) , ∀ E i j p_{ij}=\frac{F_{ij}(m)}{F(m)}, \forall E_{ij} pij=F(m)Fij(m),Eij

q i j q_{ij} qij表示实际占比或者叫后验概率。
q i j = A i j ( m ) A ( m ) , ∀ E i j q_{ij}=\frac{A_{ij}(m)}{A(m)}, \forall E_{ij} qij=A(m)Aij(m),Eij

用JS散度来衡量这两个分布的差异:
D J S ( P , Q ) = 0.5 ( ∑ i p i l o g 2 p i p i + q i + ∑ i q i l o g 2 q i p i + q i ) D_{JS}(P,Q)=0.5(\sum_i p_i log \frac{2p_i}{p_i+q_i} + \sum_i q_i log \frac{2q_i}{p_i+q_i}) DJS(P,Q)=0.5(ipilogpi+qi2pi+iqilogpi+qi2qi)

其中 0 ≤ D J S ≤ 1 0 \leq D_{JS} \leq 1 0DJS1,0表示两个分布相同,值越大差异越大。

(不用KL散度的原因是:一、KL散度不是对称的。二、KL散度是无界的,对于概率值为0的情况KL散度无法处理。)

对于每个元素 E i j E_{ij} Eij计算surprise值 S i j S_{ij} Sij

S i j ( m ) = 0.5 ∗ ( p l o g 2 p p + q + q l o g 2 q p + q ) S_{ij}(m)=0.5 * (p log \frac{2p}{p+q} + q log \frac{2q}{p+q}) Sij(m)=0.5(plogp+q2p+qlogp+q2q)

其中 p = p i j ( m ) p=p_{ij}(m) p=pij(m) q = q i j ( m ) q=q_{ij}(m) q=qij(m)

3.4 完整算法:

算法描述

最终广告系统收入根因分析方法分为如下三步:

  1. (Explanatory Power)在每个维度中,找到解释性达到 T E P T_{EP} TEP的元素集合。
  2. (Succinctness)在每个维度的元素集合中找到该维度最简洁的集合。
  3. (Surprise)对于所有的集合,找到在贡献变化最大的集合。

伪代码:
image
算法中主要有两个参数 T E P T_{EP} TEP T E E P T_{EEP} TEEP

  • T E P T_{EP} TEP:该维度下的元素组合(该维度的根因元素候选集)的Explanatory Power总和要满足的阈值,满足该阈值的候选集才能被加到该异常的根因组合中。
  • T E E P T_{EEP} TEEP:该维度下单个元素的Explanatory Power要满足的阈值,满足该阈值才能被加到该维度的根因元素候选集中。

最终结果取surprise值最大的三个,这里可以改成设置一个surprise的阈值 T S T_{S} TS,满足该阈值的候选集作为最终结果。

在算法描述中遍历所有具有最小 T E P T_{EP} TEP解释力的基数子集非常耗费时间,伪代码中采用贪婪的启发式算法,可以大大降低执行速度。

4. 衍生指标

4.1衍生指标的EP

派生指标根因问题的解决方案是从偏导数和有限差分微积分改编而来的。(偏导是衡量一个由多个变量组成的函数在其中一个变量变化时的变化情况。由于是在离散域中操作,使用有限差分微积分作为偏导等价物)
通用定义:一个元素i对衍生指标的解释力,即基本指标 m1,m2,…,mk 的函数h(m1,m2,…,mk),作为h(.)的有限差分中相对于i的偏导数,归一化,使二元的所有元素的值加起来为100%。

f ( . ) g ( . ) \frac{f(.)}{g(.)} g(.)f(.)的有限差分偏导的形式是:
Δ f ∗ g − Δ g ∗ f g ∗ ( g + Δ g ) \frac{\Delta f*g-\Delta g*f}{g*(g+\Delta g)} g(g+Δg)ΔfgΔgf
与连续域偏导类似,只是分母中多了一个 Δ g \Delta g Δg

以衍生指标 A ( m 1 ) A ( m 2 ) \frac{A(m_1)}{A(m_2)} A(m2)A(m1)为例(m1=revenue, m2=clicks),元素j对维度i的解释力,对于形式为m1/m2的派生度量,由以下公式给出:

E P i j = ( A i j ( m 1 ) − F i j ( m 1 ) ) ∗ F ( m 2 ) − ( A i j ( m 2 ) − F i j ( m 2 ) ) ∗ F ( m 1 ) F ( m 2 ) ∗ ( F ( m 2 ) + A i j ( m 2 ) − F i j ( m 2 ) ) EP_{ij}=\frac{(A_{ij}(m_1)-F_{ij}(m_1))*F(m_2)-(A_{ij}(m_2)-F_{ij}(m_2))*F(m_1)}{F(m_2)*(F(m_2)+A_{ij}(m_2)-F_{ij}(m_2))} EPij=F(m2)(F(m2)+Aij(m2)Fij(m2))(Aij(m1)Fij(m1))F(m2)(Aij(m2)Fij(m2))F(m1)

用上述公式计算每个元素的 E P i j EP_{ij} EPij,然后将其归一化,使其加起来达到100%。

4.2 衍生指标的S

用之前的方法计算surprise在衍生指标中不合适,如表8中广告商A2的例子,如果使用上述方法来计算A2元素的惊奇性,它的值将是0(没有惊奇性)。然而,对于A2的点击次数的变化所导致的每次点击成本的整体变化有很高的预测能力,即106%。

从相对熵的角度来考察这个问题,给定几个measure,首先需要计算measure的联合概率分布,然后计算联合概率分布函数的相对熵。(这里)如果这些measure是独立的(这里假设独立),那么联合概率分布的相对熵(也是JS散度)就是各个measure的概率分布的相对熵之和。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值