嵌入方法在推荐系统中的应用 (二十)

写在前面:
大家好,我是强哥,一个热爱分享的技术狂。目前已有 12 年大数据与 AI 相关项目经验, 10 年推荐系统研究及实践经验。平时喜欢读书、暴走和写作。
业余时间专注于输出大数据、AI 等相关文章,目前已经输出了 40 万字的推荐系统系列精品文章,今年 6 月底会出版「构建企业级推荐系统:算法、工程实现与案例分析」一书。如果这些文章能够帮助你快速入门,实现职场升职加薪,我将不胜欢喜。
想要获得更多免费学习资料或内推信息,一定要看到文章最后喔。
内推信息
如果你正在看相关的招聘信息,请加我微信:liuq4360,我这里有很多内推资源等着你,欢迎投递简历。
免费学习资料
如果你想获得更多免费的学习资料,请关注同名公众号【数据与智能】,输入“资料”即可!
学习交流群
如果你想找到组织,和大家一起学习成长,交流经验,也可以加入我们的学习成长群。群里有老司机带你飞,另有小哥哥、小姐姐等你来勾搭!加小姐姐微信:epsila,她会带你入群。
作者在《矩阵分解推荐算法》中提到,矩阵分解算法是一类嵌入方法,通过将用户行为矩阵分解为用户特征矩阵和标的物特征矩阵的乘积,最终将用户和标的物嵌入到低维向量空间中,通过用户特征向量和标的物特征向量的内积来计算用户对标的物的偏好得分。
Word2Vec 也是一类嵌入方法,通过构建双层神经网络模型,将词嵌入到低维向量空间,词向量保持了词的句法和语义关系,可以解决各类语言学问题。自从 2013 年 Google 的研究团队发明 Word2Vec 算法后,Worde2Vec 在机器学习领域得到大规模采用,在 NLP、推荐、搜索等领域产生了深远的影响。
本章我们主要讲解嵌入方法在推荐系统上的应用,上面提到的矩阵分解和 Word2Vec 两类算法是推荐系统嵌入方法的核心思想来源,下面讲到的很多嵌入方法思路都来源于此。
本章会从嵌入方法简介、嵌入方法应用于推荐系统的一般思路、几种用于推荐系统的嵌入方法的算法原理介绍、嵌入方法在推荐系统中的应用案例介绍、利用嵌入方法解决冷启动等 5 部分来讲解嵌入方法。希望通过本章的学习读者可以很好地理解嵌入方法的思想、原理、价值以及典型的嵌入方法在推荐系统上的应用案例,最终能够将嵌入方法应用到具体的推荐业务上。
11.1 嵌入方法简介
词嵌入方法最早在自然语言处理领域得到了大规模的使用(见参考文献 1、2、3、4),可以通过学习词的低维向量表示,用于解决词的句法和语义相关的 NLP 问题,如词性标注、关键词提取、句子相似度等等,并且取得了非常好的效果。这种嵌入技术吸引了很多其他领域的研究者进行尝试,并用于更多的业务场景,如搜索(参考文献 11、21)、推荐等,取得了很好的效果。
熟悉深度学习的读者肯定知道,深度学习模型隐含层的向量可以作为一种生成嵌入表示的方法。自编码器和表示学习的一些方法和技术可以很好地用作嵌入,随着深度学习技术的发展壮大,嵌入方法得到大量使用。Word2Vec 本身也是一种浅层的神经网络模型。
嵌入方法有很强的数学背景,在数学领域大量采用,几何学中有所谓的嵌入存在定理,像 PCA 分析本质上是一种高维空间到低维空间的嵌入。在数学上有所谓的射影几何学,研究的就是图形的射影性质,即它们经过射影变换后,依然保持不变的图形性质。可以说从高维空间到低维空间的任何一种映射其实就是一种嵌入。
在这里,我给嵌入方法一个很形式化的数学定义,让读者更好理解。假设

是 n 维空间中的一个二元组,S 是由向量组成的集合,F 是 S 中元素满足的某种关系。那么嵌入方法就是需要我们找到一个映射:

,使得

在

中也大致满足(可能有一定的信息损耗)关系 F。
现实生活中嵌入的案例很多,比如我们在平面中画三维物体其实是一种嵌入,我们需要保持物体之间的相对距离、位置以及遮挡关系,这种关系保持得越好,那么画的就越逼真。
霍夫曼编码就是一种采用最小信息量来编码的方式,我们也可以将从一种可行的长编码到最短霍夫曼编码的映射关系看成是一种嵌入。
通过嵌入,我们可以在更低的维度解决问题,人类的大脑是比较善于处理低维(三维以下)问题的,对高维问题更难理解,所以嵌入方法也是一类方便我们理解和认知的方法。
为什么嵌入方法有效呢?是因为高维空间表达能力太强,现实生活中的样本数量一般是较小的(相比于高维空间近乎无限的表达能力),只能“占据”高维空间很小的一个区域(这个区域一般等价于一个很低维的空间),所以我们可以将这些样本投影到等价的低维空间中,也能让它们有一定的区分度。
总结一下,嵌入方法是指通过数学变换(机器学习算法)将高维空间的对象映射到低维空间并保持相关性质的一种方法。除了方便人类理解外,通过嵌入我们至少可以获得如下价值:
1. 嵌入到低维空间再处理,可以减少数据存储与计算成本(高维空间有维数灾难);
2. 嵌入到低维空间,虽有部分信息损耗,但是这样反而可能提升模型的泛化能力(样本一般含有噪音,通过嵌入低维空间,其实可以“过滤掉”部分噪音);
本章我们主要讲解嵌入方法在推荐系统上的应用,下面我们从嵌入方法的基本原理开始介绍。
11.2 嵌入方法应用于推荐系统的一般思路
上一节对嵌入方法做了一个比较简单的介绍,在本节我们来讲解嵌入方法怎么应用于推荐业务中。一般来说,在推荐系统上,可以采用以下两种嵌入方式进行推荐,下面我们分别介绍。
在讲解之前,先说明一下,对于推荐业务来说,最主要的两种推荐(产品)形态是标的物关联标的物推荐和完全个性化推荐,这里我们讲嵌入方法在推荐上的应用,主要是应用于这两种推荐场景。
11.2.1 学习标的物的嵌入表示
通过构建算法模型,基于用户行为数据、标的物 metadata 数据将标的物嵌入到低维向量空间中,得到每个标的物的嵌入向量表示。有了标的物的嵌入向量,我们可以通过如下三种方式用于推荐业务。
(1) 构建标的物关联推荐
将标的物嵌入到同一个空间后,“距离”越近的标的物往往越相似。我们可以利用该性质来计算两个标的物之间的相似性。一般计算相似性可以采用 cosine 余弦的方法。
我们可以为每个标的物求出最相似的 K 个标的物作为关联推荐。具体在大规模数据情况下,怎么分布式求 topK 相似度,作者在第 6 章《协同过滤推荐算法》6.3.1 节计算 topK 相似度中有详细讲解怎么利用 Spark 来分布式计算,这里不再赘述。
(2) 对标的物进行聚类,形成个性化专题,用于产品运营,也可以用于关联推荐
有了标的物的向量表示,我们还可以对标的物进行聚类,同一类的标的物往往是相似的,这一类标的物可以用于制作专题,通过人工增删部分标的物,给专题起一个描述性的标题,就可以用于人工运营,这是算法和人工配合的很好的一个案例,特别适合长视频行业。另外,聚类后的标的物也可以作为关联推荐,将同一类的其他标的物构造成关联推荐列表。
(3) 为用户推荐个性化的标的物
有了标的物的嵌入向量表示,我们可以非常容易地为用户进行个性化推荐。具体的推荐策略有如下两个:
1. 通过标的物的嵌入获得用户的向量表示,通过用户向量与标的物向量内积计算预测评分
通过用户操作过的标的物的嵌入的“聚合”来获得用户的嵌入表示,可以采用(加权)平均或者 RNN(见参考文献 15,本章不讲解)等方式来聚合。

,记

是用户按照时间顺序最近操作过的 k 个标的物(

是最近操作过的),标的物

的嵌入表示记为

,那么我们可以用如下方式来获得用户的嵌入表示

其中,

是标的物

的权重,我们可以取

,这时不同时间段的标的物权重是一样的,也可以按照时间做等差或者等比的衰减,保证时间最近的标的物权重最大。
通过上面方法获得了用户的嵌入向量表示,再根据用户向量与标的物向量的内积,计算出用户与每个标的物的评分,按照评分降序排序取 TopN 作为推荐列表(剔除用户已经操作过的标的物)。
通过用户操作过的标的物的相似节目来为用户推荐
该方法可以将用户最近操作过的标的物作为种子标的物,将种子标的物最相似的 N 个标的物作为推荐的候选集。具体如下:

当然,上面只是选择出了候选集,一般我们还要给候选集中的标的物打分,按照分值高低将高分的 topN 推荐给用户。具体给候选集中标的物打分的方法可以采用这种方式:用户

操作过标的物

,可以根据具体操作来给

打分(如果是视频播放,那么根据播放时长占整个视频时长的比例来打分),而

又与

相似,那么肯定有一个相似得分,这两个得分相乘就是用户

对标的物

的评分。
11.2.2 同时学习用户和标的物的嵌入表示
嵌入方法还有一种使用方式是将用户和标的物同时嵌入同一个低维向量空间中,这样就可以获得用户和标的物的特征向量,它们是同一维度的。这时我们可以用用户向量和标的物向量的内积作为用户对标的物的偏好评分,获得了评分就可以采用前面讲的方式给用户做推荐了。这种嵌入应用方式的典型代表就是矩阵分解算法,我们在第 8 章《矩阵分解推荐算法》中已经做过深入的介绍,后面我们也会讲解这种联合嵌入的实际案例。
11.3 几种用于推荐系统的嵌入方法的算法原理介绍
前面讲解完了嵌入方法应用于推荐系统的一般思路,在本节我们对几种用于推荐系统中的嵌入方法的算法原理进行详细介绍。
11.3.1 通过矩阵分解进行嵌入的原理介绍
假设所有有评分的

对(

代表用户,

代表标的物)组成的集合为

:

,通过矩阵分解将用户

和标的物

嵌入 k 维特征空间的嵌入向量分别为:


那么用户

对标的物

的预测评分为

,真实值与预测值之间的误差为

。如果预测得越准,那么

越小,针对所有用户评分过的

对,如果我们可以保证这些误差之和尽量小,那么有理由认为我们的预测是精准的。
有了上面的分析,我们就可以将矩阵分解转化为一个机器学习问题。具体地说,我们可以将矩阵分解转化为如下等价的求最小值的最优化问题。

公式 1:矩阵分解等价的最优化问题
其中

是超参数,可以通过交叉验证等方式来确定,

是正则项,避免模型过拟合。通过求解该最优化问题,我们就可以获得用户和标的物的特征嵌入。矩阵分解我们已经在第 8 章中进行了详细介绍了,细节不再赘述。
11.3.2 基于 Word2Vec 嵌入的思想介绍
SGNS(Skip-Gram with Negative Sampling),是 Word2Vec(Google 工程师在 2013 年提出的一种浅层神经网络嵌入方法)中一类重要方法,主要目的是将词嵌入到低维向量空间,可以捕获词的上下文之间的关系。该方法自从被提出后在各类 NLP 任务中获得了非常好的效果,并被拓展到包括推荐系统等在内的多种业务场景中。
下面对该算法的原理做简单介绍。后面讲到的很多推荐系统嵌入方法都是从该算法吸收灵感而提出的。
假设

是有限词汇表

中的一个词序列。Word2Vec 方法将求解词嵌入问题转化为求解下面的目标函数的极大值问题

公式 2:Word2Vec 的目标函数
其中,c 是词

的上下文(附近的词)窗口的大小,

是下面的 softmax 函数:


和

分别是词

的目标(target)和上下文(context)嵌入表示,这里

,参数 m 是嵌入空间的维数。
直接优化公式 2 的目标函数是非常困难的,因为求

计算量太大,是词库大小 N 的线性函数,一般 N 是百万级别以上。
我们可以通过负采样(Negative Sampling)来减少计算量,具体来说,就是用如下的公式来代替上面的 softmax 函数。

这里

是 logistic 函数,M 是采样的负样本(这里负样本是指抽样的词

不在词目标

的上下文中)数量。
最终可以用随机梯度下降算法来训练公式 2 中的模型,估计出 U 、V。读者可以阅读参考文献 1、2、3、4 对 Word2Vec 进行深入学习和了解。
参考文献 12 提出了一个 CoFactor 模型,将矩阵分解和 Word2Vec(参考文献 27 中证明 Word2Vec 嵌入等价于一类 PMI 矩阵的分解,本文作者也是采用的 PMI 分解的思路,而不是直接用 Word2Vec)整合到一个模型中来学习嵌入并最终给用户做推荐,也是一个非常不错的思路。
参考文献 28 借助 Word2Vec 的思路,提出了 Prod2Vec 模型,该算法利用发给用户的电子邮件广告数据,根据用户的邮件点击购买回执了解用户的偏好行为,通过将用户的行为序列等价为词序列,采用 Word2Vec 类似的方法进行嵌入学习获得商品的嵌入向量,最终给用户进行个性化推荐。该算法部署到线上,有 9%点击率的提升。参考文献 16 基于 Prod2Vec 模型,提出了一种整合商品 metadata 等附加信息的 Meta-Prod2Vec 算法模型,提升了准确率,并且可以有效解决冷启动问题,感兴趣的读者可以阅读学习这两篇文章。
有很多开源的软件有 Word2Vec 的实现,比如 Spark、gensim、TensorFlow、Pytorch 等。作者所在公司采用的是 gensim,使用下来效果不错。
11.3.3 基于有向图嵌入
给定一个图

,V、E 分别代表图的顶点和边的集合。所谓图嵌入就是学习每个顶点在低维空间

中的向量表示。利用数学的术语就是学习一个映射:

,将图中每个顶点 v 映射为 d 维空间中的一个向量

。
基于 Word2Vec 和参考文献 23 的思路,我们可以先通过随机游走(random walk)生成图顶点的序列,再利用 Word2Vec 的 Skip-Gram 算法学习每个顶点的向量表示。为了保留图的拓扑结构,我们需要求解如下的目标函数:

这里 N(v)是顶点 v 的邻域,可以定义为通过顶点 v 通过一步或者两步可达的所有其他顶点的集合。

是给定一个顶点 v,通过随机游走获得 v 的一个邻域顶点的概率。
有了上面的定义和说明,剩下的处理流程和思路跟 Word2Vec 是一样的了,这里不再赘述。
参考文献 6、19 分别提供了基于图嵌入进行个性化推荐的解决方案,其中 6 我们会在 11.4.4 中详细介绍。19 提供了一个在异构信息网络(Heterogeneous Information Network,简写为 HIN)中通过随机游走生成节点序列,再将节点序列嵌入低维空间,通过一组 fusion 函数变换后整合到矩阵分解模型中进行联合训练,通过求解联合模型最终进行推荐的方法,该方法也可以有效地解决冷启动问题,具体架构图如下,感兴趣的读者可以参考原文。随着互联网的深入发展,异构信息网络是一类非常重要的网络,在当前的互联网产品中(社交网络产品、生活服务产品等)大量存在,基于 HIN 的个性化推荐也是未来一个比较火的方向之一。

图 1:基于 HIN 推荐的架构(图片来源于参考文献 19)
图嵌入通过将图中节点变换为节点序列再利用 Word2Vec 思路做嵌入,本质就是 Word2Vec 的思路。只是不同的图嵌入方法将图中节点变换为节点序列的实现方案不一样。
11.3.4 利用深度神经网络嵌入
最近几年深度学习驱动的人工智能第三次浪潮对计算机视觉、语音识别、自然语言处理领域有极大的推动作用,在部分机器学习任务(如图像分类、机器阅读理解精确匹配等)上的表现超越了人类专家的水平。同样,深度学习在推荐上也有大量应用,并且在工业界取得了不错的效果。
利用深度学习嵌入进行推荐是深度学习推荐系统中的一类重要方法,其实 Word2Vec 嵌入也是一个神经网络模型,只不过是浅层神经网络。这里我们简单介绍一下,关于深度学习推荐系统,我们在第 12 章会详细介绍。
我们知道自编码器是深度学习中一类非常重要的表示学习技术,通过自编码器,可以获得输入向量的低维表示,这个表示其实就是一种嵌入,我们可以利用这种嵌入来进行推荐。关于利用自编码器技术做推荐的文章有很多,参考文献 25 利用自编辑器联合矩阵分解将附加信息整合到推荐模型中,该算法在部分推荐公开数据集上获得了不错的效果。参考文献 15、26 也是利用自编码器来做嵌入进行推荐的例子。建议读者可以学习一下参考文献 15,是雅虎给出的一个基于自编码器做推荐的案例,并且应用到了雅虎新闻的推荐中,取得了很好的效果,该文的方法也很新颖,值得学习了解。
另外,YouTube 的一篇非常出名的奠基性的深度学习文章(见参考文献 24),这篇文章中将推荐问题看成一个多分类问题(类别的数量等于视频个数),基于用户过去观看记录预测用户下一个要观看的视频的类别。文章利用深度学习来进行嵌入,将用户和标的物嵌入同一个低维空间,通过 softmax 激活函数来预测用户在时间点 t 观看视频 i 的的概率问题。具体预测概率公式见下图:

其中 u、v 分别是用户和视频的嵌入向量。U 是用户集,C 是上下文。该方法也是通过一个(深度学习)模型来一次性学习出用户和视频的嵌入向量。感兴趣的读者可以参考阅读该论文,我们在下一章《深度学习推荐算法》中会详细讲解该算法的原理和核心思想。
11.4 嵌入方法在推荐系统中的应用案例介绍
上一节讲解了 4 类用于推荐系统的嵌入方法,基于这 4 类方法,我们在本节介绍几个有代表性的嵌入方法在推荐系统中的应用案例,让读者可以更好地了解嵌入方法怎么做推荐。这几个案例都是在真实的工业级场景得到验证的方法,值得读者学习和借鉴。
11.4.1 利用矩阵分解嵌入做推荐
通过第 11.3.1 的矩阵分解的介绍,当我们获得了用户和标的物嵌入后,我们计算出用户 u 的嵌入向量与每个标的物嵌入向量的内积

,再按照内积的值从大到小降序排列,剔除掉用户已经操作过的标的物,将 topN 推荐给用户。读者可以参考第 8 章《矩阵分解推荐算法》进行深入了解。
11.4.2 利用 item2vec 获得标的物的嵌入做推荐
微软在 2016 年基于 Word2Vec 提出了 item2vec(参考文献 14),基于用户的操作行为,通过将标的物嵌入到低维向量空间的方式来计算标的物之间的相似度,最后进行关联推荐。下面对该方法进行简单介绍。
我们可以将用户操作过的所有标的物看成词序列,这里每个标的物就相当于一个词,只是这里用户操作过的标的物是一个集合,不是一个有序序列。虽然用户操作标的物是有时间顺序的,但是标的物之间不像词序列是有上下文关系的(一般不存在一个用户看了电影 A 之后才能看电影 B,但是在句子中,词的搭配是有序关系的),因此这里当成集合会更合适。所以,我们需要对 Word2Vec 的目标函数进行适当修改,最终我们可以将 item2vec 的目标函数定义为

这里不存在固定的窗口大小了,窗口的大小就是用户操作过的标的物集合的大小。而其他部分跟 Word2Vec 的优化目标函数一模一样。
最终用向量

(参考 11.3.2 中对

的定义)来表示标的物的嵌入,用 cosine 余弦相似度来计算两个标的物的相似度。也可以用

、

、

(

和

拼接在一起的向量)来表示标的物的嵌入。
作者公司也采用了 item2vec 算法来对视频进行嵌入,用于视频的相似推荐中,点击率效果比原来的基于矩阵分解的嵌入有较大幅度的提升。
11.4.3 阿里盒马的联合嵌入推荐模型
阿里盒马利用 Word2Vec 思想对不同类别的 ID(item ID、product ID、brand ID、store ID 等)进行联合嵌入学习,获得每个 ID 的嵌入表示,下面我们对该方法进行简单介绍(细节介绍见参考文献 7)。
给定一个 item 序列

,Skip-Gram 模型通过优化如下的平均对数概率目标函数

这里 C 是上下文窗口的长度。下图是某个用户的浏览序列,其中前 5 个浏览记录是一个 session(用户的一次交互序列,可以按照时间,比如按照一个小时切分,将用户在 APP 上的操作分为多个 session)。

图 2:用户在 APP 上的行为序列
其中,

定义如下


分别是 item 和 context 的嵌入表示,m 是嵌入空间的维数,D 是总的 item 数,也就是盒马上的所有商品数量。
上述公式求导计算复杂度正比于 D,往往 D 是非常大的,所以类似 Word2Vec,可以采用如下的负采样技术减少计算量

公式 3:item 的对数条件概率
这里 S 是从正样本 item 的噪音分布

(item 及其上下文之外的物品的分布)中抽取的负样本的数量。

一般取均匀分布,但是对于商品来说,分布其实是不均匀,很多商品是热门商品,搜索购买的人多,另外一些相对冷门。因此,为了平衡商品之间的冷热情况,最终从 Zipfian 分布来抽取负样本。具体采样方式如下:
先将所有样本按照访问量降序排列按照[0,D)来索引,我们可以用如下公式来近似 Zipfian 分布

累积分布函数可以记为

令

,这里 r 是从均匀分布

抽取的随机数,那么 Zipfian 分布可以近似表示为

即负采样可以先从

抽取随机数 r,按照上面公式计算出 index,这个 index 对应的 item 就是采样的 item(要剔除掉 item 本身及它的 context 中的物品)。通过该方式采样可以大大加速训练过程。
讲解完了 item ID 的嵌入方法,下面我们来说下怎么对多个 ID 进行联合嵌入训练。对于商品来说,每个商品都有对应的产品、品牌、供应商,并且还有不同维度的分类。下面给出一个 item 关联的 6 个 ID,分别是 product ID、brand ID、store ID、cate-level1 -ID、cate-level2 -ID、cate-level3 -ID。拿苹果手机举例来说,item ID 代表的是 iPhone X 64G 黑色版对应的 ID,而 product ID 对应的是 iPhone X 的 ID,brand ID 对应的是 Apple 的 ID,storeID 对应的是苹果官方旗舰店的 ID,cate-level1 -ID、cate-level2 -ID、cate-level3 -ID 分别是科技产品、消费类电子产品、智能手机等分层次的类别。

上图是 item ID 和它的属性 ID 之间的关联关系,假设有 K 个 ID,我们按照顺序记为

这里

,而

分别是 product ID、brand ID、store ID 等。那么类似上面对独立 item 的对数条件概率公式 3,对于多 ID 联合嵌入,我们有如下公式

上式中,

和

分别是第 k 个 ID 的 context 和 target 嵌入表示,

是嵌入空间的维数,不同类型的 ID 可以嵌入到不同维数的空间中,

是

的权重系数。假设第 k 个 ID(比如 brand ID)包含

个不同的 item(这个品牌包含

个不同的 item),即

这里

,我将

定义为

的倒数是合理的,具体有

举例来说,我们始终有

,如果

包含 10 个不同的 item,那么

。item ID 与它的属性 ID 之间是有很强的关联的。如果两个 item ID 的嵌入向量相似,那么他们的对应属性 ID 的向量也是相似的,反之亦然。因此我们定义

公式 4:item 的条件概率公式
这里

是将嵌入向量

变换到与

同一纬度的矩阵变换。最终的联合嵌入最优化问题可以定义为

其中

都是超参数。由于各类 ID 是相对固定的,上述模型可以较长时间(比如一周)训练一次,也不太会影响最终推荐的精度。
通过上述最优化问题求解,获得了 item 的嵌入表示,那么我们可以采用 11.2.1 中(3)的方法来为用户做个性化推荐,这里不细说了。读者可以阅读参考文献 7,对技术细节做更细致了解。
11.4.4 淘宝基于图嵌入的推荐算法
我们 11.3.3 有向图嵌入中对图嵌入方案进行了介绍,在这里我们详细讲解淘宝基于图嵌入做推荐的一个算法模型,感兴趣的读者可以详细阅读参考文献 6 了解更多细节介绍。下面我们分 4 个部分来分别讲解。
(1) 从用户行为构建 item 有向图
用户在淘宝上的访问行为是有时间顺序的,是一个行为序列,一般协同过滤只考虑了用户访问的商品是否在同一个行为序列中,而忽略了访问的序关系,而序关系可能反应了用户的兴趣特征。一般不会考虑用户整个访问历史,因为这样计算量大,并且用户兴趣是随着时间变化的。所以将用户在一段时间内(比如一个小时)的行为作为一个 session 来考虑。
我们可以通过如下步骤来构建用户行为 session 的有向图(参考下图中 a、b 两个步骤):所有商品构成图的顶点,如果两个商品在某个用户的一个 session 中是相邻的(即该用户连续访问了这两个商品),那么我们就可以在这两个顶点构建一条有向边(用户访问节点的次序就是边的方向),边的权重可以是这两个商品在所有用户 session 中出现的次数。通过这个方式,我们就可以构建出基于用户行为的有向图了。这时边的权重就代表了两个顶点之间基于用户行为的相似度。

图 3:构建用户行为有向图
(2) 图嵌入
构建好有向图后,我们就可以采用随机游走(参考文献 23 的 DeepWalk 方法,参考文献 13、17、18 提供了其它利用图嵌入的方法,其中 17、18 提供了比其他图嵌入方法更高效的实现方案,可以大大节省嵌入训练的时间)的方式生成行为序列(参见图 3 中的 c)。后面我们再用 Skip-Gram 算法学习图的顶点(商品)的嵌入表示(参考图 3 中 d 的 Skip-Gram 模型)。我们需要最大化通过随机游走生成序列中的两个顶点同时出现的概率,具体来说,我们需要求解如下最优化问题:

上式中 w 是生成的序列中上下文节点的窗口大小。可以假设窗口中不同的节点是独立的。那么可以做如下简化

利用 Word2Vec 中提到的负采样技术,最终的优化目标函数为

上式中

是为

采样的负样本集合,

是 logistic 函数,
越大,采样样本越多,模型最终效果越好。

(3) 图嵌入整合附加信息
每个商品是包含价格、品牌、店铺等附加信息的,这些附加信息可以整合到 Skip-Gram 模型中,这样即使该商品没有用户行为,也可以用附加信息的嵌入获得嵌入向量,从而解决冷启动问题。
具体来说,可以将附加信息跟商品拼接起来,在模型中增加一个聚合层,将商品和它的附加信息嵌入平均化,即通过下式来获取隐含层的表示(参见图 4 的模型表示)。

上式中,

是商品 v 的嵌入表示,

是附加信息的嵌入表示,我们假设商品嵌入和附加信息嵌入到相同维度的空间中,这样才可以求平均。

图 4:在 Skip-gram 中整合附加信息
(4) 增强的图嵌入整合附加信息
(3)中假设所有的附加信息权重是一样的,实际上不同的附加信息权重不一样,我们可以给不同附加信息不同权重,让模型效果更好。不同的附加信息的权重可以根据经验给定,或者作为模型参数来学习获得。
通过图嵌入,有了商品的嵌入向量表示,我们就可以用 11.2.1 中(3)的第 2 个方法给用户做推荐了。
11.4.5 整合标的物多种信息的 Content2Vec 模型
参考文献 10 中提出了一种整合物品图像、标题、描述文本、协同信息的 Content2Vec 模型,该方法将不同类型的信息通过不同的嵌入方法生成的嵌入向量聚合起来,形成一个统一的模型来预测两个商品是否会被一起购买的概率,该模型的架构如下图。

图 5:多源信息嵌入预测两个商品被一起购买的概率
具体来说,该模型包含三个主要模块:
(1) 内容嵌入模块
通过不同的算法将商品不同维度的信息嵌入到低维空间中,这些不同源的信息嵌入过程是解耦合的、可插拔的,可以用不同的算法来取代。图像嵌入可以用图像分类的算法获得(如 AlexNet 等),而文本的嵌入可以用 Word2Vec 获得,协同信息的嵌入可以用矩阵分解算法获得。
(2) 多源联合嵌入模块
该模块将(1)不同源的商品信息嵌入向量,通过一个统一的模型获得联合嵌入表示。
(3) 输出层
输出层结合两个商品的联合嵌入向量,计算出这两个商品被一起购买的概率。具体来说,两个商品的联合嵌入向量通过求内积,再经过 sigmod 函数变换获得概率值。
通过上述方法可以获得每个商品的嵌入向量,我们就可以用 11.2.1 中(3)的第 2 个方法给用户做推荐了。
11.5 利用嵌入方法解决冷启动问题
我们在第 10 章《推荐系统冷启动》中已经对冷启动的方法做了全面的介绍,本节我们具体说说嵌入方法是怎么解决冷启动的,算是对冷启动这章案例的补充和完善。嵌入方法除了可以用于推荐外,通过整合附加信息(side information)到嵌入模型中,可以很好地解决冷启动问题。我们知道基于内容的推荐可以缓解冷启动问题,这些附加信息也一般是内容相关的信息,所以整合进嵌入模型中就可以用于解决冷启动。下面我们简单介绍 4 种通过嵌入解决冷启动的案例。
11.5.1 通过在矩阵分解中整合内容相关信息解决冷启动
参考文献 9 中给出了一种在矩阵分解中整合用户特征和标的物特征的方案,可以有效地解决用户和标的物冷启动问题。这篇文章我们在第 8 章《矩阵分解推荐算法》中 8.4.6 节进行过介绍,这里不再赘述。
115.2 通过不同 ID 间的结构链接关系及不同平台用户的特征迁移来解决冷启动
参考文献 7 中,每个 item ID 会关联对应的 product ID、brand ID、store ID 等,对于一个新的 item 来说,这个 item 所属的产品、品牌或者店铺可能会包含其它的 item 被用户点击购买过,那么一种很自然的方式是用这个 item 关联的其他 ID 的嵌入向量来构造该 item 的近似嵌入表示。
因为

是单调递增函数,结合 11.4.3 介绍的阿里盒马的联合嵌入模型中公式 4,那么我们就有如下近似公式

要想让上式取值最大,当

与后面括号中的向量方向一致才可能达到。那么我们就可以用

来近似 item 的嵌入。当然不是跟 item ID 关联的所有 ID 都有嵌入,我们只需要选择有嵌入的 ID 代入上式中即可。通过模型线上验证,这种方式得到的嵌入效果还是很不错的,可以很好地解决商品冷启动问题。
同时,这篇文章中通过不同 APP 用户特征的迁移可以解决用户冷启动,下面也做简单介绍。
盒马和淘宝都属于阿里的电商平台,淘宝通过这么多年的发展已经覆盖了绝大多数的用户群,大部分盒马的用户其实也是淘宝的用户,那么对于盒马上的新用户,就可以用该用户在淘宝上的特征,将特征迁移到盒马上来,为他做推荐。下面来简要介绍这种推荐策略的流程与方法。
假设淘宝的用户为

,盒马上的用户为

,他们的交集为

(

)。那么按照下面流程就可以为盒马的新用户做推荐了:
(1)采用第 11.4.3 的方案计算出淘宝平台上用户的嵌入向量;
(2) 将

的用户根据在淘宝上的嵌入向量用 kmeans 聚类聚成 1000 类;
(3) 对于(2)中的每一类,将这一类用户在盒马上购买的 topN 热门商品计算出来作为推荐候选集;
(4) 对于从淘宝来的新的盒马用户,我们先从上面的 1000 类中找到与该用户最近的类(该用户的嵌入向量与类中心距离最近);
(5) 将该新用户最近的类的 topN 热门商品推荐给该用户。
下面的图 6 可以更好地帮助大家理解上面的流程。通过这 5 步就可以为盒马的新用户做推荐了。当然如果一个用户是盒马的新用户但不是淘宝的用户(或者是淘宝的新用户),那么这个方法就无能为力了,但是这种情况毕竟是很少的(因为淘宝覆盖了中国绝大多数的电商用户),所以该方法基本解决了盒马大部分新用户的冷启动推荐问题。

图 6:通过跨平台特征迁移来为新用户做推荐
11.5.3 通过在图嵌入中整合附加信息解决冷启动
我们在第 11.4.4 中已经说明了在有向图嵌入构建 Skip-Gram 模型过程中整合附加信息可以解决冷启动问题,这里不再说明。
11.5.4 通过图片、文本内容嵌入解决冷启动问题
前面我们在 11.4.5 中讲解了 Content2Vec 模型,该模型通过将图片、文本、类别等 metadata 信息嵌入,再将这些不同源的嵌入向量通过一个统一的模型获得联合嵌入表示,最终通过

(A、B 是两个商品的嵌入向量)输出层来训练获得最终的商品嵌入表示。通过该方法,即使没有足够多的用户行为,因为模型整合了图片、文本信息,可以有效避免冷启动问题。
上面只是列举了 11.4 节案例中几种可以解决冷启动的算法模型,其他可以解决冷启动的模型这里不一一列举。总结下来,只要是模型中整合了附加信息,基本都可以有效缓解冷启动问题。
总结
随着 Word2Vec 等嵌入方法在 NLP、推荐、搜索等各个领域的成功运用,嵌入方法越来越受欢迎。本章讲解了嵌入方法的思想、嵌入方法在推荐上的应用思路、介绍了用于推荐业务的几种嵌入方法的一般原理,最后给出了几个工业界利用嵌入方法做推荐的算法案例及怎么利用嵌入方法缓解冷启动问题。参考文献整理了很多关于嵌入方法理论及其在搜索、推荐中的应用的论文,值得读者研究和学习。
从数学的角度来说,嵌入方法就是一种投影映射,通过选择合适的映射将复杂空间的向量投影到低维空间,保持某些性质的不变性,可以更容易地解决很多机器学习问题。目前嵌入方法在推荐上的应用基本都是基于矩阵分解、Word2Vec 及深度学习的思想通过部分整合附加信息来实现的。我相信未来有更多的理论知识的突破来支持嵌入方法更好地用于推荐业务,嵌入方法未来一定有更大的发展前景和应用价值,让我们拭目以待!
参考文献
1. [Word2Vec] Distributed Representations of Words and Phrases and their Compositionality (Google 2013)
2. [Word2Vec] Efficient Estimation of Word Representations in Vector Space (Google 2013)
3. [Word2Vec] Word2vec Parameter Learning Explained (UMich 2016)
4. Network–Efficient Distributed Word2vec Training System for Large Vocabularies
5. A Deep Embedding Model for Co-occurrence Learning
6. [2018 阿里] Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba
7. [2018 阿里] Learning and Transferring IDs Representation in E-commerce
8. [2017 facebook] StarSpace:Embed All The Things
9. [2015] Metadata Embeddings for User and Item Cold-start Recommendations
10. [2017 Criteo] Specializing Joint Representations for the task of Product Recommendation
11. [2018 Airbnb] Real-time Personalization using Embeddings for Search Ranking at Airbnb
12. [2016 Netflix] Factorization Meets the Item Embedding- Regularizing Matrix Factorization with Item Co-occurrence
13. [2016] node2vec- Scalable Feature Learning for Networks
14. [2016 微软] Item2Vec- Neural Item Embedding for Collaborative Filtering
15. [2017 Yahoo] Embedding-based News Recommendation for Millions of Users
16. [2016] Meta-Prod2Vec: Product Embeddings Using Side-Information for Recommendation
17. [WWW 19] NetSMF: Large-Scale Network Embedding as Sparse Matrix Factorization
18. [IJCAI 19] ProNE: Fast and Scalable Network Representation Learning
19. [2017] Heterogeneous Information Network Embedding for Recommendation
20. Representation learning: A review and new perspectives
21. [2017] Learning a Hierarchical Embedding Model for Personalized Product Search
22. [2017] MRLR: Multi-level Representation Learning for Personalized Ranking in Recommendation
23. Deepwalk: Online learning of social representations
24. [YouTube 2016] Deep Neural Networks for YouTube Recommendations
25. [2017 携程] A Hybrid Collaborative Filtering Model with Deep Structure for Recommender Systems
26. [2015] Deep Collaborative Filtering via Marginalized Denoising Auto-encoder
27. [2014] Neural Word Embedding as Implicit Matrix Factorization
28. [2016 Yahoo] E-commerce in Your Inbox: Product Recommendations at Scale
29. [2016] Deep coevolutionary network: Embedding user and item features for recommendation
版权声明: 本文为 InfoQ 作者【数据与智能】的原创文章。
原文链接:【http://xie.infoq.cn/article/32a4de142764925a0025715a2】。文章转载请联系作者。
评论