大道至简,一文看懂推荐系统多目标模型

2022-09-22 14:34:04 浏览数 (1)

作者 | 梁唐

出品 | 公众号:Coder梁(ID:Coder_LT)

大家好,我是梁唐。

今天和大家聊聊推荐模型的一个重要突破:多目标模型。

PS:今天太忙了,EasyC 鸽一期……

多目标模型

其实单纯地从技术上来讲,多目标并不是很困难或者是很高深的技术,相反它非常简单。简单到你了解神经网络就能看懂它的原理。

我给大家看两张图就明白了,这是我们常规的推荐模型:

最底下是许多embedding层,然后这些embedding通过各种方式加工之后拼接在一起,之后作为一个MLP(多层神经网络)的输入,最后预测出结果。如果是按照点击率排序就是pCTR,如果是按照转化率排序就是pCVR。

多目标是什么呢?其实就是把原本的单塔做成双塔或者多塔,这里的塔(tower)是术语,其实就是指代的MLP(多层神经网络)。由于多层神经网络一层层堆起来可以堆得很高,称为塔非常形象。多个塔可以同时预测多个目标,以ESMM模型为例,它的完整的模型结构是这样的:

因为一般电商的推荐场景当中,核心的指标只有两个,也就是点击率和转化率。在一些复杂的场景当中可能还会有更多,比如说视频推荐场景中,观看视频的时长也会是一个重要指标。我们不搞那么复杂,仅仅考虑点击率和转化率好了。

我们从上面的截图当中可以看到,我们在预测的时候,一个塔预测点击率得到pCTR,一个塔预测转化率得到pCVR,最后把两个结果相乘得到了pCTCVR,也就是点击转化率。最后排序的时候,根据这个pCTCVR进行排序。

从技术层面来看,多目标基本上就这点东西,并没有什么高深的技术,也就是把原本神经网络一个塔变成两个塔,原本按照pCTR排序转变成按照pCTCVR排序而已。但魔鬼都藏在细节里,我们深挖细节可以挖出很多东西。最终回答终极问题:我们为什么需要多目标?

单目标的问题

在回答为什么需要做多目标之前,我们先来看看传统的单目标模型会有什么问题。

在推荐系统当中,几年前最常规的做法就是按照点击率排序。在用户浏览或者打开app的时候,我们会用模型预测每一个商品的点击率,然后根据点击率从高到低进行排序,从而达到尽量让用户点击的效果。

这样设计当然没有问题,但有一个潜在的bug,就是会有这样的结果出现

这图片摆出来,我估计很多人都很兴奋,毕竟现在互联网人均lsp。

但问题是,纯爷们看到大胸美女是很喜欢,这样的结果点击率肯定低不了。但有一个巨大的问题,就是纯爷们只会点击,绝大多数都是不会掏钱买的。

只看不花钱,就是一个巨大的问题。毕竟是电商平台,目的就是为了让用户花钱购物。追求点击率希望用户多点多看,本质上也是因为希望用户多看了能多花钱。现在推了一大堆用户很喜欢看但几乎不会买的东西,其实是一种资源的浪费。因为如果推一些用户潜在可能喜欢的,反而可能构成成交。

我们来简单总结一下,这里面问题出在哪里呢?

最大的问题是电商平台追求的本身就不是单一的目标,我们既希望用户多看多逛产生粘性,又希望用户多掏钱多成交。这些目标之间逻辑上可能本身就是有冲突的,符合用户兴趣的东西,用户可能不会多看,用户喜欢看的,又不一定会购买。所以我们围绕点击率来建模,本身就是有损失的。

那么不围绕点击率建模行不行呢?

答案是不行,因为点击是一切的基础,只有用户先点了,才有可能加购、下单、成交。这一切的前提都是点击,如果我们跳过点击直接对后续的下单、加购建模同样也是不准确的。并且由于加购、下单的样本更少,会导致模型的效果更差。

其次是推荐场景本身就是一个马太效应非常严重的场景,其中的流量是非常聚集的。这点不用我多说,大家也知道。比如直播里头部几个主播拿走了绝大多数流量,剩余的大一批主播瓜分剩余的长尾流量。不仅是主播如此,商品也是一样的,热门的商品占据了绝大多数曝光机会,剩余的海量商品瓜分长尾。

很多人吐槽推荐系统围绕用户兴趣构建信息茧房,看到的东西非常单一,其实这个逻辑完全弄反了。推荐系统本身的目的就是为了对抗马太效应,围绕用户的兴趣带来更多的信息设计的。

如果没有推荐系统,我们连我们自己喜欢的内容都看不到了。不仅同一个用户看到的商品单一了,而是所有人看到的都是千篇一律的结果。所谓个性化的信息茧房其实已经是推荐系统努力之后的结果了……

马太效应严重,会导致点击率越高的商品被推得越多,被推得越多模型学习得也就越深刻,也就越容易被推。发展到最后,整个平台都是类似的同质化的垃圾内容,用户看一次还行,看多了之后会非常腻,最后慢慢就不来了。很多平台早期内容质量很高,但到了后来都逐渐被博眼球的垃圾营销内容占据,除了平台运营策略之外,和围绕点击率建模的算法也有一定的关联。

多目标的改进

从模型角度来看,单目标模型最大的问题就是围绕点击率建模,无法估计其他指标。然而点击率又是平台最核心的指标之一,毕竟所有的交互都因为点击而产生。所以我们肯定是无法舍弃点击率的,最好的办法就是在点击率的前提下兼顾其他指标,这也是多目标模型的诞生初衷。

以双塔模型为例,两个塔共享输入,一个塔预测点击率,一个塔预测转化率。最后将两者相乘,按照相乘之后的结果排序,从而达到兼顾点击和转化的效果。

这里面有很多细节,我们一一来说。

点击、转化平衡

点击率好理解,就是点击的数量除以曝光的数量,反应的是用户点击商品的概率。转化率类似,是购买的下单的数量除以点击的数量,反应的用户下单、购买的概率。

做过算法的同学应该都清楚,这两者之间有一个取舍。通常我们是很难同时优化这两个指标的,原因也很简单,因为对于用户来说,点击几乎没有成本,而转化是需要成本的。所以相对来说提升点击率容易,提升转化率很难。往往点击率有了大幅提升之后,转化率反而会下降,因为点击多了,计算转化率时的分母也就变大了,因此反应在转化率上反而降低了。

反过来也是一样的,有的时候点击率大跌,转化率反而增加了。道理是类似的,因为点击少了,分母小了。正因为这两个指标之间有着这样一种特殊的平衡关系,所以我们围绕点击率建模的结果通常都是点击率提升,但转化率下降。想要提升转化率,也可能会影响点击率,这两者之间互相影响,想要同时提升往往比较困难。

更关键的是,由于排序的时候只能按照单一指标排序。我们按照pCTR排序就会影响转化率,我们按照pCVR排序就会影响点击率。所以比较好的做法是分别构建两个模型,然后将两者相乘,按照pCTCVR来排序,也就是点击转化率排序。

这也不是什么新思想,在多目标模型出来之前就已经有了。但这样的方案当中有两个bug,一个bug是两个模型耗时会更长,性能会比较差,第二个bug是转化率模型的训练样本比较稀疏。

共享输入

模型的结构当中有一个细节,双塔共享了输入。表面上看这是一个非常正常天经地义的做法,但就是这个平平无奇的做法解决了样本稀疏的问题。

很明显,在电商场景当中,转化数量要比点击的数量少得多。我们可以看几百个商品,但是最终下单的可能只有一两个。这就导致了如果我们想要单独构建一个转化率模型样本会非常稀疏,因为转化的样本太少,而没转化的太多。模型看到茫茫多的负样本,只有零星的正样本,很难学到正负样本之间的差别。

有了多目标模型之后,转化率的塔可以和点击率的塔共享输入,一方面是极大地拓展了样本的数量,另外一方面是由于点击率和转化率目标之间存在很大的共性,它可以从中提取到点击率模型学到的信息。一般来说,在多目标模型当中,多个目标之间的关联程度越强,最后的效果就越好。

说起来多目标模型只是一个很简单的改动,但其实如果仔细深挖分析,会发现其中暗藏的原理是不少的。老实讲看到这样的模型设计思路是非常愉快的,有一种大道至简的感觉,比花里胡哨加了一堆模型结构,最后提升一点点的论文看起来舒服多了。

好了,关于多目标就聊到这里,感谢阅读。

0 人点赞