再看经典召回算法
在学习和应用推荐算法的过程中,发现越来越多的文章在描述深度学习应用在推荐系统上的方法,不可否认深度学习的发展给推荐系统带来了巨大的进步,但是传统的经典算法仍然是非常值得学习的,毕竟可以作为一个比较高的baseline,同时也是快速上手和搭建推荐系统的好方法,因此这篇文章就主要总结和梳理一下传统的经典召回算法。
一般经典的召回方法即采用多路召回的方式,如下图所示。
通俗的来说多路召回就是从不同的角度采用一定的方法针对给定用户来从候选物品库中挑选一定数量的物品,最终把每路挑选出来的物品合起来一同交给排序模型进行排序,从而推荐给该用户。多路召回的特点就在于“多路”,满足了挑选物品的多样性,捕捉用户兴趣的多样性,可以根据需要保证你想要召回的物品总能通过某一路挑选出来。下面就详细介绍和分析一下每一路召回方法。
▌热门召回
根据字面意思可以看出和个性化无关,即挑选热门物品即可,比如挑选出点击率高或下载量大的Top K个物品。
▌基于兴趣标签的召回
对用户兴趣标签进行优先级划分,然后依次根据用户的兴趣标签挑选对应标签的物品。比如A用户的兴趣有看书,健身,爱狗人士,而根据A用户的喜爱程度排序则为爱狗人士,健身,看书,那么可以从物料库中挑选出和狗相关的Top K个物品,如果不够则依次从下一个兴趣标签挑选物品,直到总共选出Top k个物品。
或者可以对用户每个兴趣标签划分挑选物料的比例,保证用户的多个兴趣标签都有对应的物品。
▌基于年龄地域等人群召回
该方法主要利用人群基本特征(年龄,性别,城市等)对用户进行分组,然后找到同一人群的共同物品偏好,从而进行相似推荐。比如年龄20至30,性别男,城市一线城市分为一组,发现在这一类人群中洗面奶的购买量很大,那么就可以对具有相同人群推荐该洗面奶。
▌基于协同过滤的召回
协同过滤最典型的两个方法,一个是基于物品的协同过滤,一个是基于用户的协同过滤,用来直观区分和理解这两种方法的点是:可以把他们分别看作为一个是通过计算物品的权重来进行相似推荐,而另一个是通过计算用户的权重来进行相似推荐,具体可以看下面的详细分析。除了以上两种经典的协同过滤方法外,还有基于矩阵分解的协同过滤方法,比如ALS,SVD,SVD++等。
虽然通过这些协同过滤方法得到的推荐物品也可以直接进行推荐,但在精细化的推荐场景中一般把协同过滤得到的推荐物品放在召回集再进一步进行排序,按照先后顺序推荐给用户更个性化的物品。
下面可以具体看下这几种方法的特点:
(1)基于物品的协同过滤
基本思路就是给定一个物品,通过计算物料中其他物品和该物品的相似权重,从而可以推荐给用户喜欢过的物品的相似物品。而通过计算物品相似权重方法的不同,总结可以分为以下几种:
1.根据点击,购买或下载共现来计算物品的权重。也就是当一个用户购买过A,购买过B,也购买过C,那么对物品A来说就会出现两个共现对(A,B),(A,C)。如果另一个用户购买过A,也购买过B,那么就又有一个共现对(A,B)。假设把共现对从某个角度理解成相似,那么对于物品A来说,物品B的相似权重就为1+1=2,物品C的相似权重就为1。当然相似权重的计算方法还有许多,但这种通过共现对计算相似权重的思想万变不离其宗。
2.基于Word2Vec方法计算物品权重。这种方法主要从物品的序列角度来考虑物品的相似性。也就是用户通过购买,点击或下载行为,会产生按照购买先后顺序排列的物品序列,而假设这种物品序列存在着相似关系,也就是离得近的物品会更相似些。通过这种序列关系来对物品之间的相似权重进行建模。其中最常用的方法就是通过word2vec来对物品序列进行建模,学习到每个物品的权重向量,通过物品权重向量之间的欧氏距离来表示物品的相似性。
3.根据DeepWalk产生序列来计算物品权重。这种方法和上面第二种不同之处在于物品序列不是通过用户购买先后顺序构造,而是通过不同用户和不同物品的购买关系构建出图,通过DeepWalk方法来产生出物品序列。
4.结合TF-IDF方法的基于物品协同过滤。这种方法主要是把用户购买或点击的物品记录当作一篇文章,而每个物品相当于文章中的词语,然后计算每个物品的tf-idf值,通过值的大小来反映用户对物品的个性化偏好,之后再通过基于物品协同过滤方法找到用户个性化偏好高的物品的相似物品。
(2)基于用户的协同过滤
和基于物品的协同过滤思路类似,给定一个用户,通过计算该用户和其他用户的相似权重,从而可以推荐给该用户的相似用户喜欢的物品。
(3)基于矩阵分解的协同过滤
该方法主要是利用用户对物品的打分矩阵进行矩阵分解,然后再通过矩阵相乘弥补原始打分矩阵中空白,通过这种方式预测出用户对未打过分物品的打分。具体的详细介绍以及实现步骤可以看之前写的“万物皆可embedding”这篇文章。
▌总结
总体来说,多路召回的好处就是召回的物品考虑到用户兴趣的多样化,一般不会出现某一领域的集中召回,但是由于每一路都需要确定一个Top K中的K这个参数,调参的空间过大。同时对于不同的用户都是固定的K值,不够合理化,因为每一个召回路不同的用户偏好不同,也可能用户在某一召回路不应该有候选物品出现,但是固定的K参数是的必须在该召回路筛选出前K个物品。
点击以下标题查看更多往期内容: