DPSR是京东发表于SIGIR2020 的paper,是京东在搜索推荐系统领域的实践经验总结,京东自2019年起就开始部署DPSR搜索推荐系统框架,总体网络结构如下:
从整体看,离线模型是一个双塔模型结构,query 和 item 分别有一个 model tower。
Query 端:包括query tokens、user profile、user history events 等特征。
item端:包括title tokens、brand、category、shopid 等特征。
离线索引(offline indexing):使用的是item tower,导出item的embedding 构建 QP 索引。
在线服务(online serving):使用的是query tower,实时计算Query Embedding,模型加载在tensorflow service,在线召回 TopK Item。
整个模型并不复杂,现在很多搜索推荐的召回算法中都有类似的想法,就是把用户和个性化信息作为一个tower,item信息作为另一个tower,然后通过多层的感知机进行训练建模,最后计算相似度排序召回。
模型最终公式如下:
f(q,s)=G(Q(q),S(s))
Q(q)∈Rd×m 表示query的embedding
S(s)∈Rd×m 表示sku的embedding
G 表示打分计算函数,比如内积或者余弦相似度等,具体跟随场景的变化而变化。
乍一看,和DSSM双塔模型很像,有木有?确实,都是双塔模型,但细节方面还是有很大不同:
1.基于multi-heads的query tower
2.基于attention的损失函数
3.设计了不一样的负采样方法。
4.DPSR构建了个性化的在线语义召回模型
【基于multi-heads的query tower】
在query tower这个层面,不单单使用query单个维度去构建Embedding向量,因为从实验来看,单query维度建模效果不是很好,例如我们在query理解那篇文章提到的一个案例(query=苹果,可以是手机,也可以是水果,虽然query文本相同,但代表的意思不同)。
所以在此模型中,就提出了一种multi-heads的query tower,不同的head可以捕获query不同的语义、品牌、属性等,用多个mlp从不同维度建模query的tower。
【基于attention的损失函数】
基于muti-head的query可以训练出多个不同维度Embedding,并将其与item的Embedding计算打分。模型采用了attention loss做优化,r(qi,si+) 为正样本,r(qi,si-) 为负样本,模型优化的 loss 可表示为:
公式如下:
【设计了不一样的负采样方法】
在搜索场景构建正负样本,大多数模型都是基于用户的点击日志这种弱监督数据,同query词下曝光了多个item,点击了为正样本,未点击则是负样本,但其实这种方式对于电商领域来讲存在一些问题,容易引入bad case,因为实际点击行为中,存在很多噪声数据,并且点击了也不一定是强相关的。举个例子搜索“手机”,展示了苹果、华为、小米手机,不能说未点击就是不相关商品。
所以此模型提出一种混合的负采样方式,即random negatives(全局的随机)和batch negatives(batch的随机)的混合负采样,使用了一组超参来调整两者的比例。全局随机服从某种特定分布,而batch的随机则是根据item的点击频次进行采样,最后通过人工监督的方式进行修正。
上图是超参比例调整的实验结果,发现random negatives越多,召回商品的popularity越高,更能吸引用户点击下单,但会降低商品与检索query的相关性。
【DPSR构建了个性化的语义召回模型】
在以上3点的模型设计方案上,基于构建的用户画像和物品画像,使用亿级别的60天用户点击日志的数据集,其中包含56亿个会话,训练个性化语义召回模型。
模型在多个方面做了优化,比如:
1.通过训练数据压缩,修改训练数据格式,把共用的特征数据加载内存,训练时展开从而降低数据存储;
2.可伸缩分布式,切分大的 embedding,并将 sum up 放到 ps 以解决带宽瓶颈;
3.模型分片部署,可以支持上百个模型同时服务或者 A/B 实验;
总体来说,模型效果不错,总体效果如下:
DPSR在语义层面、个性化层面做了很多尝试,在实际的工业级搜索引擎的召回过程中还是有很强的借鉴意义。