其他分享
首页 > 其他分享> > 通过实验迭代推荐系统

通过实验迭代推荐系统

作者:互联网

在上一篇《使用计算图搭建灵活的推荐系统》中介绍了推荐系统的一种灵活架构,可以方便的增减召回与重排序、替换排序算法等等操作。如此灵活的目的是为了能够快速迭代,比如单拿大家最熟悉的热门召回源举例,热门的计算方式可以迭代,可以加入时间权重,可以改变成按点击率计算,可以改变计算时的取数据范围等等。

那么,如何确定迭代的方向?这个好回答,哪个改动效果好就往哪改。划分出部分 User,让他们试用新改动,与未改动的 User 组进行对比,观察效果变化。上面的过程就是一个典型的对照实验,在互联网领域往往称为 AB Test。

如何设计 AB Test

对照实验的概念,初中生物应该就学到过,一般有一个对照组,它维持原状,不接受任何特殊处理;多个实验组,通过控制变量的方式,每个实验组只做关于一个变量的改变,以此来观察每个变量对最终实验的影响。当然你可以设计有多个变量改变的实验组,以观察多个变量对最终结果的共同影响。

AB Test 的概念简单,易于实现。比如,用上一篇中的计算图举例,大部分流量执行 A 计算图,划分出部分用户流量,执行 B 计算图,这样就是一个 AB Test。注意给流量打上标记,方便在观察效果时分标记查看。如果流量足够的情况,分出 C 图,D 图,同时做多组实验也是没有问题的。

虽然 AB Test 的概念简单,但是实验的设计并不简单。单变量的实验设计起来应该没什么难度,但多变量的实验,就有些复杂了。在这里抽象的举一个例子,现在有变量 a、b,变量 a 有值 a1、a2,变量 b 有值 b1、b2。假设对照组为 a1、b1,那么你就得设计 3 组实验,分别是 a1、b2,a2、b1,a2、b2。第一和第二实验组与初始对照组进行对照,第三实验组则是和第一、二组实验组进行对照。

当然,实际生产中变量的值可不只有 2 个。不过变量的变化方向一般只有双向,比如热门数据的计算范围,两个变化方向,范围变大或者变小。此时可以将其两个方向各取一个值,加上原值,共计三个值。在本轮实验中确定了往哪个方向变化后,可以再以新的值作为基准,再进行一组实验,以确定更加精确的值。比如当前的热门计算范围是 7 天,第一轮实验设计两个实验组,计算范围分别是 3 天和 14 天;第一轮实验完成后,确定了 14 天的效果较好,此时以 14 天为对照组,设计两个实验组分别为 10 天和 28 天,进行第二轮实验。

上面这种控制变量值数量的方式一般用于多变量的实验,防止变量与变量之间的组合导致实验组数量爆炸。如果只是单变量实验,可以适当的往变量方向多取一些值,同时做多组实验。总的原则就是不要浪费流量,尽量的做多组实验,方便快速地迭代。

实验应该观察多久

这也是一个非常有意思的问题。简单来说,当效果趋于稳定的时候,就可以认为实验已经做完了。注意,因为存在一种情况,就是对照组有波动趋势而实验组很平稳,所以,这里的效果稳定指的是,实验组和对照组的差值稳定,不是实验组本身的效果稳定。

往往新的实验上去之后,因为与老套路不太相同,可能会带给用户一种新鲜感,而这种新鲜感是会慢慢消失的。我们要确定的就是,当这个新鲜感消失的时候,效果会稳定在多少。如果用户和业务稳定的话,最终稳定的效果其实是可以通过统计机器学习的方法估算出来的,这样可以减少很多时间。这个属于屠龙之技,一般的应用场景下,前端样式一年都指不定变几次,每次这样改动,就要重新进行统计估算。

其它实验方法

Google 有一篇论文,讲了他们的重叠分层实验框架,非常牛逼,也属于屠龙之技。简单说一下,这个框架里每层的实验是一个 AB Test,而这些 AB Test 是可以重叠的,这代表着,一个用户既可以是某层的对照组,又可以是另外某层的实验组。一般来说,每个正交的业务占有一层,比如前端样式占有单独一层,推荐系统占有单独一层,两者都可以在全用户流量的基础上进行 AB Test。

我知道这可能比较难以理解,个人感觉把这个牛逼框架讲明白需要单独一篇文章。所以在这里就简单通过对比 AB Test,总结一下,它最大的优势就是,能同时做更多组的实验,并很好的管理它们。当你的业务真的需要像 Google 一样,有成百上千的算法工程师上去捣鼓实验的时候,做一套这个准没错。

实验可以一劳永逸吗

不可以。你需要持续的实验,就算已经通过不停地迭代找到了一个最优点,但业务和用户以及内容并不是一成不变的。最好能够保留一些小流量实验组,也许哪天这些实验组的效果就窜上来了呢。

结语

这次的文章写得比较仓促,有些地方可能用词比较随意,没有充分考虑阅读者的知识水平。如果有哪里不理解的,欢迎在评论区交流或者加公众号私信交流~
weixin
logo

标签:AB,实验组,迭代,推荐,对照组,实验,Test,变量
来源: https://blog.csdn.net/CodeDifferent/article/details/105929390