文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。
来源 | 王喆的机器学习笔记(ID:wangzhenotes)
作者 | 王喆
有经验的算法工程师肯定非常清楚,在一个模型的开发周期中,占工作量大头的其实是特征工程和模型评估及上线的过程。在机器学习平台已经非常成熟的现在,模型结构的实现和调整反而仅仅是几行代码的事情。所以如果能够将模型评估和线上AB Test的效率提高,那一定是大大解放算法工程师效率的事情。
今天这篇文章我们就介绍一下流媒体巨头Netflix的“独门线上评估秘笈”——Interleaving。
周所周知,Netflix是美国的流媒体巨头,其广为人知的原因不仅是因为其多部知名的原创剧,高昂的市值,在推荐技术领域,Netflix也一直走在业界的最前沿。那么驱动Netflix实现推荐系统快速迭代创新的重要技术,就是我们今天要介绍的快速线上评估方法——Interleaving。
01
Netflix推荐系统问题背景
Netflix几乎所有页面都是推荐算法驱动的,每种算法针对不同的推荐场景进行优化。如图1所示,主页上的“Top Picks行”根据视频的个性化排名提供推荐,而“Trending Now行”包含了最近的流行趋势。这些个性化的行共同构成了Netflix将近1亿会员“千人千面“的个性化主页。
图1:个性化Netflix主页示例 。每一行是一个推荐类别,对于给定的行,从左到右的视频排序由特定的排序算法确定。
对于强算法驱动的Netflix来说,算法的迭代创新当然是必不可少的。为了通过算法最大化Netflix的商业目标(这些商业指标包括每月用户订阅数、观看总时长等等),需要进行大量的AB Test来验证新算法能否有效提升这些关键的产品指标。
这就带来一个矛盾,就是算法工程师们日益增长的AB Test需求和线上AB Test资源严重不足之间的矛盾。因为线上AB Test必然要占用宝贵的线上流量资源,还有可能会对用户体验造成损害,但线上流量资源显然是有限的,而且只有小部分能够用于AB Test;而算法研发这侧,算法驱动的使用场景不断增加,大量候选算法需要逐一进行AB Test。这二者之间的矛盾必然愈演愈烈。这就迫切需要设计一个快速的线上评估方法。
为此,Netflix设计了一个两阶段的线上测试过程(如图2)。
1.第一阶段利用被称为Interleaving的测试方法进行候选算法的快速筛选,从大量初始想法中筛选出少量“优秀的”Ranking算法。
2.第二阶段是对缩小的算法集合进行传统的AB Test,以测量它们对用户行为的长期影响。
大家一定已经对传统的AB Test方法驾轻就熟,所以这篇文章专注于介绍Netflix是怎样通过Interleaving方法进行线上快速测试的。
图2:使用Inter leaving进行快速线上测试。用灯泡代表候选算法。其中,最优的获胜算法用红色表示。Interleaving能够快速地将最初的候选算法集合进行缩减,相比传统的AB Test更快地确定最优算法。
02
传统AB Test存在的问题
传统的AB Test除了存在效率问题,还存在一些统计学上的显著性差异问题。下面用一个很典型的AB Test问题来进行说明。
这里设计一个AB Test来验证用户群体是否对“可口可乐”和“百事可乐”存在口味倾向。那么按照传统的做法,我们会将测试人群随机分成两组然后进行“盲测”,即在不告知可乐品牌的情况下进行测试。第一组只提供可口可乐,第二组只提供百事可乐,然后根据大家一定时间内的可乐消耗量来观察人们是更喜欢“可口可乐”还是“百事可乐”。
这个实验一般意义上确实是有效的,很多时候我们也是这么做的。但也确实存在一些潜在的问题:
1.总的测试人群中,对于可乐的消费习惯肯定各不相同,从几乎不喝可乐到每天喝大量可乐的人都有。
2.可乐的重消费人群肯定只占总测试人群的一小部分,但他们可能占整体汽水消费的较大比例。
这两个问题导致了,即使AB两组之间重度可乐消费者的微小不平衡也可能对结论产生不成比例的影响。
在互联网场景下,这样的问题同样存在。比如Netflix场景下,非常活跃用户的数量是少数,但其贡献的观看时长却占较大的比例,因此Netflix AB Test中活跃用户被分在A组的多还是被分在B组的多,将对结果产生较大影响,从而掩盖模型的真实效果。
那么如何解决这个问题呢?一个方法是不对测试人群进行分组,而是让所有测试者都可以自由选择百事可乐和可口可乐(测试过程中仍没有品牌标签,但能区分是两种不同的可乐)。在实验结束时,统计每个人可口可乐和百事可乐的消费比例,然后进行平均后得到整体的消费比例。
这个测试方案的优点在于:
1.消除了AB组测试者自身属性分布不均的问题;
2.通过给予每个人相同的权重,降低了重度消费者对结果的过多影响。
这个测试思路应用于Netflix的场景,就是Interleaving。
03
Netflix的快速线上评估方法—Interleaving
图3描绘了AB Test和Interleaving之间的差异。
在传统的AB Test中,Netflix会选择两组订阅用户:一组接受Ranking算法A的推荐结果 ,另一组接受Ranking算法B的推荐结果。
在Interleaving测试中,只有一组订阅用户,这些订阅用户会接受到通过混合算法A和B的排名生成的交替排名。
这就使得用户同时可以在一行里同时看到算法A和B的推荐结果(用户无法区分一个item是由算法A推荐的还是算法B推荐的)。进而可以通过计算观看时长等指标来衡量到底是算法A好还是算法B好。
图3:传统AB Test和Interleaving 在传统AB Test中,测试用户分为两组,一组暴露于排名算法A ,另一组暴露于算法B,在两组之间进行比较观看时长等核心评估指标。另一方面,Interleaving将所有测试用户暴露于算法A和B的混合排名,再比较算法相对应的item的指标
当然,在用Interleaving方法进行测试的时候,必须要考虑位置偏差的存在,避免来自算法A的视频总排在第一位。因此需要以相等的概率让算法A和算法B交替领先。这类似于在野球场打球时,两个队长先通过扔硬币的方式决定谁先选人,然后在交替选队员的过程。
图4:使用“队长选人”的方式来混合两个排名算法的视频。ranking算法A和B分别产生了推荐视频列表。通过随机抛硬币确定是ranking算法A还是B贡献第一个视频。然后,轮流从算法A和B中从高到底选择视频。
在清楚了Interleaving方法之后,还需要验证这个评估方法到底能不能替代传统的AB Test,会不会得出错误的结论。Netflix从两个方面进行了验证,一是Interleaving的“灵敏度”,二是Interleaving的“正确性”。
04
Interleaving与传统AB Test的灵敏度比较
Netflix的这组实验希望验证的是Interleaving方法相比传统AB Test,需要多少样本就能够验证出算法A和算法B的优劣。我们之前一再强调线上测试资源的紧张,因此这里自然希望Interleaving能够利用较少的线上资源,较少的测试用户就解决评估问题。这就是所谓的“灵敏度比较”。
图5是实验结果,横轴是参与实验的样本数量,纵轴Netflix没有给出非常精准的解释,但我们可以理解为是判定算法A是否比算法B好的“错误”概率。可以看出的是interleaving的方法利用10^3个样本就能够判定算法A是否比B好,而AB test则需要10^5个样本才能够将错误率降到5%以下。这就意味着利用一组AB Test的资源,我们可以做100组Interleaving实验。这无疑大大加强了线上测试的能力。
图5:对Interleaving与传统AB Test指标的灵敏度。与最敏感的AB Test指标相比,Interleaving也只需要1/100的订阅用户样本就能够确定用户更偏爱哪个算法
05
Interleaving指标与AB Test指标的相关性
除了能够利用小样本快速进行算法评估外,Interleaving的判断结果是否与AB Test一致,也是检验Interleaving能否在线上评估第一阶段取代AB Test的关键。
图6显示了Interleaving中的实验指标与AB Test指标之间的相关性。每个数据点代表一个Ranking算法。我们发现Interleaving指标与AB Test评估指标之间存在非常强的相关性,这就验证了在Interleaving实验中胜出的算法也极有可能在之后的AB Test中胜出。
图6:Interleaving指标与AB Test指标的相关性。每个点表示一个Ranking算法的实验结果。Interleaving指标与AB Test指标存在很强的相关性
06
结论
通过实验我们已经知道Interleaving是一种强大快捷的算法验证方法,它加速了Netflix各类Ranking算法的迭代创新。
但我们也要清楚的是Interleaving方法也存在一定的局限性,主要是下面两点:
1.工程实现的框架较传统AB Test复杂。由于Interleaving实验的逻辑和业务逻辑纠缠在一起,因此业务逻辑可能会被干扰。而且为了实现Interleaving,需要将大量辅助性的数据标示添加到整个数据pipeline中,这都是工程实现的难点;
2.Interleaving毕竟只是对用户对算法推荐结果偏好程度的相对测量,不能得出一个算法完整的表现。比如我们想知道算法A能够将用户整体的观看时长提高多少,使用Interleaving是无法得出这样的结论的。为此Netflix才设计了Interleaving+AB Test两级实验结构,完善整个线上测试的框架。
文章最后按惯例跟大家讨论几个问题,希望大家能分享自己的观点,讨论出真知:
1.文中的灵敏度测试到底是在进行什么测试?纵轴是P value吗?(可以参考文末的原文链接)
2.除了AB Test和Interleaving,工作中你还是使用过哪些线上测试方法?
3.在笔者看来,Interleaving除了最后介绍的两个弊端外,还有一些其他潜在的问题,你觉得还有哪些?
星标我,每天多一点智慧