胡学林,艾山·吾买尔
新疆大学 软件学院,乌鲁木齐830008
人类现实生活的需求推动着科学技术的发展进步。近年来,先进的电子元器件技术从学术研究到工业落地,发展迅速,通讯、存储等互联网关键基础技术也在快速推进。最直接的结果就是数据总量大幅度增长。预计在2025 年,全球数据总量将从2018 年的33 ZB 增至175 ZB。中国数据总量增速最为迅速,平均每年的增长速度比全球快3%。2018 年,中国数据总量占全球的23.4%,即7.6 ZB,在2025 年将达到48.6 ZB,占全球的27.8%[1-2]。这些数据中蕴含着丰富的人类活动信息,巨大的潜在价值等待人们去挖掘。如何从这些丰富但又复杂的数据中提取出有用的信息成为一个关键难题,即如何应对“信息过载”问题。推荐系统就是从海量的数据中,挖掘出用户感兴趣的项目(如商品、电影、音乐等),并推送给用户[3-7]。
推荐系统的核心是推荐算法。传统推荐算法一般可以分为基于内容的推荐算法(Content-Based Filtering)[8]、协同过滤推荐算法(Collaborative Filtering)[9]和混合推荐算法(Hybrid Recommender)[10]等三类。基于内容的推荐算法是利用用户历史交互过的项目去搜索与此项目具有相似属性的项目作为推荐结果。这类方法原理简单,推荐结果比较直观,具有很好的可解释性,相比协同过滤,不需要应对数据稀疏[11]问题,但推荐的效果强依赖于高质量的特征提取,因此一个好的基于内容的推荐算法需要构建丰富且有效的特征工程。使用协同过滤方法的推荐系统将从大量用户历史行为数据中统计出来的概率作为统计特征,进行计算,得出结果。具体实现方法有矩阵因子分解[12]、奇异值分解[13]等,在其获得良好成绩的同时,也面临着数据稀疏的问题,尤其是在当前大数据爆发的时代,一个用户不可能和亿万级项目都存在交互行为,因而对应的交互信息矩阵(如评分矩阵)会十分稀疏,并且还存在冷启动问题(一个新用户或新项目在系统中没有任务历史数据)[14]。混合推荐系统为了缓解上述两种方法中存在的数据稀疏和冷启动的问题,通过融合多源异构的特征信息(如用户评价、项目标签等),组合不同的推荐算法进行项目推荐。但这些特征信息的数据结构不同,规模大小不等且分布不均匀[15],如何将这个多源异构的特征信息有效融合也是混合推荐算法要解决的一个问题。
部分研究人员将分布式表示技术引入到推荐系统中,将推荐系统中的项目视为自然语言处理中的单词,用户日志中的行为记录视为语料,通过分布式表示技术将项目表示成融入了用户行为特征信息的向量,再进行下一步的推荐工作。基于分布式表示技术的推荐算法可以很好地应对数据稀疏与冷启动问题,且适用的推荐场景多样。自2016年分布式表示技术首次被引入到推荐领域,基于分布式表示的推荐算法慢慢进入到研究人员的视野。因其可以直接对用户行为建模,国内外各IT企业都纷纷尝试引入了相关实现的推荐系统并部署于生产,领域涵盖电子商务、社交网络、知识推送、文化娱乐等多类服务,且具有良好的推荐效果。
推荐系统最早在20世纪90年代提出,在文献[16]中首次将推荐系统称为“数字书架”。
推荐系统的任务对用户给定的一个项目(音乐、电影等)进行“评分”或“偏好行为”预测,或者是从一个巨大的项目集合,将“评分”或“偏好行为”较高的子集作为推荐结果推送给用户,因此推荐系统也可以看作是信息过滤系统的一个子集[5]。一个推荐系统中算法模型可以定义为如下:
式(1)中,y^uv为模型的预测结果,θ 为模型参数,u、v分别输入的用户(user)和项目(item)的信息,f 为模型参数映射到预测结果的函数。
传统的推荐算法大致可以分为:基于内容的推荐算法,协同过滤的推荐算法以及混合推荐算法。
基于内容的推荐算法是利用用户历史交互过的项目去搜索与此项目具有相似属性的项目作为推荐结果,在进行推荐之前需要对用户与项目进行特征信息的提取,构建出项目的特征信息与用户画像[6]。基于内容的推荐方法非常适用于用户信息不足但项目内容丰富的场景,对于用户可以不需要太多的信息,只需要用户交互过项目,从这些项目中找出属性相似或偏好程度较高的项目,并将这些交互项目与待观测的项目进行特征比对,找出相似度较高的项目进行推荐。
该算法的主要优点是对于新项目无需应对冷启动问题,不足之处在于对项目特征提取的依赖强,但目前数据信息多源异构,如图像、视频数据的特征构建成本高。基于内容的推荐方法在一定程度上会制约推荐结果的多样性与新颖性[17],因为每次都从相同的项目中获取推荐结果,最终计算出来的推荐项目基本上差不多,没有太大变化。
协同过滤的推荐算法是通过用户对项目的交互行为,寻找用户或物品的近邻集合进行推荐,是基于“过去同意的人将来也会同意,他们也会喜欢过去喜欢的类似项目”的假设[18],即用户对之前项目的偏好行为,会影响到用户对之后类似项目的行为。例如用户对某首歌曲给出较高的评分,下次对类似歌曲也会不失一般性地给出较高的评分。协同过滤的方法主要分为基于内存的协同过滤方法[19-21]与基于模型的协同过滤方法[22-25]。
基于内存的方法使用用户评分数据来计算用户与用户之间或项目与项目之间的相似度,在实际应用中可再细分为基于用户的协同过滤方法[19]与基于项目的协同过滤方法[20]。基于模型的协同过滤方法使用不同的机器学习算法来构建模型,以预测用户对未评分项目的评分。常见的协同过滤模型包括贝叶斯网络[22]、聚类模型[23]、潜在语义模型(例如奇异值分解)[13]。
混合推荐算法是目前实际应用最多的推荐方法,将协同过滤、基于内容的过滤和其他方法结合在一起。根据各推荐算法混合时机的不同,混合推荐可以分为以下三类:
(1)分别进行基于内容的预测和基于协作的预测,然后将二者的预测结果再通过投票机制、线性组合等方式给出最终结果。
(2)将基于内容的功能添加到协同过滤的方法中或者将协同过滤的方法引入到基于内容的推荐方法中,即以一种推荐算法为基础,另一种推荐算法融入其中成为其功能的一部分。
(3)将多种推荐算法融入到一个统一的模型中,不分先后地将各类数据输入到统一的模型中,产生推荐结果。
混合推荐可以利用自身多算法集成的优势,取长补短,有效地缓解冷启动和数稀疏性问题。值得注意的是,随着互联网的普及以及社交媒体的快速发展,大量的用户社交内容可以被获取,这些内容丰富多样,包括社会化关系、文本评论、标签信息、位置信息、音频、视频等。许多学者从这些内容中提取可用的社会关系属性信息作为辅助信息融入到推荐算法中,从而衍生了大量新的推荐算法,例如社交网络推荐算法、知识感知的推荐算法[24-25]。
分布式表示技术(Distributed Representation)在自然语言处理中的一种具体实现就是词嵌入。嵌入源自于数学领域中的一个专有名词Embedding,在数学中,嵌入是指将一个对象X 映射到一个对象Y ,这样一个映射过程就是嵌入。词嵌入本质上遵循离散分布假说(Distributional Hypothesis)[26-28],在语言学的角度,分布式假说是从语义层面衍生出来,即一个词的意思可以由该词的上下文表示,因为语义相似的词拥有相似的上下文。在自然语言处理中,词嵌入就是将每个单词嵌入到同一个语义向量空间中。其本质是数学中嵌入,因此可以将这些词向量通过一系列的数学计算得出一些想要的结果,例如通过余弦相似度(Cosine Similarity)可以得出在这个向量空间语义最相似的单词。
如图1 所示,常用的词向量训练方法有连续词袋模型(Continuous Bag-of-Words,CBOW)与跳词模型(Skip-Gram)两种,前者通过上下文去预测中心词,后者通过中心词去预测上下文[27-28]。本文主要以Skip-Gram为例,对分布表示技术理论进行阐述。
图1 CBOW与Skip-Gram结构图
Skip-Gram模型如下所示:
给定序列(w1,w2,…,wT),wi∈W,,Skip-Gram的目标就是最大化式(2)的概率。其中,c 为训练时的上下文大小,wt是中心词,P(wt+j|wt)表示wt出现的条件下wt+j出现的概率,即wt与wt+j的共现(Co-occurrences)概率。
式(3)使用Softmax 函数形式来定义标准的Skip-Gram概率公式P(wO|wI),|W|表示词袋(Bag-of-Words)的大小,即单词的总数量;v′表示输出的向量,v 表示输入向量。式(3)是理想情况下的概率,在现实中W 的数字太大(通常在105~107),直接以式(3)进行计算,运算成本高,因此会进行简化。简化的方式就是降低训练过程中|W|的实际运算数量。常用的方法包括分层Softmax(Hierarchical Softmax)和负采样方法(Negative Sampling)。
(1)分层Softmax
如图2 所示,二叉树中有||W 个叶节点,对应词袋W 中所有的单词。树中任一单词w,可以通过一条合适的路径到达根节点root,令n(w,j)为从root 到单词w 的路径上的第j 个节点,L(w)为该路径的长度,则n(w,1)=root,n(w,L(w))=w。
图2 分层Softmax示意图
对每个非叶节点,设ch(n)为n 的某个固定的子节点(可以固定为右子节点或左子节点),则分层Softmax可以将P(wO|wI)重新定义如下:
分层Softmax 的计算效率和二叉树的结构紧密相关,会直接影响模型的训练时间和准确率。文献[26]采用的是霍夫曼树(Binary Huffman Tree)[29],因为它将高频词分配在离root节点更近的地方,加快训练的时间。
(2)负采样
负采样思想来源于噪声对比估计(Noise Contrastive Estimation,NCE),即一个好的模型可以通过逻辑回归的方式从噪声数据(负样例)中分辨出正确(正样例)的数据[30]。基于这个思想,引出类似的负采样方法,从而将式(3)简化为:
式(6)中,k 为负采样的个数。Pn为噪音(noise)的分布。将被预测的词称为正例,被负采样采集的词称为负例,如图3所示。
图3中,在标准的Skip-Gram算法中,单词“进行”除了与被预测的正例单词“各个”“分议题”“讨论”和“交流”进行计算,还需要与单词序列中其他所有的非正例单词进行计算,在基于负采样方法简化的式中,只需要与负例单词“与会”“学者”和“指出”进行计算。通过负采样的方式,在模型训练过程,极大地减少了计算以及权值更新的范围,降低了模型整体的训练时间。
所有基于分布式表示技术的推荐算法,基本思想都是一致的:将一个用户的行为日志(如商品的浏览记录、音乐的播放记录、电影的观看记录、房源的预订记录等)视为一段自然的文本序列,采用自然语言处理中的词嵌入方法,将这个序列中的项目(商品、音乐、电影、房源)映射成具有特定信息的空间向量,后续的推荐工作可以借用这些向量的空间相似性(如余弦相似性、欧氏距离等)进行推荐计算。
与自然语言处理又有所不同,在任何一种语系(如汉语、英语)中,单词数量基本是固定不变的(词袋数量、语义等多方面),但在某个具体的推荐领域中(如电商、音乐),项目的数量、参数(大小规格、颜色外观等)以及用户与项目之间的交互行为都可以变化。因此在基于原来的词嵌入技术的基础上,在推荐算法建模的过程中,各类算法会根据具体的业务实际做调整以达到最好的推荐效果。
一般分布式表示推荐算法在原有的模型上并没有做太多的改变,除了调整部分采样参数。实验证明基于分布式表示技术的语言模型可以应用于推荐系统中,主要有Item2vec[31]以及Prod2vec[32],以及将BERT[33-34]模型引入到推荐领域的BERT4Rec[35]。
(1)Item2vec
文献[31]将基于负采样的Skip-Gram模型(Skip-Gram with Negative Sampling,SGNS)应用在推荐系统中,分别将应用软件商城中的购买记录以及用户音乐收听记录序列视作自然语言处理中的文本序列,对于出现在同一集合中项目视为正例,其他项目视为负例。不考虑物品序列生成的时间前后顺序,静态地将在同一集合中出现的项目视为相似的项目。
不修改模型结构的前提下,在训练时要将项目序列的顺序打乱,增加噪声,也因此忽略了详细的用户行为序列;与自然语言处理中相比,在模型训练参数的调整上,增大了式(5)负采样的个数。Item2vec计算出的项目向量和SVD 算法得出的项目向量通过KNN 的聚类结果相比,同样可用于项目的相似度比较,且Item2vec 的向量可以得出更好的聚类效果,说明相比传统协同过滤的推荐算法,分布式表示算法可以学习得出更出色的表征向量。Item2vev算法的不足是:只简单地利用了项目间的共现信息,因打乱了原始项目时序,从而忽略了用户行为的序列信息。
(2)Prod2vec与Bagged-Prod2vec
文献[32]提出Prod2vec 与Item2vec 的作法基本一致,只是数据集的类型有些差异。作者将视线转移到电子邮件中的账单收据和产品广告中,通过用户邮箱中带有时间戳信息的邮件记录来确定用户行为序列。相比Item2vec,Prod2vec保留了原有的项目时序关系。
在Prod2vec算法中,假定用户的一封邮件中的多个商品是相互独立的,相当于一封邮件中只有一个商品。但是在实际场景中,用户会同时购买多个商品,也就是说一封邮件的账单收据是由多个商品记录构成的,继续使用Prod2vec无法应对这种情况。因此,在Prod2vec的基础上提出了Bagged-Prod2vec算法。Bagged-Prod2vec将商品序列建模提升到对邮件序列建模。商品表示向量可通过优化以下目标函数公式得到:
式(7)中,pmk表示第m 封邮件中接收到的第k 个产品;em+j表示第m+j 封邮件中所接收到的所有产品集合{pm+j,1,pm+j,2,…,pm+j,Tm} ,计算与第m 封邮件中第k个商品的上下文商品的概率为:
式(8)中,每个因子式都用式(9)形式计算,并采用负采样的方法进行简化。Bagged-Prod2vec算法根据实际的业务场景,对原有模型做了适当性的修改,让属于同一邮件的项目的表示向量在空间中距离更加接近,同时让模型的复杂性变高,训练时长也增加了。
(3)BERT4Rec
图3 负采样示意图
单向序列预训练模型是严格按照用户行为发生的时间递进顺序从左到右进行训练,Prod2vec就是单向序列训练的。文献[35]认为单向序列预训练模型会限制用户行为序列在用户偏好捕捉工作上的发挥,采用双向的项目向量预训练可以更好地学习用户的行为特征。于是将BERT首次引入到了推荐任务中,提出BERT4Rec模型:给定用户集合U={u1,u2,…,u|U|} ,项目集合V={v1,v2,…,v|U|}以及用户行为序列BERT4Rec 模型旨在预测用户u 与项目vu+1进行交互的概率,可定义如下:
图4 mask预测示意图
对输入序列,随机将m 个项目进行掩盖(mask),利用上下文项目去预测被掩盖的项目的概率。最终定义目标损失函数:
式中,s′u表示用户行为序列的masked版本;就是被随机掩盖的项目集合;是被掩盖的项目;是真实的项目。BERT4Rec相比前面几类算法,模型结构更加复杂,训练成本更高,通过左右兼备地去预测被掩盖的项目,训练得出的项目表示向量在推荐过程中取得的效果更好。但因其模型过于复杂,所以不适用于线上的实时推荐。
一般的分布式推荐算法并没有考虑到下述实际应用场景:用户出于某种目的,在浏览了一系列项目后,会将感兴趣的某个项目收藏或是直接购买,比如为了购买一双鞋子,通常会浏览许多相类似的产品,最终才会选择想要购买的商品。因此,除了预测同一集合中各项目之间的共现概率,还可以从这个集合中取出或设立一个关键的全局上下文,这个全局上下文每次都会参与预测,通过提升全局上下文与各目标项目之间的相关性,更直接反映用户行为特点。根据业务场景不同,引入不同全局上下文,并且在训练过程中,让目标的表示向量不断地向全局上下文靠近,将二者在向量空间中的距离拉近,赋予目标表示向量新的潜在信息。引入全局上下文的分布式表示推荐算法有User2vec[32]以及Listing Embeddings[37]等方法。
(1)User2vec
文献[32]提出的User2vec 模型是将用户向量设置为全局上下文,可以同时学习用户和物品的向量表示。结构如图5所示。
图5 User2vec结构图
如图5所示,User2vec采用的是CBOW预训练模型,训练集同样是用户行为序列,序列由用户un与其购买的商品序列(pn1,pn2,…,pnUn)组成。Un是用户un购买的商品的数量。User2vec的目标损失函数可以定义如下:
式(12)中,c 表示第n 个用户的行为序列的上下文大小。第n 个用户在购买了第i-c 至i+c 个商品,再购买第i 个商品的概率以Softmax函数的形式定义如下:
通过将用户与项目同时嵌入到同一向量空间,从用户的角度分析,用户向量可以直接与项目向量进行相似度进行,从空间快速找出合适的项目进行推荐;从项目的角度分析,某个用户行为序列中不同项目向量在训练过程中会不断与用户向量靠近,让学习得到的项目向量在空间中距离更接近。不足在于用户行为多变,意味着用户向量也要随着变化,且重新计算的代价较高,不适用于线上实时推荐。
(2)Listing Embeddings
如图6所示,不同于User2vec将用户视为全局上下文,文献[37]将用户行为中最终预订(或收藏)的项目作为全局上下文。根据具体的推荐业务场景特点对模型做出调整。应用的推荐领域是旅游房源的订购推荐。
图6 Listing Embeddings结构图
根据业务场景的特殊性,一位游客从出发点前往目的地,一般情况下,他不会去浏览这两个地点之外的旅馆信息,因此在负采样过程中,直接将目的地内的房源视为正例,非目的地的房源视为负例,不能完全反映实际,因为现实场景是非目的地的房源在一段用户浏览的房源序列中,出现在序列的几率不高。因此在负采样的过程中,负例样本也应该来源同一目的地。
最终的优化目标可以表示为:
Listing Embeddings在原来的语言模型上的改动并不大,更多地是贴合现实中的用户消费场景,在训练数据集上保留了真实的交互场景,训练过程中,通过将用户的最终预订或收藏的项目视为全局上下文,让用户交互的项目向全局上下文靠拢,以此捕获用户潜在的偏好信息。模型的复杂性不高,且实验效果贴近于生产实际,适用于线上的实时推荐。
目前,在推荐系统中出现了一个新的项目,这个项目并没有任何的交互行为,即遭遇了“冷启动”问题。在这种情况下,引入元信息的分布式表示推荐算法考虑到不论是项目还是用户,在推荐过程中,都具有各自的元信息,如用户的年龄、职业、性别、收入情况等,在对用户行为序列建模的同时,加入了用户或项目的元信息。这样不仅可以丰富表示向量包含的信息,还可以应对冷启动问题。在用户或项目无任何历史记录的前提下,可以将项目的元信息表示向量拼接成一个项目表示向量,去做相应的推荐工作。这类方法有Meta-Prod2vec[38]以及User-type & Listing-type Embeddings[37]。
(1)Meta-Prod2vec
针对下列问题:
①给定当前的访问对象p(类属于c),下一个访问的对象p′,可能是同样类属于c。
②给定当前的类别c,下一个访问的对象p,可能是同样类属于c,也可能类属于相似类别c′,如:购买了泳衣,下一个购买的是防晒霜,二者完全不属于同一类别,但很接近。
③给定当前的访问对象项目p,下一个访问对象的可能类属于c,或相似类别c′。
④给定当前的类别c,被访问的当前对象可能是p或p′。
文献[38]提出了Meta-Prod2vec算法,在建模过程中将元信息也考虑进去,将商品和元信息共同嵌入到用户兴趣空间中,结构如图7 所示。Meta-Prod2vec 算法对Prod2vec算法的损失函数进行了扩展:
式(16)中,λ={λM|I,λJ|M,λM|M,λI|M}是正则化的超参数集合,LM|I、LJ|M、LM|M、LI|M是针对上述四种未考虑到的场景而引入的目标损失函数,都采用加权的交叉熵(Weighted Cross-Entropy)方式计算,加权就是指前面的超参数λ。
图7 Meta-Prod2vec结构图
LM|I:给定输入商品I ,输入商品I 的上下文商品元信息的条件概率与计算得出的商品元信息的条件概率的加权交叉熵。
LJ|M:给定输入商品的元信息M ,输入商品的上下文商品条件概率与计算出的上下文商品的条件概率的加权交叉熵。
LM|M:给定输入商品的元信息M ,输入商品的上下文商品元信息的条件概率与计算出的上下文商品元信息的条件概率的加权交叉熵。
LI|M:给定输入商品的元信息M ,输入的商品ids的条件概率与计算得出的商品ids 的条件概率的加权交叉熵。与上述三种损失不同,LI|M并不会去预测上下文,而是商品I 的元信息M 去预测商品本身I 。
对于式(16)中LJ|I的计算同样采用基于负采用的Skip-Gram模型(SGNS)的方法:
式(18)中,PD是负采样中的负例样本的概率分布,k 是负例样本的个数。 LM|I、LJ|M、LM|M、LI|M的计算与LJ|I类似,采用同样的公式。
Meta-Prod2vec 将项目的元信息作为辅助信息,与项目本身进行联合训练,在对用户行为序列建模的同时,还考虑了项目自身的属性特征,丰富了项目的表示向量。并且在训练过程考虑到不同元信息的影响引入了不同的权重,实验结果证明了不论在冷启动还是一般的推荐场景下,Meta-Prod2vec 方法的效果都要比Prod2vec好,且适用于实时推荐。
(2)User-type & Listing-type Embeddings
文献[37]认为,除了可以将项目的多个元信息分别做向量映射,如一间旅馆有地区、价格区间、床位数量、洗手间数量等,对这些元信息进行映射,把一个项目的向量用其对应的数个元信息向量拼接而成。同理,用户的向量也可以通过同样的方式进行训练得到,并且可以将二者嵌入到同一个向量空间中,共同应对冷启动问题。这样不管是新添加的项目,还是新注册的用户,都可以使用元信息拼接成的表示向量进行推荐。
上述分布式表示的推荐算法,所应对数据的结构都是一维的项目序列,当遇到社交网络这一类以图作为数据结构推荐场景[39]时,直接使用分布式表示方法显然不行。此节所讨论的图嵌入推荐算法是将图(如社交网络)中节点映射成一个低维向量,采取的方法也是分布式嵌入方法。具体过程如图8所示。
图8 图嵌入示意图
图(a)给定图G=(V,E),V 是节点集合,表示数据对象,E 是边集合,表示两个数据对象之间的关系[39]。
图(b)根据一定的规则遍历图中邻接节点,生成节点序列。
图(c)通过分布式嵌入方法将图中的节点映射成一个低维的表示向量。
图(d)中所有节点都会被嵌入到一个连续的多维空间中,在图中关联密切的节点在空间中距离也会更近。
常见的基于分布式表示技术的图嵌入推荐算法有DeepWalk[40]、Node2vec[41]、LINE[42]、EGES[43]等。
(1)DeepWalk
DeepWalk 算法从社交网络中某一节点出发,随机游走较短的步数,生成节点序列。然后采用分布式嵌入算法将社交关系映射到一个连续的向量空间中,每个节点会有对应的低维向量,相应地,在社交网络中相邻的节点,在向量空间中的向量距离也比较近。文献[40]对于随机游走生成的项目序列是否可以使用Word2vec的方法进行训练,给出了合理解释。
如图9 所示,(a)是YouTube 网站的社交网络中,通过“随机游走”方式生成的短序列中的顶点的幂等分布;(b)是维基百科中自然文本中单词的幂等分布。随着二者样本数量逐步攀升,图中二者的分布也驱向近似。图中直观地表明了通过随机游走方式生成的序列符合自然文本的分布,可以直接使用分布式嵌入算法进行建模。
图9 幂等分布图
相比其他非分布式表示的图节点向量表示的方法,DeepWalk 可以通过无监督的训练方式,即在训练时把节点表示向量与对应标签的关联切断,得到更加通用的表示向量,可以避免错误的传递[44]。并且在训练过程可以采用并行随机游走的方式提高模型的整体运算效率。不足在于只是简单地随机生成序列,在此过程中并没有关注生成的序列与图中结构的相关性,即对于图结构的采样工作可以更加深入。
(2)LINE
图10中,节点6与节点7是直连,称为一阶相关,但节点5 和节点6 并没有直连,却存在许多共同的邻接节点,即节点5和节点6的邻接网络结构是相似的,称为二阶相关。DeepWalk 只关注了二阶相关性,即目标节点与上下文之间的关联,文献[42]提出的LINE 在计算某个节点的表示向量时,还考虑了一阶相关性。为此LINE中让每个节点充当两个角色,一个其是本身,另一个表示作为其他节点的上下文节点。
图10 节点相关性示意图
对任一边e=(i,j),其一阶相关度为:
式(19)定义了条件分布P1(·|·)。而两个节点的经验分布为,为了保证一阶相关性,条件概率可尽可能靠近经验分布,因此目标函数是使二者距离接近,最终在LINE 中采用了KL散度来定量二者的距离:
对任一边e=(i,j),其二阶相关度由节点vi生成节点vj的概率表示为:
其中|V|是上下文节点数量,对于任一节点,定义了条件分布P2(·|vi)。同样为了保证二阶相关性,条件概率可尽可能靠近经验分布为两节点之间的一阶相关度(联接权重)。通过最小化二者的KL散度,可以确定最终的优化目标函数:
在优化目标函数的训练过程中,可以得出节点的特征表示。
在时间效率上,一般的图嵌入算法[45-48]的运算时间至少是O(| V|2),|V|2为节点个数。LINE的时间复杂度为O(dK|E|),d 为向量的维度,K 为序列中负采样的个数,| E|为图中合法的边数,当图中的节点数量越大,LINE 算法的时间效率优势更加明显。相比DeepWalk,在图的整体关联度,LINE考虑得更全面,获得的表示向量包含的信息更丰富,且适用于各种图结构。
(3)Node2vec
文献[41]将图视为一个文档,节点就是里面的文字,如何生成能够反映图结构的文本序列是至关重要的,如图8(a)所示,采用DFS方式生成的序列,可以反映子图的同构性[49],而采用BFS 方式生成的序列,可以反映子图的同质性[50-51],两种方式生成的节点序列都可以蕴含图的结构信息。Node2vec 中提出一种启发式游走方法,在游走过程中引入两个参数p 和q,来控制游走的方向,同时兼顾两种方式,以获得更佳的节点序列。
如图11 所示,从节点t(起始节点)走到了节点,现在要决定下一个节点的走向。为每个节点分配一个游走概率πvx=αpq(t,x)·wvx,wvx是节点间的权重。
图11 启发示游走示意图
其中,dtx表示节点t 到节点x 的最短路径,且值域仅为{0,1,2}。如 图11 中,dtx1=1 ,dtx2=dtx3=2 ,而dtv=0,因其已被访问过了。
对于返回参数p,控制游走是否回退,取p >max(q,1),可以确保游走到一个未访问过节点,取p <max(q,1),则会游走回退;对于出-入参数q,当q >1 时,下一次游走会选择离t 更近的节点,让游走方式近似BFS,当q <1 时,下一次游走会选择离t 更远,游走更近似DFS。当q 值变化,游走的方式也会跟着变化,当q=1,p=1 时,Node2vec退化成DeepWalk。
Node2vec 借用游走参数控制序列的生成顺序,相比单一使用DFS 或者BFS 进行序列生成,Node2vec 可以保留更丰富的节点邻域信息。在训练过程中可以通过手工设置p 和q 两个参数来调整模式的关注点,相比DeepWalk 和LINE 提高了自身的灵活度以及在不同推荐场景的适应性。例如在社交网络的场景下,更强调子图的同质性,可以调大q 值;在文本引用的场景,更强调子图的同构性,可以调小q 值。
(4)GES与EGES
在图嵌入算法中,如果在图中新增了一个节点,此节点没有任何的交互记录,该如何应对呢?为此文献[43]在DeepWalk 的基础上,提出了GES(Graph Embedding with Side Information)模型。在模型中引入了项目的元信息作为辅助信息,对于一个新项目,可以通过项目的元信息获得对应的表示向量,以应对冷启动问题。在给定W 为项目或辅助信息的向量矩阵,表示项目v的表示向量,表示项目v 第s 类辅助信息的表示向量,则一个拥有n 类辅助信息的项目v 由n+1 个向量构成,对项目v 的最终表示向量为:
式(24)中就是把项目本身的表示向量与它的元信息表示向量取均值。这样,对一个不存在任务交互行为的新项目,可以根据它的部分辅助信息确定其表示向量。如图12 所示,对于一个新项目,可以从含有相同元信息(如类型、品牌、商家)的类似项目中借用它们的元信息向量用作自己的表示向量。
图12 项目冷启动示意图
EGES(Enhanced Graph Embedding with Side Information)考虑到GES对于所有辅助信息都是统一对待,但实际是同一项目的不同辅助信息在不同的用户行为上下文中,所占的权重应该是不同的。比如在现实中,用户A买了一部苹果手机,会根据苹果这个品牌去浏览苹果笔记本或平板电脑,对于另外同样买了一部苹果手机的用户B,他会因为价格问题选择浏览价位更低的其他品牌的笔记本或平板,用户A 的行为,受品牌这一个元信息的影响多一些,用户B 的行为,受价格这一元信息的影响多一些。因此EGES 为不同的辅助信息分配不同的权重,表示第v 个项目的第s 类辅助信息的权重,一个项目的表示向量为:
相比其他的图嵌入方法,GES和EGES使用项目的元信息作为辅助信息除了可以应对冷启动问题,在训练过程还保留了用户行为的潜在信息,并考虑到实际用户消费场景,做了权重调整,可以全面地学习到不同用户的行为信息。
第4 章详细介绍了几类经典的分布式表示算法的原理及其可以应对的实际场景,本章将通过以下三个问题对基于分布式表示的推荐算法进行总结。
在推荐领域中,一直存在着数据总量大、数据稀疏、冷启动等关键问题。如表1所示,文中提及的算法采用的数据集量较大且都存在着严重的数据稀疏问题,部分算法所采用的数据集考虑到用户信息安全隐去了用户的信息。面对数据总量大、数据稀疏问题,文中描述的各类算法都取得了不错的效果,面对数据量不大的图结构(如PPI数据集),分布式表示推荐算法同样可以应用。
为了应对冷启动问题,分布式表示推荐算法将项目或用户的元信息作为辅助信息,借用元信息的表示向量去生成一个新项目的表示向量,进行推荐计算,可以有效应对冷启动问题。与传统的基于内容的推荐算法相比,二者都可以应对冷启动问题,前者的优势在于元信息的表示向量在学习过程中融入了用户的行为信息,适合于实时的推荐场景。
协同过滤的推荐方法也可以看作是类嵌入方法,通过矩阵分解技术将原来用户和项目的交互矩阵,分解成用户特征矩阵和项目特征矩阵两个矩阵,最终将用户和项目嵌入到低维空间中,通过用户特征向量和项目特征向量的内积来计算用户对项目的偏好,亦或是通过向量间的相似度来排序得出推荐列表。基于分布式技术推荐算法是通过浅层的神经网络训练,将同一行为序列中的项目嵌入到一个低维连续的向量空间,也可以同时将用户和项目嵌入到空间中得出表示向量,再进行后续的推荐工作。
后者在功能上的优势在于,不仅关注了用户对项目的正向交互行为(如点击、浏览、收藏、评分等),同时对用户的负向行为(如拒绝、不喜欢等)也进行了学习,体现在向量空间中就是:负向的交互项目与正向的交互项目在空间距离上的相互远离。可以有效地避免了为用户重复推荐之前不喜欢的项目,这是传统的协同过滤方法没有关注的。
协同过滤另一个缺陷是不适应数据快速更新的推荐领域,如新闻推荐等,因新闻总是在快速更新,传统的协同过滤无法对新数据产生足够快的响应,导致其不适用于线上的实时推荐[52]。相比之下,后者可以学习用户行为发生的时序关系,在训练时,使同一时刻内的若干交互项目的空间距离接近,时序间隔大的项目空间距离疏远,让项目的表示向量包含了用户潜在的行为时序信息,可以快速对用户的新行为做出响应,适用于当前实时变化的推荐场景[32,37-38],这不仅存在于新闻推荐方面,在电商、短视频推荐等用户交互频繁的场景更是如此。
表1 算法数据集及应用场景
传统的基于内容的推荐算法,一个核心特点是可以缓解冷启动问题,一个新项目根据它的属性信息也可以参与推荐,具有很好的可解释性,但依赖于前期高效的特征工程。引入元信息的分布式表示推荐算法可以在对用户行为序列建模的时候,将项目或用户的元信息也融入其中,这种方式不需要对现有的语言模型做太多的修改,在有效应对冷启动问题的同时还在元信息的层面学习用户的行为信息。在实际的电商场景中,用户购买了智能手机后,接着感兴趣的商品却不再是手机,而是手机的相关配件,比如手机壳、贴膜等。一般的基于内容的推荐算法不能学习这种用户行为,下次推荐的更大概率还是带有相同标签的手机,但后者可以应对这种不同类型变换的交互场景,如文献[43]所描述,还可以通过权重来拟合用户的行为方式,得出更佳的推荐效果。
应对推荐领域中图结构的信息处理,分布式表示技术也有着不错的表现,相比其他的图节点表示算法,基于分布式表示技术的图嵌入算法在时间效率上得到了提升,这对于当下数据大幅增长的环境是很重要的。随着图节点的不断增加,其他图算法的时间复杂度是指数级上涨,图嵌入算法只是线性提升,这极大地缩短了模型的计算时间。在不同的应用场景下,图嵌入方法灵活调整自身的表示向量内容,可以应对常规图算法无法解决的冷启动问题,在推荐效果上也比其他算法要好[41-43]。
分布式表示算法得出更好的推荐结果,证明了基于分布式表示的推荐算法在推荐领域中的有效性和先进性。对于基于分布式表示的推荐算法还有以下几个方向值得探讨研究:
(1)算法在不同场景下的适应性调整。从上述几种算法中都可以看出,起始只是纯粹地将词向量方法引入到推荐系统中,没有做改动,到后来,研究人员会根据实际的业务场景,以及推荐的具体领域做出相应的调整,不仅在静态的历史数据中取得了较高的准确率,推荐厂商将相关推荐系统部署到生产,对每日实时更新的数据进行线上评测,线上的效果甚至比线下的效果更好。目前,在一些文娱休闲、电商消费推荐领域,已经有了较为深入的研究工作,但是在金融保险、车辆销售等推荐周期更长的领域可以继续开展工作。
(2)与其他深度学习方法结合。随着深度学习在图形图像、语音、文本处理等多领域均取得长足的进展,许多研究人员也将深度学习引入推荐系统中,以期提高系统各项性能并解决存在的问题。基于分布式表示技术本身也是一种深度学习方法,用于对用户行为序列进行建模,得出项目的隐表示。后期工作可以探索与更多的深度学习模型结合,达到更好的推荐效果。
(3)新的推荐系统架构。目前许多从事自然语言处理工作的科研单位都开源自身在词向量预训练实验中得出的词向量结果,其涵盖世界上各类语种,可以提供给其他科研单位或个人进行后续的科学研究或工程实现。但是在推荐系统中,不同推荐领域的项目表示向量多有不同,且部分向量可能还包含了用户的隐私信息,因此要像词向量那样直接公开存在多方面挑战。目前正在兴起的数据联邦[53-55]等技术平台支持,让其变得有可能,为应对系统启动以及跨域推荐提供了思路。如在电商领域,可以将部分商品经过预训练得到表示向量,对于新上线的同类型的推荐系统,可以直接采用这个向量对用户进行推荐,从而有效应对了系统冷启动问题。
推荐系统是解决信息过载问题的有效工具,核心在于所采用的推荐算法,而一个推荐算法的核心就是正确地捕捉到用户兴趣。高效的推荐算法能够帮助用户节约信息检索时间,提供更好的用户体验,增强用户的“黏性”。传统的推荐算法在当前数千万乃至数亿用户量的场景下的推荐效果相形见拙。本文所综述的基于分布式表示技术的推荐算法,通过对用户的行为序列建模,将项目映射到用户潜在的兴趣空间中,得出项目的表征向量,再进行后续的推荐工作,取得很好的效果。本文对主要几种推荐算法进行比较总结,对基于分布式表示技术的推荐算法的发展进行展望,为后续相关研究工作提供参考。