2.3 打压、保送、重排——拍不完的脑袋

了解模型不只是要知道模型能干什么,更要知道它不能干什么。

在从业一段时间后应该有一次“转职”,如果相信模型无所不能,应该走科研路线;如果对模型不是很放心,那应该成为一名推荐算法工程师。

舍弃一些眼前利益是短痛,平台的活力有损失就是长痛。

要把模型看成一个喜欢敷衍“甩锅”的人,时时刻刻防止它在给定的任务上“偷懒”“作弊”。

在推荐的链路中,除了模型,还有一些环节,看起来并不高大上,但重要性一点也不逊于模型,可以粗略地概括为策略。在推荐的整个过程中穿插着许多策略环节来辅助。这些策略有些是为了让当前推荐的结果更吸引人,有些则是为了某种长期规划或赢利诉求。

有的读者可能会觉得模型很高级,写规则有点“平凡”,笔者不提倡这样思考问题。在求学阶段天天面对的都是模型,所以会不自觉地带着“模型即世界”的思维惯性。现在的主流模型,如MLP、Transformer、多门混合专家(Malti-gate Mixture-of-Experts,MMoE),与线性回归相比,变化当然是很大的,但是离无所不能还差得非常远。很多的策略、机制都是在弥补模型能力的欠缺。作为推荐算法工程师,除了知道模型能做什么,还需要知道模型不能做什么。

策略有自己的门槛:模型研究的是客观规律,而策略可能研究的是人心。研究模型易,读懂人心难。这一节将介绍常见的策略环节,如图2-7所示。

图2-7展示了策略可能在模型附近出现的环节,即黄色标出来的部分。可以看到,策略本身就可以成为一路召回,如前面讲的按照热度或精品池召回。策略不仅可以强行在排序的过程中保送一部分内容,还可以在输出结果后进行重组。

图2-7 链路中的策略环节

下面具体介绍几种策略。

根据标签的区别对待:标签系统高度渗透在整个推荐的流程中。标签系统最重要的功能是对用户进行分层。根据当前用户是属于活跃的还是非活跃的,是老用户还是新用户,是哪一个年龄段的用户,制订对应的策略。许多产品、运营人员的第一课,就是要学会分层地看待用户,有针对性地优化每一种群体的体验。这就需要我们通过用户的历史行为,或者调查问卷等信息来进行判别。先忽略如何得到用户的标签,讨论一下有了用户的标签之后怎么用。

假如有一个金币的补贴策略,用户做了任务之后得到奖励。任务可能是看视频、点关注、分享之类的。当然不能对所有的用户一视同仁[5],一方面,这个活动主要是为了刺激那些看视频不是很多的用户,那本来就会看很多视频的用户的激励自然就没必要那么多。此外,在不活跃的用户里面,还要区分敏感与不敏感的用户。有的用户很喜欢这种激励,本来没什么热情,一发金币他马上就看得多了起来。但是有的用户可能很“佛系”,发了他也不怎么受到鼓励,那理应给那些容易受到激励的用户多发金币。在上述例子中,判别用户是不是活跃,是不是容易受到激励就是非常重要的。这是标签系统指导策略的一个例子。

标签系统的另一个要点是要突破“语义鸿沟”。比如当搜索“××饭店”时,用户可能不是要看酒店的客房,而是要看内部的商户,或者周边有什么吃的。但是周围的商户的店名不可能都带着这四个字,这时可以给它们打上“××饭店周边美食”这样的内部标签,把它们展示出来。这种用途非常关键,也能有效提升用户体验。

打压与保送:并非所有的生产内容在平台看来都是平等的。有的内容是重要政策变化,即使自然CTR不高,也要让大家都知道。有的内容虽然吸引人,但是很容易消耗掉用户的兴趣,所以要控制“度”。因此,有的内容需要打压,有的则要保送。

需要打压的一般有这几种情况:第一种是观感容易引起不适的,如各种皮肤病广告,在画面里可能直接展示患有疾病的部位,这种内容的密度需要控制;第二种是存在政策风险的,如某些“擦边球”内容,是不能放任的;第三种是不合时宜的类型,简单来说就是过时的内容。典型的例子就是时效性很强的新闻,如奥运,奥运已经过去很长时间了就应该少出现这类内容。需要保送的一般则有这些情况:最直接的就是购买量,平台要满足客户的需求,也可以给自己创收,如淘宝直通车。另一种是平台已经选定了自己的目标人群,如某App要走高端名媛风,那这类内容就得多多推送,此时不太在乎不喜欢的用户怎么想,App的“人设”就是这样。

打压和保送的决定一般很早就出现了,如要给哪种物料加量,但是实际操作一般是在精排出结果之后,按照标签(就是上面的标签系统)做。操作时可以直接对输出分数进行提权,加偏置项或乘以系数。

探索与利用:探索与利用本身是一个很大的方向,这里涉及的是在精排输出之后的一个环节,即本身也是打压/保送的一种情况。此处想强调的是,它是一个较为长期的规划,而且可能要承受一定的损失。

探索与利用问题大概可以被理解为,当有一个机会时,可以选择一个未知的东西来尝试,也可以选择一个已知的东西来获取收益,如何操作才能使得利益最大化呢?

这样揪心的选择往往出现在物料冷启动的环节。新视频我们往往进行保送,有时即使其他视频预估的结果更好,甚至它实际上也确实更好,我们也要把新视频推荐出去。一方面,把新视频推荐出去,推荐系统能获得更加丰富的数据;另一方面,不把它推荐出去永远也不知道它到底好不好。最重要的是,新视频的多少决定了整个平台的活力,总是有新的内容出现,才是一个生命力旺盛的产品。有一些老视频当然后续表现更好,但必须舍弃这个机会给新视频,否则有一天用户发现平台上全是老内容,就会觉得索然无味,然后离开平台。不愿意付出短期的一点小损失,会导致未来的重大损失。

实现控制新/老视频的做法一般有两种:一种做法是区分新/老队列,也就是图2-7所示的情况,保送队列里面只有新视频,一直到最终决策之前,新视频都只和新视频竞争;另一种做法是强制比例,如果展示内容中必须有10%是新视频,那么每次推送都会查看过去一段时间内的分布,新视频比例不够,就根据差距给新视频加权重,反之减权重。

搜索与利用问题的难点是如何把控短期收益和长期收益的关系。就像上面的例子那样,投放新视频短期内可能是有损失的,但是损失是多大,长期的收益怎么衡量,如何判断所谓的长期收益是否值得现在的付出呢?这些问题是很难解决的,也取决于决策者的水平。

重排:重排一般要做这几件事情。

(1)控制展示内容的多样性。含义就是,可能一次输出N个结果,这N个结果不能都讲的是同一件事情,否则对用户体验的伤害极大。

(2)去重复。去除用户已经看过的,或者类似的,这一点很好理解。

(3)强插。和上面讲的打压/保送类似,这里的做法更加直接,强插的内容是不需要经过前面环节的。

在这个部分,要说明的一件事情是,策略能做到的一些事情,模型可能很难做到。以图文内容和视频内容的混排为例,有的App上,既有图文内容,又有视频内容,放到同一个模型里面预估当然是可行的,但是实践中往往会出现偏差。视频内容和图文内容比起来,很有可能在很多指标上都是领先的。当领先到一定程度时,模型就会觉得视频内容就是比图文内容好,于是它直接把所有视频内容的预估都提高。这样一来,模型就会达不到当初我们给它的设想,而是被偏差主导了整个推理过程。理论上,它也许能分别学习图文内容和视频内容的规律,但是机器学习没有理所当然的事情,在实践中往往会退化到简单的一刀切上。为了纠正它,可能要在数据采样、损失函数设计上花很多共工夫。这样一来,不仅目的很难达到,解决方案还会变得很别扭。

其实这样的问题用一个策略就可以很好地解决:我们先看看总共有多少视频内容,多少图文内容,然后按照比例,从各个队列里面抽取就行了。

类似的策略在美食业务中也存在。美食推荐可以分为两种:一种是根据用户过往行为预估出来的喜好;另一种是根据用户所处位置的推荐。这两种我们都需要给它们留一些空间,如果把它们都丢进一个模型中去排序,很可能会出现一边倒的结果。这里的策略其实和模型的边界不那么严格。在重排这块,也会有人用模型来做,我们后面也会讲到。

策略必须存在。一个理由就是上面所说的模型能力不足,另一个理由是可解释性。在有的场景下,可解释性的重要性是要大于模型能力的,如在广告投放中,你可以做到把某个环节替换为模型,但是广告主马上就要问他的素材为什么投不出去了,模型做了什么导致了这件事情发生呢?这个时候就很难解释了,但是如果有一套策略,你就可以告诉广告主,他的素材哪里不够好,在什么地方根据什么规则吃亏了。

至此,本书的第1篇——总览篇,就结束了。这一篇是对整个推荐系统的概述,没有把重点放在某一种具体的算法上,而是放在推荐系统的各个需要联合、相互影响的环节上。换句话说,这一篇强调的是某种“大局观”。下一个篇章是模型篇,模型篇就会整体介绍具体模型的进展及优缺点等。


[1] 刷新,刚进入App时都会有请求发生,这个信号可以看作整个推荐流程的起点。

[2] 本书所说的“嵌入”有两种:一种是特征引入模型时以嵌入查表查找的嵌入(特征嵌入);另一种是模型中间层,或者最后的输出(表示嵌入)。表示嵌入可以认为和深度学习中常说的特征图(Feature Map)等价。

[3] 当ID变成新的,模型就会把对应物料当作新物料重新开始预估,这涉及后面要讲的冷启动问题。

[4] 还可以更彻底地拿出更多样本,如在精排输出的每10个里面取一个,得到一个长度为10的list,按照List-wise的方式去学习。List-wise比较复杂,我们在模型篇中再介绍。

[5] 发金币本身是要算亏损的,最后要评估得到的收益是不是值得这样的亏损。