saying
1.AB测试几乎是系统改进的不二法则,算法做AB,开发做AB,产品做AB,运营更要做AB 2.召回有点像一个甩锅侠,我不管我给的准不准,我就管我把潜在的能投的都吃进来就行 3.其他环节想要提升,除了自身确实有改进,也要和精排相似。太超前的改进注定会被精排这个旧势力打压 4.粗排非常容易照本宣科,明明实际结果已经说明不需要粗排。内心的惯性还是让人留着它
前两讲从比较宽的范围讲了一下推荐系统做什么,以及在这个时代背景下的发展历程。从这一讲开始,我们则会逐渐进入技术细节。
从大体上来说,推荐系统需要包含这几种模块:索引/库存池,特征服务,排序模块,线上展示逻辑,日志系统,分析系统。如下图所示:
上面是对于整个系统框架的梳理,下面我们就细化到排序模块里面,看看具体是如何排序的.
整体上,排序是一个漏斗,如下图所示:
一开始我们可能有成千上万的item,首先要由召回(也叫触发,recall)来挖掘出原则上任何用户有可能感兴趣的东西。这个环节是入口。有时候,单独的召回可能难以做到照顾所有方面,这个时候就需要多路召回。很好懂,就是多个召回路共同决定进入粗排的候选。比如可以由一个召回专门根据用户过往的兴趣来筛选候选,那可以再加一个召回专门输出近一段时间的热门视频。他们的出发点都不一样,共同组成下一级的输入。粗排(pre-rank)一般接受几千个输入,这时候压力就大大降低了。粗排就可以放一些较为复杂的结构,比如mlp就可以放上去了。粗排的输出一般是小于1000的,那这个压力就更小了,精排(rank)就可以变得很复杂,什么transformer啊放进去也不过分。
因此这几级结构实际上是计算压力从大到小,模型复杂度从小到大的一个过程。正因为如此,他们的角色其实也有差别。
精排-最纯粹
精排是最纯粹的排序,也是最纯粹的机器学习模块。它的目标只有一个,就是根据手头所有的信息输出最准的预测。我们也可以看到,关于精排的文章也是最多的。
研究精排杂七杂八的变量最少(虽然也是最卷的),精排训练所需要的数据本身就是它自己产生的,没有其他环节的影响。精排也是整个环节中的霸主,你在召回上的一个改进点,精排没有get到,那你这个改进点就不能在实际环境中生效。前面的环节想要做出收益,都得精排“施舍”。
召回-入口大开
由于召回所要面对的item量是最大的,因此召回也是时延压力最大的。简单来说,就是要快。意味着他的模型结构最简单,甚至有时候都不是模型,而是规则。
对于召回来说,最经典的模型莫过于双塔(一个mlp输出用户的embedding,一个mlp输出item的embedding,后面详细介绍)。双塔的输出,通常建模在向量的近似搜索里面,可以极大地提升搜索的效率。因此,双塔几乎可以说是为召回而生的。
召回有一个原则是多样化,多个召回路在他们所要涵盖的地方应该有差异。考察方面有差异最好,模型结构有差异次之,如果仅仅有数据差异啥的可能不会有什么效果。
但是召回并不太关心准不准,第一是后面有粗排精排给他兜底,第二是他准了也没用,反正还要看后面的脸色。我们在机器学习中有一类指标叫“召回率”,就是你认为的正样本占所有正样本的比例。这里的召回也有点这个意思,不在乎你犯了多少错,只在乎你把对的放进来没有,因此我们就得到saying 3.
粗排-略显尴尬的定位
相比于召回和精排,粗排是定位比较尴尬的。在有的系统里,粗排可以很丝滑的平衡计算复杂度和候选数量的关系。但是在有的例子中,粗排可能只是精排甚至召回的一个影子。所以,粗排的模型结构大多数情况下都很像精排或者召回。
粗排是一个非常容易照本宣科的地方,因为粗排不是必需的环节。如果你的候选数量非常少,那连召回都不需要了;如果你的精排能吃的下召回的输出,那可以考虑实验对比是不是需要粗排。但是假如不加粗排,总感觉欠缺点什么。有的地方甚至出现过粗排输出候选变少,整个系统反而涨点的情况。像这样的情况出现,就说明整个链路设计存在不合理的地方。