在学习王树森老师的推荐系统实践中,召回部分里专门用单独的章节讲述了Deep Retrieval(DR),这里面的技术细节暂且不论,主要吸引我的是技术演进的原因,向量召回究竟有怎样的缺陷,DR又做出了什么改进来弥补这些缺陷?这是这篇博文的出发点。

向量召回

简要来说,向量召回主要包括两个部分,一个是embedding,即输入特征的连续化,以最典型的双塔模型为例: 双塔示意

这里以用户点击过的<user, item>作为正样本,以没有被召回的,或者排序期间被淘汰的<user, item>作为负样本,其本质优化目标是使得正样本对里user与item的相似度够大,趋近于1,而负样本中的相似度趋近于0,损失函数就使用交叉熵就好,当然这是最简单的一种训练范式,实际上双塔模型的训练除了这样的pointwise模式,还有pairwise以及listwise模式,不过这不是今天的重点,我们只需要知道这个模型就是用有标签的正负样本来优化表征,得到一个好的embedding for user/item就够了。

而第二个部分在于检索,即针对一个user,找到其最感兴趣的items,这个兴趣可以直接用内积等相似度度量来表达,这也是embedding模型训练的初衷。对于一个有召回请求的用户来说,通常物品池里面有千万甚至上亿级别的候选,即使已经离线存储了物品的embedding,计算相似度的工作量也太大了,无法满足实时性的要求,因此需要一些技术来加速检索,比较典型的工作是ANN(近似最近邻搜索)系列 ANN 当然,这些算法与距离度量也有关系,比如HNSW就是基于欧式距离设计的,如果求内积的话需要进行一些优化处理,不过这并不是重点,到此,向量召回的基本概念已经解释完毕,那他天生的缺陷在哪呢?

  1. 工业链路上的不连贯 比如模型进行全量更新后,每一个item算出来的向量都会发生偏移,而原先ANN的索引结构(如聚类中心、图的连通性)是基于旧向量空间形成的,也就是说多出了一个重构索引的计算成本,当然,相对于一个全量更新的规模,这一部分耗时并不严重,但是确实是使得推荐系统无法实现真正的端到端学习。
  2. 模型表达能力有限 原文为:the inner product structure of user and item embeddings might not be sufficient to capture the complicated structure of user-item interactions,使用内积来表征兴趣,多少还是有些过于简单粗暴了,DR是怎么解决这个问题的?其实很简单,增加了路径的层数,相当于多做了好几层内积,更有层次感了,有感觉吗? DR示意1 DR示意2
  3. 模型训练与索引建立的目标不一致
    1. 索引是无监督的,简单压缩空间,对所有维度一视同仁,没有维度敏感性
    2. 完全区分正样本和负样本的完美模型不存在,维度表达能力永远到不了这么强,这也就导致了ANN的局部分割一定会带来误判
    3. 原文里说的是内积有问题:ANN or MIPS is designed to approximate the learnt inner product model, not directly optimized for the user-item interaction data,即索引的目的是在高维空间中高效,准确地逼近内积排序,离DR地直接用数据始终是隔了一层(其实这里有点像无监督或者两阶段这一块问题)
    4. 原文指责了内积,但是实际上使用归一化的内积(余弦相似度)会避免一部分问题,最简单的就是模长与方向的矛盾,目前听到课上的说法是,余弦相似度还是比内积实际效果好不少的,所以可能矛盾也没有这么激烈

DR

说到这里就得来一个很现实的问题了,向量召回虽然存在一些问题,但确实过于直观,第一个阶段训练模型获得好的embedding能力,然后使用ANN计算离用户embedding最近的若干物品embedding,这个最近的若干物品不是靠全局搜索,而是靠模拟最近邻。那DR呢?它的召回链路是什么样的? DR链路

这里面12都挺好理解的,关键点在3和4

  1. 路径到物品的索引是怎么建立的? 路径索引 也就是这边是使用用户行为作为中介,来获得物品和路径的相关性建立索引 更新索引 更新路径和物品的索引 路径物品
  2. 物品的初步排序是怎么排的? 判断用户对路径的兴趣,再判断路径和物品的相关性,其实也类似于一种协同过滤吧