本文主要简单介绍飞猪基于因果推断的广告投后归因,包括以下内容:
01 飞猪广告诊断系统简介 首先简单介绍一下飞猪的广告的诊断系统。 飞猪商业化广告主要为商家提供广告投放服务,酒店搜索广告诊断系统主要是为广告主和广告运营提供诊断服务,可以帮助广告主更及时、更准确地发现广告投放过程中存在的问题,并且指导广告主对广告投放进行优化。 右图是飞猪酒店搜索应用下的结果。可以看到,第一个展示的是广告。一般来说,广告主在平台上会设定一定的预算。举个例子,第一天投放一条广告可能获得了1万次曝光,第二天投放时,在同样的设置情况下,可能只获得了5000次曝光。在投放出现异常时,我们需要帮助广告主查询这次投放的过程中出现了什么问题,是否是广告主的设置的改动,或者其他的一些外因波动,导致第二天的效果不如之前。也就是说,我们需要了解波动的原因。 在排查原因的时候,以前往往是值班的同学去检查整个投放的漏斗,得出的结论是非常复杂的,并且需要丰富的经验。随着飞猪商业化的发展,投广告的酒店的数量不断增多,诊断每个计划的投放情况就会变得非常复杂且耗时,因此我们需要一个能够快速定位问题的诊断系统。 随着近些年的因果推断技术被大家广泛关注,我们也开发了一套基于因果推断的、技术的、归因的方法。 简单介绍一下我们的业务情况。 飞猪广告诊断系统是一个和大多数广告平台都差不多的DEMO形式的结构。广告主会在广告平台设置计划,会用我们平台的预估工具来看一下它的广告在我们的平台上,以某一些设定的情况下,会获得多少的效果,例如曝光、成交、ROI的情况。在设置好计划之后,在广告平台上线后,就可以正式开始投放了。整个投放过程与一般的推荐系统也比较相似,包括以下环节:
广告诊断,就是诊断整个广告系统中有哪些环节会影响到核心指标,例如曝光量、ROI等,包括自身的算法的漏斗,还有一些外面的环境,以及广告主自身的设置的问题。例如:
广告诊断,就是希望当展示曝光量出现波动的时候,我们需要知道到底是哪一层影响的,当然肯定最终的原因不会只有一个,可能会有多个因素叠加在一起,影响到最后的变化,我们也希望知道每个因子影响的占比。在此背景下,我们应用了因果发现的方法。 -- 02 基于因果发现的归因方法 首先简单回顾一下贝叶斯网络。贝叶斯网络已经用在了很多领域,包括生物遗传学、机器学习、因果推断等。 构建有向无环图,也就是贝叶斯网络,是一个组合优化问题。因为有向无环图的搜索空间是组合的,并且它与节点数成超指数比例。就是右下方的这样的公式的形式:Q可以理解为是Loss,图G的loss越小,说明有向无环图的的质量越好。 现有构建贝叶斯网络的方法有很多,包括基于贝叶斯统计评分的方法、基于信息理论的方法、基于搜索算法的方法等。基于信息理论评分的方法,是利用编码理论和信息论中最小描述长度原理来实现的。基于搜索算法的方法,像爬山算法,一般都会有一些假设来限制搜索空间,或是假设每个节点是有顺序的,在这样的假设下,再来使用贪心的搜索方法来找到最好的图。 但是这些方法存在一些不好的地方:
我们主要参考的方法是NO TEARS方法。这个方法的主要贡献,是把组合优化问题变成了等式约束问题。它显式地构造了平滑可导的方程来刻画无环的约束,利用矩阵的迹对邻接矩阵做变换之后,得到了这样形式的方程(见图)。H(W)=0时,对应的图就是有向无环图。 这里需要满足四个条件:
损失使用了增广拉格朗日的方法,优化问题就是最下面的形式,右侧是一些相关的代码。 该方法最主要的过程,是数据处理的过程。 因为在前期实验中,一般做机器学习都会使用到归一化、标准化等方法来处理数据,但实际上在NO TEARS方法上,使用这种归一化、标准化的方法,在我们的场景下,基本上没有办法学到合理的图。 右侧的图是现在平台上的各种漏斗,图上有通过漏斗的最后的绝对量,例如通过召回会有多少流量、通过定向会有多少流量、通过分配会有多少流量等。这种绝对值在我们的实验过程中,无论是做归一化还是做标准化,用到模型中都没有办法进行学习,真正上需要做的是变化量的计算。 我们这里的处理方法,是以当前时刻的值去与T-1时刻进行对比,算出相对的变化值作为模型的输入。 因为论文中的数据是用的生成数据,所以我们在这一块儿探索了比较长的时间,因为我们惯性地认为,使用归一化和标准化方法来处理数据比较有效,但实际上并不是这样。这是比较关键的一步,处理好之后,我们就会获得因果图。 我们的归因方法是比较直接的,因为我们直接采用并处理T-N天的数据训练模型。我们用当天待归因的数据,在训练好的模型上进行增量的训练,再计算邻接矩阵权值的变化量,作为归因的权重。变化的幅度越大,那么归因的权重也就越大。最后将多个因子的归因权重进行排序,结果就是归因的结果。 下方有个简化的图可以看到,如果我们要用当天的数据(data4),那么会用前N天的数据来训练好模型,再做正常训练。右侧是最终DEMO实验学出来的图。 这里面有很大的一部分数据的原因,最终学出来的图可能跟预先想象的不太一样。最终的归因的准确率,人工验证可以达到80%。 这个方法的缺陷是:
最后这是demo实验的邻接矩阵,可以看到学出来大概是这样的形式。我们再用当天归因获得的新的邻接矩阵与该矩阵进行比较,节点变化比较大的(图中召回和城市这里的权重)我们就认为在这里存在一些因素的干扰。 -- 03 基于贝叶斯网络的归因方法 除此之外,我们还使用了基于贝叶斯网络的归因方法。我们通过NO TEARS方法构建好因果图后,用当前因果图作为贝叶斯网络的结构,通过一些现有的知识,去强行加一些已知的因果结构进去,来构建贝叶斯网络。 其中,每个因子的变量会进行离散化,因为我们使用的是离散贝叶斯网络。消耗变化量被离散为5个值的意思是,我们将变化量以类似于分桶的做法做离散化。 对于每个计划的因子的波动,我们会用do-calculus操作进行介入,对每因子都介入,每个因子对目标结果发生的概率,即为该因子的归因权重。除此之外,为了更好地体现漏斗的问题所在,在计算的时候会计算该环节上游的所有节点,对每个节点都会做do操作来计算它对最终的改变的概率。 假设计算的是消耗改变,那我们会对上游的每节点都进行介入操作,把上面的节点切断联系,只计算当前节点对下游最终的改变的效果。那么最后介入之后的概率就会成为归因的权重,但是在实验过程中我们发现,因为数据的原因,距离越近的节点,归因的概率往往会更大。但是实际上可能并不是这一层影响的,而是更上一层。比如,对于消耗的改变来说,它跟曝光量有非常紧密的关系,曝光量改变离它更近,那么我们每次介入算出来的概率会越大,但是,也可能是在线时长的改变,才导致最终消耗的改变。从上面的节点介入下来,它的概率没有曝光这个这节点介入的概率大,因此我们会在后面加后验概率来计算当前节点的上游节点导致当前节点的值的变化的概率。 公式中 F代表当前节点的上游的节点。比如,消耗改变掉了,需要诊断曝光是否对它有影响,那么我们的X就是曝光,F就是曝光上面的节点,可能是竞得量改变或者是库存改变,那么会对这几个变量的改变的值和对曝光改变的值做后验概率的计算,直接查表,拿到这两个节点,在竞得量改变的情况下,计算曝光量改变的概率,计算之后对介入实验计算的概率来进行加权,获得最终的归因的权重。 这个方法有如下优势:
最后,整个归因会综合多方面的结果,如图是整个流程图。我们会用T-n天的数据去训练因果发现的模型来拿到一个结果I,贝叶斯网络也会拿到结果II,还有用一些业务规则的判定来获得归因结果III。我们会综合考虑这3个归因结果,以此来做出最后的判断。相对于规则和贝叶斯网络来说,因果发现的方法是起到辅助作用。 我们这次做的还是比较浅的,因为之前对因果推断技术了解得也不是特别深入,后面我们还会继续对在这方面进行挖掘和研究。感谢大家的观看,也欢迎与我交流,并且加入我们。 -- 04 Q&A Q:您刚才提到的贝叶斯网络的结构图,在线时长改变会使得曝光改变,也会使得消耗改变。您刚才提到的是,如果只看曝光改变,到消耗改变,可能会导致Causal effect偏高。业务上的归因是因为在线时长可能会导致消耗改变。那这样的情况下,我们是不是应该把在线时长到消耗这边也加一条后门路径上去,这样就可以用一些后门路径调整的方法,因为这样就构成confounding,在线时长就是混淆变量,那时候我们在评估曝光到消耗改变的时候,既然已经发现了异常,我们把在线时长到消耗的边给加进去之后,我们可以用一些辨识的方法,或者用一些do-calculus的方法来计算。 A:我们当时有想过这个问题。但是,我们当时做这一块儿的时候也是比较直接,因为我们更希望在线时长只是影响召回量的改变,因为如果直接把在线时长变量直接加到消耗上面,那中间的影响可能也会变化。因为从直观上来说,在线时长在我们平台里,它是只影响召回量的,如果从正常的逻辑上来说,是这样顺下来的,它并不会直接影响消耗,当然从结果论上来看,它是会影响的,这是比较纠结的地方,所以我们最后还是加了概率来加权。当然,您刚才说的那个方法,我们后面也会去试一下。 Q:在做因果发现的时候,因为no tears是线性模型,线性模型就代表着它支持的输入格式比较有限,比如我们在业务场景中可能会遇到一些类别变量,比如人是男是女,或者是用户地址,它没有那种绝对的大小值,如果遇到这种变量,是不是我们用no tears的方法就不太行了,是不是必须要使用一些表示的方法,以及用一些深度模型的因果发现的方法来增长它的可用性? A:是的。目前系统上来说,没有多变量的因子,一般只会有一些单变量的因子,后续如果有多变量,会用到这种深度学习的方法来做。我们目前的场景没有考虑,也比较少,基本上没有这种多变量的这种形式。 Q:您刚才提到的因果发现,发现出来的图可能和业务逻辑、专家经验是不一致的,那这个时候我关注到你们团队的做法是做一些事后的调整,就是根据自己的业务经验做一些事后的一些人工的修正,那有没有考虑在辨识因果关系的同时,因果关系的边连不连,也是可以用条件独立性来衡量的。是不是可以在数据驱动学习边的同时,把我们的业务知识以及逻辑,通过一些正则化的方法去再加到数据驱动学习的过程中? A:后续我们应该会这样做吧,因为我们的节点比现在所提到的节点要多得多,目前做的还是比较简单,只要直觉上认为它是有关系的,我们就会加进去。 Q:如果是节点比较多的情况下,因为no tears本身的解并不是精确的零和一,应该是一个浮点数,那时候可能需要去做打环以及截断的操作,那截断的操作,我们好像就没有什么特别的指标,就是团队落地的时候,怎么样去选取那个阈值? A:阈值都是直接拍的,小于多少直接就截断了。一般情况下我们还是没有发现环,但是确实会有一些很奇怪的边,一般截断之后还会有那种边,我们在归因的时候是不会看的。但是学习的时候,当然也有方法直接可以把在我们在学之前直接把那条边给禁止,但是有一些学出来很奇怪的边,我们一般不会做太大的改动,因为我们还是要知道当前的数据具体会影响到什么,如果学出来那条边,学出来一些新的奇怪的边,我们会更加关注,如果权值波动比较大,会关注一下为什么会学到这条边。所以我们除了最后的截断,一上来的这种约束会比较少,我们不会强制让他不选某条边。只会在最后对一些权值比较小的,直接拍一个值,把边直接去掉,那剩下的我们的值对我们最后的判断是比较有帮助的,我们就会保留。 Q:归一化标准化的效果不好,但是用差值作为数据输入比较好的原因,是不是因为数据中包含了反馈和平均值,所以用插值可以把均值的重复量给抵消掉? A:这个问题我们当时也讨论了很长时间,都没有得出明显的结论,我当时还在网上看到很多别人的交流,大家对这个东西都没有特别有依据的定论,只能从直觉上来说,它的变化量更体现它的相关关系。 我们的场景中每个绝对值的基数都不一样,因为它们都是在不同的环境下去拿到的,每个不同的城市的流量的基数也是不一样的,所以相对值来说更好体现相关关系,所以会觉得更好,具体从理论上解释我们确实也不知道为什么。 Q:归因的准确率是怎么样计算的? A:相对于no tears方法,我们之前都是人工去判断的,因为我们刚开始做的时候,我们线上是没有绝对的标准的,刚开始都是人工去查。当然也有一些规则,但是规则一般只能排查出一个问题,但我们希望知道更多的问题,包括权值,那么基本上都是我们靠人肉去看的。对于贝叶斯网络,我们会先算一下贝叶斯网络在做分类任务时的准确率,准确率作为评价评估模型的指标,另外一个方法也是还是同样通过直接去看来做的。 Q:如何使用归因的结果,也就是最后学习到的因果关系图来提升业务的指标?比如推荐业务的人均时长、广告业务的广告主价格这些方向。 A:这是可以深入去考虑一下的,我们当时也是有想法的,当时想知道我们模型中某些特征对效果指标具体的影响,做一些业务上的调整,但是我们还没有具体去做,因为我们实际上线上模型的特征会非常多,非常杂。这个方法学出来的东西,我们也没有办法解释,所以说在无法保证结果有效的时候,我们还是没有去做太多尝试。但是我觉得还是比较有价值的方向,后面也会去探索。 今天的分享就到这里,谢谢大家。 |
|
来自: 独角戏jlahw6jw > 《AⅤ》