因果推断在腾讯 PCG 中台的落地实践
导读: 本文将分享因果推断在腾讯 PCG 中台的落地实践。
文章将围绕下面四点展开:
-
因果推断概述
-
增长场景的因果推断
-
中台的落地实践
-
总结
分享嘉宾|刘刚刚 腾讯 算法工程师
编辑整理|贻佩 高德
出品社区|DataFun
01/因果推断概述
首先来介绍一下因果推断相关的概念。
Causality is a generic relationship between an effect and the cause that gives rise to it. 因果关系指的是效果和引起它的原因之间的一般关系。
1. 因果推断的两个主要问题
**(1)Causal discovery(因果关系挖掘):**研究变量两两之间是否有因果关系,如果有,这个关系是什么,谁是因谁是果。
**(2)Causal effect(因果效应推理):**研究"因"的改变能带来多少"果"的变化。
不严谨的说,因果推断有两个主要框架,分别是 SCM 模型和 POF 模型,SCM 主要解决以上提及的第一个问题,而 POF 能够解决第二个问题。
SCM 是以图的形式来形成因果关系并进行推导,它的优点是可以很好的描述变量之间的关系。但这种建模方式同时也带来一个缺点,就是在变量非常多的情况下,描述的关系会变得很复杂。导致数据难以刻画因果关系。在变量很多的时候,关系图的构建就变成了一件几乎不可能的事情。
相比而言 POF 模型更适合于工业界的场景和问题,它淡化了对具体因果的关系的描述,而是直接关注其中某一些变量对最终的因果效应带来了多少影响。因此 POF 模型的缺点就是模型没有非常系统的研究这些变量之间的关系。但是在变量非常多的时候,尤其是在工业场景中,可以大大降低问题的复杂度。
2. 因果推断关注的指标与假设前提
因果推断主要关注以下几个指标:
(1)整体效应。
(2)局部效应(关注存在某一个特征的人群)。
(3)个体效应(局部效应的极限)。
因果推断前提假设:
进行因果推断时,要保证前提假设满足因果推断的条件。
其中 POF 有以下的四个假设:
(1)假设任意个体之间的结果不会因为其他个体的干预而发生变化,且只有一种干预措施。
在实际中生活某些场景,它不是一个非常容易满足的前提。举一个滴滴的场景为例,平台对司机下发一个区域的冲单奖后,司机之间可能会进行信息的沟通,比如说在群里发一些信息进行说明,导致其他的司机也会向活动区域集中。在这样的条件下,个体之间是有信息的交流的,这个假设就不完全满足了。
实验时进行多个分组,通过 AB 分流进行控制可以保证只有一种干预措施。
(2)对于任意样本来说干预是随机的。
随机实验难以完全避免这个问题,随机实验在做一些采样的时候,会遇到一些问题。比如说数据集的采样不是完全随机,也会导致这个样本的分布会发生变化。
(3)施加干预后的结果与潜在结果一致。
(4)干预的分配与潜在结果独立。
3. 因果推断-倾向性得分
倾向性得分的作用与计算方式:
当估算存在 selection bias 的时候(比如上文提及的 AB 实验不能保证完全随机),可以有一些补救的办法。通过 PS matching 的方式来生成一个较为完美的随机实验组和对照组,然后根据这个生成的组别算出因果效应的估计值。具体的实现方式是使用逻辑回归、随机森林等模型进行二分类预测,得出倾向性得分,来判断样本属于实验组或者对照组的概率。在实验组中通过 greedy search 或者 K 近邻的方式,找到对照组中 PS 值相似的样本,重复多次后可以得到两个群组。此外,还可以使用 IPTW 进行加权,使得样本变得更均匀。
4. 因果推断建模方式
因果推断最核心的问题就是在构造完实验组和对照组的样本之后,怎么去估计因果效应的多少。
因果推断建模方式分为以下四种:
① Meta learner(不直接建模效应,可以做 baseline)。
② Tree based(直接建模效应并且可塑性还有解释性都非常强)。
③ Deep Learning(数据量不是很大、特征也不是很多时没有优势)。
④ Transformer。
(1)Meta learner
S-learner 把 treatment 定义成一个变量,在预测的时候通过设置不同的变量来得到两个预测结果,最终预测结果的差值就是因果效应。
T-learner 会训练两个模型,两个模型的预测结果做差就是因果效应。
X-learner 会做一个交叉的预测求得一个残差,然后通过倾向性得分的方式再把这个残差的预测结果进行求和,作为最终的效应值。
Transformed Outcome 是比较简单的一种方法。通过把 Y 进行变换,可以直接计算因果效应。公式中的 w 就是 treat,取值为 0 或者 1。p 是正负样本的比例。当这个样本比是 1:1 的时候就会变成上图中右下角的矩阵。其中对 Y* 因果效应的估计就是 w 分别等于 1 和 0 的时候的差值。
(2)Tree-based
实现方法是通过 bootstrap 的方式采样出很多个样本集合,然后在每一个集合里面都构造一棵树。每棵树的每个节点的分裂方式是根据上图右侧的分裂依据。通过控制分裂前后的父亲节点和孩子节点的样本数量,尽量使他们分裂之后的数量保持均衡。
5. 因果推断评估方式
最常用的是如下两种方式:
第一种是做出样本分布的图例,把样本按照预测结果做排序,然后看每一个分位段的数据情况,要保证数据满足单调性。
第二种是使用 AUUC 与 QINI 来进行计算评估。另外可以除以样本总数来分析转化率的表现,图线下方的面积越大表示效果越好。
--
02/增长场景的因果推断
1. 用户增长体系
用户增长体系包含上图中的三个部分。
首先是基础设施层,这个层会有很多的系统来支持我们去开展增长业务,比如画像挖掘。首先会有团队去挖掘用户的一些特征,然后画像系统会把这些挖掘出来的结果以系统的形式呈现出来。在这个系统上,可以进行运营策略的一系列操作。同时还有计算平台提供相关的计算服务。此外还有最重要的一部分:实验系统。它会支持团队做一些实验的分组以及实验结果的查看。
接下来是触达层,也就是俗称的抓手。触达层可以通过内部的 push、短信、弹窗以及外部的广告投放等方式触达用户,也就是实验中提及的 treatment。
最后是策略层,针对 C 端和 B 端的不同场景进行具体的增长运营。同时两侧也会伴有一定的业务增长洞察,以及使用反作弊的系统来为增长保驾护航。
2. 基于 AB 实验的因果推断
首先要保证对照组的长期保留,如果没有保留对照组,就会很难去观察实验措施的长期效果。因为很多的策略会有新奇效应的现象,可能在一周两周的短期时间窗内策略是有效果的,但是时间拉长到一个月或两个月可能就没有效果了。但有时情况可能也是相反的,短期的效果比较一般,但是逐渐的累积以后,策略长期对平台的贡献会非常的大。构造这样的结构化的分组可以帮助我们看清每一层、每一种策略的长期收益。
另外在进行 AB 实验时会存在容易被忽视一点,就是实验平台的随机分流其实不能保证在因果落地的时候所有的 x 变量都被检验。平台只能检验配置的或选中的那些核心的指标,对一些用户的特征是不做检验的。因此很可能在分组的时候由于分组函数的不均匀,导致这些用户的变量上发生了偏差,从而会影响最终的因果效应的评估。
如果有时间的话,最好是先使用全部的用户特征来做倾向性得分的建模。如果倾向性得分很高,就需要进行重新分组。反之则可以开始观察实验指标的 AA 情况,然后进行 treatment 的上线,最终进入到 AB 实验的阶段。
在做因果推断的策略的迭代的时候,必须要保持一个长期的、随机的跑马实验组。这是为了避免在一段时间内一直使用新的策略去迭代,导致后续的策略会越跑越偏。保持一个随机的组有利于收集样本和训练模型。有了这样的样本之后可以进行因果效应的估计,做一些整数的规划后生成最终的增长的策略,再通过运营配置系统上线服务,最终通过 AB 实验进行验证。
3. 无 AB 实验的因果推断
不能进行 AB 实验时,首先需要定义业务问题,然后通过倾向性得分去构造分组的样本,再通过平衡性检验来确定分组是没有偏的。做完效应的预估之后再做敏感性的检验。这种流程比较适合于没有办法进行 AB 实验的场景,或者是冷启动场景。
--
03/中台的落地实践
1. 数据挖掘流程工具
中台的特点就是会对接多个业务,也就需要有快速的落地能力。然而各个业务的水平参差不齐,中台需要帮助业务去快速具有建模的能力。使得建模更标准化更迅速。中台把数据的挖掘流程工具化,使得使用者只需要具备写 SQL 的能力,通过改写配置文件就能够快速的去构建模型,对于新手来说是非常容易上手的。
可以通过在计算平台启动一个任务来进行自动的模型的训练,并且可以打通公司内部的多个平台,上线到模型服务或者画像的中台。外部的各个业务的算法同学或者是 ds 的同学只需要简单的修改一些配置就可以快速的进行因果建模。
2. 分布式多元因果森林 -DMCF
因果推断有一个比较重要的问题就是怎么去估计多个 treatment。公司处理的用户数据量级是亿级以上的,无法去使用开源的工具进行计算。因此我们建立了多元的因果森林来进行估计。本场景和二元估计的主要区别在于,如果预估效应是二元的话,估计的就是一个数值。但是如果是多元的话,预估多个 treatment 时原始的单个数值就会成为一个向量,这个向量的每一维就代表对一个 treatment 的因果估计。
对于增长场景会关注三个很重要的指标。一个是响应率, 表示用户未来会不会活跃。第二个是人均响应数, 表现用户在未来一段时间会活跃多少天、带来多少时长。**第三个是 ROI,**用于表示投入的资源能带来多少的响应率或者响应数的提升。
在树的分裂上有三种方式。一个是 LR, 它计算的是所有孩子节点的差异。在这里多元的和二元的计算区别在于多元是拆分成二元后的多个效应的求和。第二个是 CP, 这个计算方式会考虑孩子节点和父亲节点的差异,并且也会拆成多个二元的因果效应并求和。**第三个是 PCD,**是我们的一个创新点。应用了皮尔逊相关系数和余弦距离来进行计算,加入了一个先验:一般情况下较大的 treat 带来的效应一定是比小 treat 的效应要强的。还有一个问题是,为什么就是用皮尔逊而不用别的方式呢?是因为皮尔逊相对比较简单,只是一个线性的相关性。也可以引入非线性的、二次或者三次的相关性,但是树在构造到比较深时,尤其是在分裂很多次之后,每个叶子节点的样本数就会越来越少。这时候你很难去准确的评估这个节点的 treat 是多少,随之带来的波动性也很大,因此我们就只用了一个简单的皮尔逊系数来进行计算。两部分组合起来后总共九种不同的分裂方式适用于不同的业务场景。
具体的实现参考了 random forest 的实现。涉及到以下的几个难点。第一个是怎么去进行分布式的训练和评估、预测、流程配置化。我们把 DMCF 接入到 dmflow,作为 dmflow 的一个算法模块。因此在模型训练之前的特征处理、样本处理都是 dmflow 来完成的。另一个最重要的难点就是怎么在大规模分布式训练下高性能的实现节点的分裂。
关于复杂度,如果是常规的方案,把每一次分裂的时候用的各种算子直接改成分布式的算子,每做一次分裂都需要做两次的 filter 还有两次的 group by 的操作,这样的复杂度是完全不能接受的。因此我们的设计方案在每一次分裂的时候,首先在 worker 节点计算一下单个样本对于每个 feature 切分成多个 bins 后的 treat 的结果。然后把这些统计信息进行汇总,统一把信息发送到 driver 节点,然后在 driver 这一侧再去做分裂的计算。这样就可以实现多个节点并行分裂,并且可以存储下来多个类别的统计信息。在进行下一次分裂时,由于这些统计信息都需要重新计算,因此需要把当前树的构造方式发送到每一个 worker 节点,再由 worker 节点模拟构造树的分裂情况,也就筛选出了当前节点所包含的样本的分布情况。再更新计算出需要的统计信息,就可以继续分裂了。
3. 基于因果效应的增长策略
计算得到因果效应之后,增长策略的制定方式可以分成以下两种。第一种是效应提升的计算。对于 DMCF 来说,预测的就是加入 treat 之后对用户未来的活跃概率或者是活跃天的提升值,可以通过规划方程来进行求解。也会通过做一些分桶来进行优化,因为在做这个规划时针对单个人进行计算的复杂度是非常高的,通过聚类的方式把数据分成有限个数的桶,然后在这个分桶下做统一的策略下发,这样大大降低了复杂度。
如果是预测 ROI,那建模得到的就是用户的 ROI 提升。进行策略制定时,首先要把单个用户的多个策略用 ROI 排序,选出最高的 treatment,然后再做全局的排序,再拿到这个用户的自然转化概率。自然转化概率乘以策略做一个求和,然后同时乘以一个核销的系数(可以通过历史的一些核销情况来预估出来)按照排序做累加。直到达到设定的预算上界之后就可以停止,这时候策略人群也就选出来了。
接下来介绍两个使用 DMCF 的落地场景。一个是红包 push:这个场景是给用户下发一条 push,用户点开 push 的时候会拉起到端内,会跳出一个红包领取的界面,用户点领取之后会出现一个随机的金额。这个金额就是通过我们的策略来生成的。这种方式是明显要比 CP+delta 的方式更好的。它的好处体现在于,我们把 ROI 表现很差的人群选出来,可以不对这部分人去下发优惠券。这样可以降低整体成本。
还有一个场景是腾讯 QQ 音乐。具体的策略是,用户如果看了 15 秒的广告,就给用户提供 30 分钟的腾讯音乐会员体验,希望被选中的这些用户付费行为的折损越低越好。QQ 音乐团队使用 meta learner 跑了 baseline,然后再用我们的 DMCF 的算法做了策略优化。相比 baseline,DMCF 方法有 33% 的提升。
--
04/总结
最后总结一下,前文中简单介绍了因果推断在增长方向落地的一些方法论,以及为中台所建的一些数据挖掘的流程工具,并讲解了分布式的因果森林的优化点。
其中有两点体会,第一是 应该使用产品的核心价值来吸引用户,一些增长的措施(比如说拉新、拉活、广告投放)最终还是要看用户是否有可能留存下来;第二是需要有中台的思维,能够把自己的一些方法论以一种流程化工具的形式提供给更多的业务,这样产生的价值才会更大。
--
05/问答环节
Q1:红包 push 是根据 ROI 排序确定最优的 treatment。那么这里的 ROI 的分子具体是指什么?
A1:可以理解是多少钱可以拉回一个人。比如说去外区投放做 RTA 时候拉一个用户是多少钱,发红包是多少钱,或者说去做一些其他的任务给用户发些福利是多少钱。最终还是要拉齐到带来 delta 的 DAU 是花了多少资源。
Q2:创建实验分组之后会马上进行 AA 指标的校验吗?如果 AA 校验有问题,会重新做分组吗?这个过程一般耗时多久?
A2:AA 实验如果有问题的话,是需要重新做分组的。因为它表示你的核心指标是不平衡的,因此后面的结果验证会受到影响。是否需要重新分组的话需要看实验平台是否支持回溯功能。如果它支持回溯,那可以通过回溯历史来验证 AA。如果不支持的话,那可能要等一段时间去观察。或者说历史数据全部被删除掉了,你必须再做一个 AA 实验,然后积累数据后再验证 AA。
Q3:多元因果森林在亿级别样本上的性能怎么样,资源消耗和训练时长等等这方面的指标怎么样?
A3:与样本量,配置的计算资源,以及分裂的超参数都是相关的。可以分析一下他的原理:整个计算的过程中没有很多 group by 或者 join 这种操作,其实计算起来是很快的。主要的消耗在于每一次节点分裂,我们需要重新遍历一遍数据,统计出元信息。经过优化后元信息其实体量已经非常小了,然后再汇总到 driver 就是非常快的。基本上我们跑亿级别的数据应该是在几个小时之内。
今天的分享就到这里,谢谢大家。