推荐粗排(召回)工程实践之双塔DNN模型
粗排作用
在 推荐精排模型之经典排序模型 一文中我们介绍了工业推荐系统中主要包括召回、粗排、精排、重排这四个环节。粗排主要是为了进一步减少召回的Item数目,减轻精排压力,同时不损失线上效果。如果不要粗排,那就是直接对各路召回文章汇总后根据设定阈值进行截断,然后送给精排模型进行排序,每路召回选择的内容条数可以根据后验数据通过AB测试不断优化。上粗排的话,就可以扩大召回的内容数量,减少一些枯燥的调参工作。其实粗排用得好,不仅不会损失线上效果,反而能取得很好的收益。虽然从粗排喂给精排的文章减少了,但是可以通过扩充召回的文章数量,使得真正用户感兴趣的内容池子扩大,但前提是粗排模型确实有不错的排序能力,将大部分用户不感兴趣的召回文章剔除掉。本文主要跟大家讨论一下使用双塔DNN模型做推荐粗排和召回的一些理论和工程实践问题。
双塔DNN结构
我们双塔DNN做粗排的离线和在线模型结构如下图所示。用户侧和Item侧分别构建多层NN模型,最后输出一个多维(128)embedding,分别作为该用户和文章的低维语义表征,然后通过相似度函数如余弦相似度来计算两者相关性,通过计算与实际label如是否点击、阅读时长等的损失,进行后向传播优化网络参数。Item Embeding会通过持续调用模型Item侧网络进行计算,并保存到HDFS或Faiss中,供线上Serving查询使用。User Embedding在线上Serving时需要通过调用模型用户侧网络进行计算。
用户侧特征主要包括:
用户基础特征,如ID,手机系统、型号、地域、注册时间、用户关键词、用户偏好等
用的历史行为特征,如用户最近阅读文章ID、用户最近阅读文章关键词等
Item侧特征主要包括:
文章基础特征,如文章来源、一二级分类等
文章NLP特征,如文章关键词、实体词等
文章统计特征,如文章的点击、展示统计量等
详细特征可以参考 推荐系统之特征构建 一文当中的思路进行特征构建
线上服务架构
粗排服务整体架构如上图所示,主要包括三个接口:
用户向量计算接口,输入为文章特征
文章向量计算接口,输入为用户特征
用户和文章相似性计算接口,输入为用户向量和文章向量
双塔模型既可以用于粗排也可以用于召回:
用于粗排时,离线任务调用文章向量计算接口并在hdfs上生成文章向量文件,粗排预估服务不断检查文件更新状态并同步文件到预估本地机器。在线流程为:
引擎端并行请求各路召回和粗排用户向量,并同步等待所有返回结果。
引擎端将用户向量和召回结果文章id用来构造文章打分请求,请求粗排预估。
引擎端根据粗排打分结果排序截断,请求精排预估。
用于召回时,离线任务类似,但定时任务请求预估得到文章向量,但不同步到预估,而是存到faiss。在线流程为:
向量召回在线请求预估得到用户向量
向量召回拿用户向量去faiss找最近距离的topk文章向量
引擎汇总所有召回结果后截断
优化技巧:
双塔模型也可以通过使用不同的label构造不同的模型,比如点击率模型采用用户向量和文章向量内积结果过sigmoid作为预估值,用到的损失函数为logloss,时长模型直接使用用户向量和文章向量的内积作为预估值,损失函数为mse。
双塔模型也可以通过改变用户侧和文章侧的特征构造不同的模型,比如用户侧分别使用短期和长期用户兴趣特征构造短期和长期用户兴趣召回模型,使用基础泛化特征构造对用户冷启动友好的召回模型
可以使用不同的label或者特征构建多塔召回模型,有点类似Multi-View DSSM的感觉了。