多视角多层次的大规模并行化推荐算法

1. 问题背景

随着信息技术的飞速发展,推荐系统在人们的日常生活中起着重要的作用。尤其是在信息爆炸式增长的当今,人们难以从海量的数据中去寻找自己所需要的个性化信息。因此,研究实现适用于大规模场景的智能化、个性化的推荐系统已经成为了人们生活中的迫切需求。

2. 问题分析

传统推荐系统中一般存在两大问题:1)传统推荐算法难以适用于大规模数据的场景;2)传统推荐算法推荐精度有限,需要更有效的推荐算法。

一方面,现有的推荐算法与系统一般都只有针对较小规模数据的单机实现,它们难以应用于海量数据场景。为此,我们需要针对多种传统的单机推荐算法设计实现了相应的并行化方案。

另一方面,在智能设备不断发展的同时,信息类型也在朝着多元化的方向发展。传统的协同过滤推荐算法难以适用于复杂类型的数据,例如文本、图片、视频等信息。为此,我们需要针对现实生活中的复杂数据类型研究实现推荐精度更高的推荐算法。

3. 系统总体架构/算法总体流程

我们设计实现了多视角多层次的大规模推荐算法,主要包括多视角浅层次的推荐算法和多视角深层次的推荐算法。算法总体框架如图1所示。

图1 多视角多层次大规模推荐算法框架图

针对传统的用户项目间的评分行为数据,在Spark平台上设计实现了多种传统协同过滤算法的并行化方案。针对较为稠密、秩较高的用户项目评分矩阵,我们实现了并行化的基于近邻模型的协同过滤算法。而对于极度稀疏的大规模数据,我们设计实现了基于SVD分解的协同过滤算法。该算法采用了并行化的交替最小二乘算法(ALS,Alternative Least Square)对模型求解,并且在求解过程中,利用JNI调用底层基础线性计算库BLAS来加速ALS中的矩阵计算,以进一步加速模型求解速度。针对多视角的数据类型,我们设计实现了并行化的MVM(Multi-View Machine)模型,可以充分利用多视角数据之间的交互进行推荐。

设计实现了多种基于深度模型的推荐算法从而提高模型的推荐精度。同时我们还提供了相应深度模型的并行化方案。针对用户项目的评分行为信息,采用深度神经网络对用户和项目进行特征提取。而对于传统协同过滤算法难以处理的文本、图像之类的数据,我们设计实现了基于多种深度神经网络的内容过滤模型,使得推荐系统能够更有效地利用现实世界中的复杂数据类型。同时,在拥有多种数据类型的推荐场景下,我们设计了一个深度多视角推荐模型。该模型能综合利用多种不同的数据类型,使得推荐模型的效果得到进一步提升。在大规模数据的场景下,我们设计实现了一个通用的深度推荐模型并行化框架。

4. 技术实现方案与优化

4.1 多视角浅层次的大规模推荐算法

4.1.1 并行化近邻模型推荐算法

近邻模型的推荐算法直接通过计算与目标用户兴趣相似的近邻,利用近邻的评分来预估目标用户的评分值。并行化近邻模型推荐算法框架如图2左所示。

图2 并行化近邻模型与并行化SVD分解模型框架图

并行化的近邻模型推荐算法计算过程如下:

  1. 将数据从HDFS中读入Spark RDD中。选取需要推荐的用户,将目标用户的评分向量拉回(collect)本地节点。
  2. 将目标用户的评分向量广播(broadcast)到RDD中的所有分区中。每个分区根据得到的用户评分向量,使用相应的距离计算方案计算该用户在对应分区中的局部K近邻。
  3. 将每个分区上的局部K近邻拉回(collect)本地,计算用户的全局K近邻。根据计算出的全局K近邻,计算该用户对应项目的评分值。

4.1.2 并行化SVD分解推荐算法

基于近邻模型的协同过滤算法直接利用了评分向量作为相应用户或项目的特征,在面对极度稀疏的数据时,通常会导致距离计算的效果很差,从而导致推荐效果不佳。基于SVD分解的协同过滤算法则通过分解将用户和项目的特征映射到了一个共同的低维空间中去,从而缓解数据稀疏所带来的问题。其并行化框架如图2右所示。

并行化SVD分解推荐算法的计算过程如下:

  1. 将数据从HDFS中读入Spark RDD中。分为用户-项目评分RDD和项目-用户评分RDD。并将两个RDD持久化(persist)在内存中,便于每次迭代时重复使用。
  2. 分别随机初始化用户和项目的本地参数矩阵。
  3. 求取用户参数的解。将项目参数广播到用户-项目评分RDD。每个分区利用公式并行求取每个用户参数的解。并将用户参数collect回本地,更新本地用户参数矩阵。
  4. 求取项目参数的解。将用户参数广播到项目-用户评分RDD。每个分区利用公式并行求取每个项目参数的解。并将项目参数collect回本地,更新本地项目参数矩阵。
  5. 重复3~4,直至模型收敛或达到指定迭代次数。

4.1.3 并行化MVM推荐算法

基于SVD分解的协同过滤算法是从用户和项目两个视角来进行推荐,并且是一种1层分解的模型。在真实世界的应用和数据中,一般除了用户和项目的评分数据外,还有诸如用户的评分历史记录、时间信息等其它视角的数据。此时SVD分解的协同过滤算法难以处理多视角情况下的数据。我们采用了一种优化的多视角分解模型——MVM(Multi-View Machine)进行多视角的推荐。MVM的并行化框架如图3所示。

图3 并行化MVM框架图

并行化MVM推荐算法计算过程如下:

  1. 将数据从HDFS中读入Spark RDD中,同时将数据转换为FM的输入格式。并将RDD持久化(persist)在内存中,便于每次迭代时重复使用。
  2. 将模型参数存储在本地,随机初始化本地参数矩阵。并将模型参数广播到RDD中的每个分区上。
  3. 每个分区都拥有一个独立的MVM模型。每个模型根据获取到的参数以及对应分区上的局部实例数据,求取相应参数的局部梯度。
  4. 本地节点拉回每个独立模型所计算出的参数的梯度。并对所有的局部梯度求取平均,作为模型的梯度。利用SGD或AdaGrad对模型的参数进行更新。
  5. 重复3~5,直至模型收敛或达到指定迭代次数。

4.2 多视角深层次的大规模推荐算法

4.2.1 深度协同过滤推荐算法

基于SVD分解的协同过滤算法可以表示成神经网络的形式:对用户的ID视角和项目的ID视角使用独热编码方式进行处理,再分别使用一个单层且没有激活函数和偏置的神经网络来获取相应用户和项目的低维特征。然后通过对用户和项目的低维特征做内积运算来描述用户对项目的评分。我们对浅层次的SVD分解模型进行改进,提出了深层次的协同过滤推荐算法,模型框架如图4左所示。

图4 深度协同过滤与深度内容过滤模型示意图

模型的输入是对应用户和项目的ID信息,即对用户和项目分别使用独热编码,作为各自神经网络的输入。对于用户视角和项目视角,分别采用了一个多层感知机(MLP)来获取对应用户和项目的低维表示。当用户和项目经过多层感知机的非线性变换后,在感知机的最终层将得到对应用户和项目的特征向量。我们将由多层感知机产生的用户和项目的隐向量与这两个向量对应位相乘所产生的向量拼接(concatenate),形成的一个新向量,作为整个深度协同过滤模型产生的相应评分的特征向量。模型的输出结果可以由深度协同过滤模型产生的评分特征向量再接上一个线性的模型而产生,如接上线性回归模型用于预测用户对项目的评分值。

4.2.2 深度内容过滤推荐算法

使用深度神经网络的优势是可以通过各种神经网络来处理现实世界中的各类复杂数据类型,如采用CNN来处理电影的海报图像数据,使用LSTM来处理电影的影评数据等等。我们设计实现了一种基于深度模型的内容过滤算法,该模型的结构如图4右所示。

模型的输入同样有两个视角,分别为ID信息和内容描述信息。在深度内容过滤的模型中,我们同时使用了ID信息和内容信息,而并非只使用一个深度神经网络对内容部分做特征抽取,其原因是对于同一个用户(或项目)的描述信息,不同的项目(或用户)将会产生不同的结果。因此我们同样需要用户(或项目)的ID信息与相应的内容进行交互,使模型能够获取具体用户与具体项目之间的个性化特征,即实现内容信息的过滤。

需要注意的是,图中DNN可以使用MLP来提取相应内容的特征,也可以使用CNN、LSTM、GatedCNN等更为高级深度神经网络进行特征提取。

4.2.3 深度多视角推荐算法

不同的视角描述了不同的信息,这些信息都从不同的方面对相应的用户和项目进行了描述,我们需要综合利用这些各种类型的特征来进一步提升模型的推荐效果,而每一类的内容信息都可以用相应最为合适的深度神经网络模型对其进行特征抽取。如果将用户或项目的某一类信息看作一个视角,那么可以实现一个基于深度神经网络的多视角推荐模型。其模型框架如图5所示。

图5 深度多视角模型示意图

图中每个视角都是一个深度协同过滤或深度内容过滤模型。我们将每个视角内用户和项目之间的交互称为内交互(intra-interaction),内交互描述了在该视角的特征中(如用户-项目的行为特征),相应用户对项目的评分特征。该评分特征向量是由用户的隐特征与项目的隐特征再拼接上这两类隐特征的point-wise product所形成的交互向量所构成。类似的,其它各个视角产生的评分特征都是以同样的方式构成。同样,我们对该特征向量使用一个线性模型产生最终所需的结果,如线性回归模型产生用户对项目评分的预测结果。

4.2.4 深度推荐算法的并行化方案

深度神经网络一般都拥有着较为庞大的参数,并且其计算复杂度也比较高。为了便于整个深度推荐模型在大数据环境下的应用,我们设计实现了一个TensorFlow平台下深度推荐模型的并行化方案。所有的深度推荐模型均可以利用此方案实现并行化计算。并行化方案如图6所示。

图6 深度推荐模型并行化框架

在整个并行化框架中存在着一个全局的参数服务器,而该参数服务器物理上则是由某些节点上的一些进程构成,用于负责全局模型参数的分发与更新操作。所有计算进程都需要与参数服务器进行通信,以获取和更新相应的参数。除了参数服务器进程,整个框架中还存在着模型计算进程。每个计算进程在逻辑上都对应着一个独立的深度推荐模型,如深度协同过滤模型或深度多视角推荐模型等。

5. 性能评估分析

接下来对多视角、浅层次的大规模推荐算法和多视角、深层次的大规模推荐算法在真实数据集下进行算法正确性的验证和大规模场景下的性能评估实验。实验中采用MovieLens-100K和MovieLens-10M两个数据集进行测试。

5.1 多视角浅层次推荐算法性能评估

图7 多视角浅层次推荐算法的性能对比图

上图展示了3个多视角、浅层次推荐算法与相应单机算法或已有实现的性能对比实验。实验结果现实我们实现的多视角、浅层次的推荐算法相比于传统单机或已有实现均得到了较大的性能提升。对于近邻模型的推荐算法,并行化方案相对于单机算法提升了15倍左右;对于基于SVD分解的推荐算法,并行化方案则相对提升了30倍左右;而对于MVM算法,并行化方案相对于GraphX并行版本提升40%左右的性能。

5.2 多视角深层次推荐算法性能评估

多视角深层次推荐算法的实验结果如下所示:

表 1

上述表格展示了多视角深层推荐模型相对于已有模型在推荐精度上的提升效果,而图则展示了深度推荐模型并行化方案通过增加计算核心数所带来的收敛速率提升情况。对于用户项目的评分行为数据,我们提出的深度协同过滤算法相对于NCF、NNMF等模型提升了0.43%-1.93%的精确度;对于复杂的文本类型数据,我们提出的深度内容过滤算法相对于已有的内容过滤算法提升了0.14%-2.3%的精确度。对于深度多视角推荐模型,我们提出的算法相对于深度协同过滤和深度内容过滤提升0.49%-1.89%的精确度。最后,实验数据表明我们设计实现的深度推荐模型的并行化方案具有良好的并行扩展性。

图8 深度推荐模型并行化方案并行扩展性实验

6. 总结

传统的推荐算法一般只是针对较小规模数据的场景,它们难以直接在如今大数据的时代背景中被使用;另一方面,传统的推荐算法一般只针对用户项目间的评分行为信息进行处理,而不能有效地处理现实世界中的复杂数据类型,如文本、图片、音频等信息。

对于传统的推荐算法,在Spark平台上设计实现了相应算法的并行化方案。如针对较为稠密、秩较高的数据,我们实现了并行化的基于近邻模型的推荐算法;而我们实现的基于SVD分解的并行推荐算法则适用于较为稀疏的数据;对于多视角的数据,我们实现了并行化的MVM推荐算法。这部分推荐算法属于多视角、浅层次的推荐算法。实验表明,我们实现的多视角浅层次推荐算法相对于单机或已有实现性能均取得较大的提升。

为了进一步提升推荐精度,同时使模型能够有效处理文本、图片、视频等现实世界中复杂类型的数据,我们在TensorFlow平台上研究实现了基于深度模型的大规模推荐算法,如深度协同过滤算法、深度内容过滤算法以及深度多视角推荐算法。最后,我们还设计实现了深度推荐模型的并行化方案,以用于大规模数据场景,并且该并行化方案适用于所有深度推荐模型。实验表明,我们提出的深度推荐算法相对于已有的一些推荐算法精确度均得到较大的提升。