推荐系统入门实践(7)排序简述
排序
总述里提过,召回跟排序(一般说排序都是指精排)之间还可以有一个粗排。不过粗排可以看成多级排序的其中一环,就不特意说明了。在我工作中,粗排是用的GBDT模型。
我对排序的了解比较浅陋,因为平时做召回比较多。这部分只是简略说一下,疏漏难免,甚至可能有错误。
贴一个大佬的分享 大佬的知乎文章,建议看原文,简洁清晰。
LR模型(logistic regression)
这就很好理解...直接贴大佬的图了:
排序LR.png线性模型其实就是wx+b...LR再套一个sigmoid是为了把取值规范到0-1。优点是简单、可解释(特征的权重都知道,哪个特征重要也就知道,进而也容易解释结果)、易扩展(很好加特征),大佬说缺点是不好特征组合,我认为不好找特征也是一个缺点...
问,如何为LR模型选特征?答,特征工程的同学们给啥用啥。卒。
选择特征有一些方法论的,我实践里没有机会用过,但tm面试里被问过...可以参考这个问题特征选择知乎答案1、特征选择知乎答案2。
简单点说,单特征auc、信息增益、覆盖率、取值(方差)等都应该考虑,也可以用gbdt、lr等对特征打分,也可以用L1正则来选特征。贴个图,细节我也不懂,有时间细研究下后面补充吧(这句话出现频率有点高)。
特征工程.jpg线性模型改进
线性模型加上特征组合,本质是SVM,为什么?多项式核。
排序LR改进.pngFM模型
改进特征组合的权重。泛化性更好。
排序FM.png 排序FM2.pngFM模型的dnn理解:
排序FM-dnn解释.png
FFM模型
再细分field。参数量1+n+kfn,时间复杂度O(k*n*n)。
排序FFM1.png
排序FFM2.png
双线性FFM
改进参数量太多的问题。
排序双线性FFM1.png排序双线性FFM2.png
树模型-gbdt
排序GBDT.pngGBDT+LR
GBDT当做特征抽取模块,后面接LR。fb论文
排序GBDT+LR.png实际可以再加一些dense特征的,gbdt当成稀疏特征提取器。这样想来,GBDT+FM也就容易理解了。基于这种思想的其他模型也就顺理成章了,例如我们实践中用过一个ensemble model如下图:
排序ensemble-model.png后来想换成deepFM一直未成功,一方面效果要超过ensemble比较难,因为ensemble本身也是有FM的,另一方面速度很慢,因为原本的引擎架构没有做这方面支持,于是要在tf里面分field,想要变快需要引擎推倒重来,比较难。
wide&deep
可以看看tf.estimator.DNNLinearCombinedClassifier.
排序w&d.pngdeepFM
排序deepfm.pngdeepFFM
这里细节不多说了,再次推荐大佬的文章这里。
排序nffm.png排序deepffm.png
其他如PNN,DIN,DCN,Deep&Cross等就不说了,反正都没用过...
实践经验
下面简单记录一下实践里的有用经验,可能略去很多细节。
样本权重调整
在模型固定时,调整样本权重是对指标最有效的措施之一。如何设计样本权重呢?举例说,假设负样本权重是1,我们可以让正样本的权重正比于playtime,也就是weight=alpha*playtime,其中alpha用来平衡正负样本比例,这个公式里包含的假设是通过playtime区分视频质量。通过统计视频duration和playtime的关系,可以发现二者正相关,那么这样的权重就偏向推出长视频,但我们不希望这样(我们要的是公平,公平,还是tmd公平)(各业务不同)。
为了去掉上面所说的影响,考虑到playtime=duration*percentage,我们可以定义weight=alpha*percentage,让它跟完成率正比。但是统计duration和percentage的关系(实际是显然的),可以发现二者反比,那么现在就更容易推短视频了,还是不好。
我们首先需要一个合理的假设:视频推出质量的分布与duration无关,并且在各个duration区间下均匀分布,也就是说,在任何duration区间里,样本权重的平均值应该相同。一种实现方式是,对每个duration区间下的playtime进行等频分割,然后映射到level,最后level映射到weight。这样duration与weight就几乎不相关了。举个例子:weight=sigmoid(playtime)*level/scale+bias,实际上参数可以自己调整实验。细节不谈。
多样性MMR
MMR就是Maximal Marginal Relevance 论文这里,是为了保证推荐结果多样性。其实很简单,可以理解为得到排序score后,再根据item相似度(另一个角度就是多样性)来重新打个分。公式是 lambda*score(i)-(1-lambda)*max(sim) ,lambda是超参数,sim就是物品i跟“已经被选中的item”的相似度,我们的目标就是选择一个item i 让这个公式得分最高,这样就平衡了排序得分和多样性。其中sim计算可以复杂(embedding距离)也可以简单(tag的jaccard距离)。
添加召回特征
一般新加召回源之后,可以在排序模型中添加该召回源的得分作为特征,通常会有一定提升(不大)。排序模型中也可以添加召回产出的embedding特征,例如i2v/n2v/dnn等。
用户分层
上一节说过了,字面意思。
模型更新
想到两点,一是不要重新训练模型,在上一个模型基础上使用新样本继续训练;二是加快更新频率,一般可以做到小时级。也可以小时级用小样本,天级用大样本,选择很多。
其他
-
关于特征。稀疏特征比如用户兴趣的id类、tag类特征,比如item侧的id类、tag类特征;embedding特征不用说,user item都可以有;dense特征比如各种统计特征,统计特征本身也可以分桶,特征之间可以交叉加权等。
-
如何侧重新视频?第一是样本权重,第二是样本筛选。这两样最有效。