当前位置: 首页 > 科技观察

推荐系统,如何整合多目标模型的多个目标?

时间:2023-03-18 13:10:52 科技观察

大家好,我是凉糖。前两天写了一篇关于多目标排序模型的文章。有朋友给我留言说多目标很好理解,但是排序的时候如何整合多个目标呢?仔细想了想,确实想不明白。没有相关工作经验的朋友可能还是有点迷茫。没关系,今天就单独聊聊这个话题吧。排序问题在讲解多目标之前,我们先来看一下排序。排序是算法工程师最常问的问题之一。其实,从理论上讲,搜索、广告、推荐本质上都是排序问题。区别在于使用的场景不同,排序目标不同。我们之前在相关文章中提到过这一点。搜索主要关注相关性。用户想看的一定是与搜索词相关的内容,其次是产品质量和兴趣。广告的目的当然是利润。作为电商平台和互联网企业的核心收入来源之一,广告的核心目的都不是盈利。当然,利润也是有分的,不同业务场景的广告盈利方式也不同。大部分广告是按用户点击量收费的,也有部分是按曝光量和成交量收费的。无论费用是多少,在对广告进行排序时,都会按照预期收益排序,最有可能赚钱的排在第一位。对于搜索和广告来说,排序的目标比较明确,而推荐则不同,推荐的目标不是那么明确。可能有同学会说,推荐的对象不是用户喜欢的,当然是按照用户的兴趣排序的。没那么简单,先不说用户的兴趣千差万别。即使能找到像大胸妹子这样的公益,效果也未必好。毕竟死直男都愿意看,但花钱买女货,大部分还是过不去。因此,在推荐领域,工程师的目标其实是比较混乱的。但是在建模过程中必须要有一个明确的目标,所以业界还是以点击率和转化率作为推荐目标。你可以想一个问题。点击率高,转化率高,就代表推荐效果好吗?两者真的等同吗?点击和转化是否适用于所有推荐场景?接下来,我们来看看排名本身的问题。从技术上讲,排序本身并不复杂,就是按照模型预测的分数排序,分数高的排在最前面。比如模型的预测结果是CTR,那么预测点击率最高的就会排在第一位。如果模型的效果好,那么真实的点击率就会提高。同样,如果我们按转化率CVR排序,那么转化率就越高。由于转化率和点击率不一定匹配,所以转化率会提高。是的,点击率不一定会增加。不能同时根据多个值排序吗?看看算法介绍就知道,没有。所谓多关键词排序,也是将关键词按顺序进行比较。当关键字都是浮点数,几乎从不相等时,多关键字排序就没有意义了。所以如果我们同时预测多个目标,那么在排序的时候是没有办法按照多个目标来排序的,除非我们想办法把它们融合在一起。这就是今天文章的主题,多目标情况下如何进行融合排序。融合方案融合方案本身很简单,每个人拍脑袋都差不了多少,没有优劣之分,只有效果好不好的区别。比如可以按照pctr+pcvr,或者pctr*pcvr来排列,也可以给每一个设置一个加权排列,也可以设计一些奇怪的公式把它们组合在一起。不管你怎么做,都是可能的。但是如果我们从实际意义上来看,pctr*pcvr方案更多的是物理意义,因为它代表的是点击转化率,也就是用户看到商品后下单的概率。为什么这种排序方案比简单地按pctr或pcvr排序更好?因为很简单,因为我们是按产品排序的,只要这两个值里面有hip,就不会排在前面。比如图片是巨乳妹子的产品,点击率可能高,但是转化率不好,所以不会排在第一位。就是说我们做了一个权衡,过滤掉一些转化率极高,点击率极低,转化率极低的极端情况。可能会牺牲一些指标,但总体来说对平台的内容是有利的。其实从最后的实验结果来看,点击率影响不大,但是转化率可以大大提升。细节与常见错误无论我们设计什么样的多目标融合方案,都有一个细节是必须要注意的,那就是这个目标必须和模型训练的目标保持一致。体现在我们计算损失函数的时候,需要用最终的解来计算损失,更新模型参数。这张图大家都能看懂,但是很多人在实现模型的时候遇到了问题。比如设计一个fusionscheme为x*pctr+y*pcvr,即给pctr和pcvr分别设置一个权重。本身没有问题,但是在lossfunction的实现上,仍然使用pctr和pcvr来计算lossupdatemodel,这是一个问题。例如训练时计算pcvr转化率时,根据pcvr得到计算损失函数,则模型对目标转化率的学习由pcvr的值控制。但是在实际的在线排序中使用的是x*pctr+y*pcvr。这个公式模型以前没见过,所以肯定有偏差。另一个常见的问题是拆分训练,类似于前面的例子。PCTCVR用于在线预测,但在训练时,多个目标分别训练。比如pctr的loss是用pctr计算的,pcvr的loss是用pcvr计算的。仔细想想,就会发现问题。我们排序的时候用的是pctr*pcvr,它是两个目标融合的结果。理想情况下,为了这个目标,两个塔都应该知道。反向传播时,彼此的结果会影响彼此的梯度,两个塔会同时更新参数。但是我们的loss是分开的,也就是说我们在反向传播的时候,两个塔分别更新自己的参数,彼此不知道对方的存在,所以这里没有协同作用。常规方法是更新点击率。我们只训练pctr塔。由于转化的前提是点击,我们根据pctcvr来计算转化率目标的损失,这样在反向传播时可以同时更新两者。塔的参数起到协同作用。ESMM的论文看起来很简单,好像就是多了一个塔,里面的细节还是蛮多的。如果你想彻底理解这个模型,强烈建议你仔细阅读论文或相关的实现代码。魔鬼藏在细节中,仔细推敲,一定会收获颇丰。本文转载自微信公众号“码农”,可通过以下二维码关注。转载本文请联系编码员梁公众号。