推荐系统之样本加权

Posted 比尔的新世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐系统之样本加权相关的知识,希望对你有一定的参考价值。


在推荐系统当中,样本生而不平等。对于某一类样本来说,其数据量越多,模型对这类样本的学习会更好,这也是为什么一般模型对长尾样本学习不好的原因,这也是新用户和新Item冷启动一般需要被单独处理的原因。如何在模型当中对我们重点关注的指标从样本层面进行优化?样本加权是常用的一种方法。下面我将结合自身实践,跟大家分享一下,如何使用样本加权的方法提升用户阅读时长、用户阅读完成率及新用户阅读体验。

 

先讲讲时长加权,一开始做的时候,朴素的想法就是,点击率排序模型是为了将正例排在负例前面,但是在正例里面如果能把阅读时长长的排在前面,对于用户体验和产品指标来说,显然更好,当然也不是越长越好,可以根据自身业务关注点做相应的处理,后面也会讲讲处理方法。同时考虑点击率和时长,常规的思路就是做多目标,我们开始也走了这条线路,单独训练了时长模型和点击率模型,然后线上融合,一般线上的效果就是以点击率换时长,点击率跌时长增,如果留存为正,那么就可以上线。虽然线上已经有了点击模型、时长模型、完播率模型等,但是,能不能进一步挖掘点击模型在提升时长方面的能力呢?显然是可以的。

 

业界已经有不少采用样本加权的方式提升排序模型效果的工作,比如Youtube 2016就发了一篇介绍时长加权深度推荐模型的论文,UC信息流推荐模型在多目标方面的尝试就是使用样本加权的方式。借鉴这两家的工作,我们首先尝试使用时长加权,希望在点击排序模型中,将时长长的正例排在前面。

 

点击率模型是一般是二分类模型,点击还是不点击,两个类。深度推荐模型网络最后一层输出logits,然后过sigmoid函数得到样本点击和不点击的概率。以logloss为损失函数,logloss对错误分类进行惩罚,最小化logloss基本等价于最大化分类正确率。如果最后一层只用一个神经元,则可以看成最后输出为正例的概率:

 

logloss = Ylog(Sigmoid(x))+ (1-Y)log(1-Sigmod(x))

 

x为最后一层的logits输出,对损失函数及sigmoid函数求导,得到:

 

dx = Y*1/Sigmoid(x) * Sigmoid(x)(1 – Sigmoid(x)) +  (1-Y) * 1/(1-Sigmoid(x)) * (1- Sigmoid(x)) *-Sigmoid(x) = Y – Sigmoid(x)

 

我们将时长以权重的方式加到损失函数上面,也相当于对最后一层的回传梯度加权。

 

点击率模型样本有正有负,负例是没有实际阅读时长的,所以对于负例不能直接使用样本时长对样本损失加权。把负例的权重看作1,正例的权重为(1+时长),这样就能实现对正样本进行时长加权了。但是不同样本之间,时长的差距很大,有的几秒,但是有的几百秒,在一个batch_size为128的batch中,如果有一个时长很长的样本,那么最后做梯度平均的时候,该样本的梯度就完全覆盖掉掉了其它样本的梯度,相当于其它样本基本没有得到学习,这样显然是不行的。

 

一个很自然想到的解决方法是做时长平滑,比如log(时长+1),但是相对于二分类logloss来说,这样的权重还是太大了,权重会压过损失本身,所以需要进一步对时长做归一化,先对时长做截断处理,比如统计下图文视频的阅读时长分位数,然后做适当截断到maxtime,再log(时长+1)/maxtime,这样处理过后,权重就比较合理了。

 

既然我们对样本进行了加权,那么在一个batch内做梯度平均的时候,也应该除以加权batch数,即将一个batch内所有的权值加起来当作该batch_size数,然后做梯度平均,这样处理对学习的稳定性非常重要,而且这样mini-batch梯度优化的理论性才是完备的。

 

基本上这就是样本加权的精髓了:

  • 权重要做合理的transform

  • 同时梯度平均的时候除以的是加权样本数

 

完播率加权基本也是这样处理的,不过完播率加权是以将完播率较高的样本排在前面为出发点来做的。完播率这里对于短时长点击样本需要做一些修正操作,因为短时长样本完成率天然就高,这样会导致短时长内容容易被推出来,而短时长内容一般质量都不是很好。

 

Uid即userid,uid曝光数反向加权的出发点是希望对新用户样本给予更大的权重,从而在新用户上面取得收益。我们有特征专门标志每个uid的出现次数,然后根据uid的展现次数做一个反向加权,即展现高的权重小,展现少的权重高,即一个batch内新用户的样本权重更高。权重的处理基本与时长加权和完播率加权的处理方式差不多,都需要先合理的transform,然后计算平均梯度的时候除以加权样本数。这里也可以使用uid的点击次数做反向加权,而不是曝光次数,相当于只对正样本进行处理,而不是全量样本。

 

时长加权、完播率加权和uid曝光数反向加权这几个操作在线上都取得了不错的收益。时长加权增时长的同时PV不跌,完播率加权则PV时长双增,同时有效阅读率提升,无效阅读率下降,Uid加权在老用户上面PV时长微跌,但是在新用户上面则大涨。

 

大名鼎鼎的Youtube时长加权排序模型在训练阶段权重的处理跟我们的对时长的处理方式应该是一致的,虽然论文里面没有写怎么操作,只说了使用时长对损失进行加权。一开始做这个模型的时候还走了些弯路,就是对上面样本加权的精髓没有理解到位。Youbube 时长模型在Serving的时候使用的是pow(e, logits),至于为什么这样处理,可以参考王喆老师的文章,揭开YouTube深度推荐系统模型Serving之谜。

 

几个小问题:

  1.  你觉得样本加权对于模型迭代会带来负面影响吗?

  2.    如何统一多个样本加权处理?

 

                           

 

[1] https://zhuanlan.zhihu.com/p/61827629

[2] Deep Neural Networks for YouTube Recommendations (Youtube 2016)

 


以上是关于推荐系统之样本加权的主要内容,如果未能解决你的问题,请参考以下文章

推荐系统之标签修正

推荐系统之TF-IDF算法实现

推荐系统之TF-IDF算法实现

推荐算法之加权采样

七月在线机器学习项目

ML之CB:基于自定义电影数据集利用CB基于内容推荐算法(多个指标基于同种相似度加权得分)实现电影Top5推荐案例