基于改进神经协同过滤模型的电影推荐系统

2020-07-20 06:16骏,虞
计算机工程与设计 2020年7期
关键词:排序协同矩阵

王 骏,虞 歌

(杭州师范大学 信息科学与工程学院,浙江 杭州 311121)

0 引 言

在2006年之前,矩阵分解法采用的是数学上的SVD法,不仅占用大量内存,而且时间复杂度高。Simon Funk发表了一个算法(称为Funk-SVD),提供了矩阵分解的新思路,矩阵分解变成分解为两个低阶矩阵,并缩小低阶矩阵相乘之积与原来矩阵的差距。这个算法后来被Netflix Prize的冠军Koren称为(latent factor model, LFM),使得矩阵分解算法在海量数据中的个性化信息推荐应用成为可能。

随着神经网络的发展,谷歌在2016年推出Wide&Deep网络[1]后,在特征嵌入层之上加入多层感知机(multi-layer perceptron,MLP),使得模型泛化能力更强。何向南等进一步提出多层感知机与广义矩阵分解(genera-lized matrix decomposition,GMF)结合的神经协同过滤模型[2](neural collaborative filtering,NCF),使模型的推荐能力得到更大提升[2]。

神经协同过滤模型的多层感知机层把用户特征向量与物品特征向量内积产生的向量送入神经网络中学习得到高阶隐含特征信息,广义矩阵分解层把用户特征向量与物品特征向量进行内积产生的向量当低阶特征组合信息,最后模型得到的信息综合了高阶隐含特征信息和低阶特征组合信息[3]。可是使用神经网络学习抽象的隐含信息总会丢失一部分信息,而且神经网络虽然有强大的拟合能力,可是具有解释性差的特点,单一的信息来源难以满足复杂的推荐问题。

本文基于神经协同过滤模型,把原GMF结构改为BPR[4]结构来挖掘排序信息,实验结果表明,排序信息与低阶特征组合信息相比,有更好的推荐结果。在改进的神经协同过滤模型上,结合使用电影类型因子、电影流行度等辅助信息优化推荐结果,建立个性化电影推荐系统,并实现该系统电影推荐仿真。使用MovidLens-100K和 MovidLens-1M 数据集的实验结果表明,改进的神经协同过滤模型(本文称为B-NCF模型)在推荐结果的命中率和归一化折扣累积增益[5]上都优于神经协同过滤模型。

1 相关知识

1.1 神经协同过滤模型

神经协同过滤模型(NCF)中,输入层上面是嵌入层,它是一个全连接层,将来自输入层的稀疏表示映射为稠密向量[2](dense vector)。NCF模型用两条路线来对用户和物品建模(用户ID和物品ID两个输入),需要通过GMF和MLP两个路线,把他们各自的运算得到的信息连接起来。GMF应用了一个线性内核来模拟潜在的特征交互;MLP使用非线性内核从数据中学习高阶特征交互信息[3]。

神经协同过滤模型结构,如图1所示。

图1 神经协同过滤模型结构

1.2 贝叶斯个性化排序算法

贝叶斯个性化排序(Bayesian personalized ranking,BPR)算法[4]是实现最大化后验概率优化排序的算法,在UAI 2009被采用,至今仍然是很重要的推荐系统算法。推荐排序算法[6]大体分为3种,第一种是逐点方法(pointwise approach),第二种是成对方法(pairwise approach),还有一种是列表方法(listwise approach)。贝叶斯个性化排序算法属于第二种方法,利用概率统计方法对元素进行两两之间排序。

假设任意用户u在电影p与n同时存在的情况下选择了电影p,我们就认为p排序在n前面,如此记录这三元组 (u,p,n)。 所有 (u,p,n) 组合用集合D表示,>u代表用户u对应的所有商品的全序关系,则优化目标是最大化后验概率p(θ|>u)。 根据贝叶斯公式,贝叶斯个性化排序算法最终的最大对数后验估计函数如式(1)所示

(1)

2 基于神经协同过滤的改进模型

本文在基于神经协同过滤模型基础上,提出了改进的神经协同过滤模型B-NCF。B-NCF模型在NCF模型基础上使用BPR结构代替神经协同过滤网络的GMF结构挖掘排序信息,如图2所示。

图2 B-NCF模型结构

2.1 嵌入层(embedding layer)

输入层上面是嵌入层,它是一个全连接层,用于将数据映射为特征向量。其中用户ID(Uid)映射为用户特征向量,用户已经评分的电影ID(Pid)和用户没有评分的电影ID(Nid)映射为电影特征向量。容易看出,三元组 (u,p,n) 中任意用户u对电影p感兴趣的概率大于电影n。

Uid,Pid与Nid都分别经过BPR嵌入层和MLP嵌入层映射为向量,然后后缀为Emb的向量去BPR层,后缀为MLP的向量去MLP层,分别命名为Uid_MLP,Uid_Emb,Pid_MLP,Pid_Emb,Nid_MLP,Nid_Emb。

根据BPR算法的使用方法,算法模型训练好后,BPR嵌入层的权重可以看作用户隐因子矩阵和电影隐因子矩阵,使用BPR嵌入层权重可以计算出任意用户u对任意一部电影的排序得分。

2.2 多层感知机层(MLP Layer)

如图2中MLP层所示,Pid_MLP,Nid_MLP,Uid_MLP向量拼接成新的向量进入MLP层经过多层感知机产生高阶特征信息。

在神经协同过滤模型的多层感知机层基础上,增加了批标准化[7](batch normalization,BN)层与丢弃(Dro-pout)层,其中,BN层统一各层的方差加快模型的收敛速度,Dropout层提高泛化性防止过拟合。

多层感知机层输出高阶特征信息φMLP, 表达式[2]如式(2)所示

(2)

2.3 贝叶斯个性化排序层(BPR layer)

如图2中BPR层所示,Uid_Emb,Pid_Emb,Nid_Emb向量进入BPR层产生排序信息。

贝叶斯个性化排序的目标是最大化电影p总排在电影n前面这个集合排列的概率,为了最大化这个概率就要最小化BPR loss。我们希望这个概率越大越好,对于BPR loss是越小越好[4],BPR loss表达式如式(3)所示

(3)

2.4 输出层(output layer)

(4)

通过减小预测值(Model Prediction)与真实属性值(Target)的交叉熵来迭代更新模型参数,表达式[2]如式(5) 所示

(5)

3 模型更新步骤

改进神经协同过滤模型所有参数更新步骤如下[9]:

输入:3组数据Uid、Pid和Nid,学习率α, 正则项系数λ, 隐空间的维度K。

输出:用户BPR嵌入层权重矩阵W,电影BPR嵌入层权重矩阵H。

(1)初始化所有嵌入层权重。

(2)在BPR层,Uid_Emb*Pid_Emb与Uid_Emb*Nid_Emb作差,由sigmoid激活函数变换得到[0,1]值再与1作差,差值作为排序信息BPR loss。BPR 层输出排序信息与MLP层信息拼接成新的向量。

(3)新向量通过sigmoid激活函数转为取值在[0,1]的预测值,同时把评分表中任意用户的大于或等于4分的电影属性值设为1其余电影属性值设为0,通过减小预测值(model prediction)与真实属性值target的交叉熵来迭代更新模型参数。如果损失函数收敛,则模型训练结束,输出W和H,否则回到步骤(2)。

(4)迭代更新完成后,就可以根据BPR嵌入层权重计算出任意用户u对任意一部电影的排序得分。

4 电影推荐系统

本文提出的电影推荐系统由两部分组成,推荐得分也由两部分信息生成。以神经协同过滤模型为基础的B-NCF模型生成排序得分,再综合流行度、电影类型因子等辅助信息得到推荐得分。电影推荐得分生成如图3所示,训练过程中,把命中率和归一化折扣累积增益表现最好的那一次更新过程中的BPR嵌入层权重输出(图中假设权重是 0~9 的整数),训练得到的权重可以看作对应的用户隐因子矩阵和电影隐因子矩阵(item latent matrix),假设给用户ID为1的用户推荐电影,从用户隐因子矩阵取第一行作用户隐因子向量(user latent vector),与电影隐因子矩阵相乘得到相应的排序得分(rank score),通过辅助信息电影流行度(popularity score)和用户评分(genre score)微调推荐得分(recommended score)。最后按推荐得分大小排序输出前5部电影以及对应推荐得分。

图3 电影推荐得分生成

一个用户会喜欢多种类型电影,一部电影可以属于多种类型,根据用户观看同一类型电影占所看电影数量比例,得到电影类型因子,公式如式(6)所示

(6)

同理,电影流行度是根据电影已经评价人数占总评价用户人数的比例,再加1得到。本文的最终推荐得分如式(7)所示

RecommendedScore=
PopularityScore*RankScore*GenreScore

(7)

最后根据排序得分前5名输出包含对应电影信息的推荐电影列表。

5 实验设计与分析

5.1 数据来源

实验数据集:MovieLens-100K,数据集里面包括u.data、u.info、u.item、u.genre、u.user、u.occupation等文件,其中u.data文件包含943个用户对于1682部电影的100 000个评分(分值为[1,5]之间的整数);每个用户至少评级20部电影;u.user文件包含用户的人口统计信息(年龄,性别,职业,邮编);u.item文件包括电影名,电影ID,上映日期,IMDB电影网对应电影主页网址,所属的电影类型(恐怖,犯罪,喜剧等)。

由MovieLens-100K的评分(u.data)文件抽取80%数据做训练数据集生成99 057对偏序对,Uid、Pid为评分用户ID和评分电影ID,Nid为未评分电影ID,99 057对(Uid,Pid,Nid)偏序对做训练数据训练模型,剩下的20%数据提供真实属性值用作测试集,训练好的模型输入测试集来计算改进模型的命中率和归一化折扣累积增益。

MovieLens-1M数据集含有来自6040名用户对3706部电影的100万条评分数据,分为3个表:评分表、用户信息表和电影信息表,同理得到训练数据994 169对(Uid,Pid,Nid)偏序对和测试集。

5.2 实验平台

使用联想笔记本电脑,内存为8 GB,CPU为Intel酷睿i53230M,CPU主频为2.4 GHz,硬盘容量为1 TB;操作系统是Windows10,使用PyCharm编译程序,使用Python版本是3.6.3,Tensorflow版本为1.10.0。

5.3 模型评价指标

排名列表的性能由命中率(hit rate,HR)和归一化折扣累积增益(normalized discounted cumulative gain,NDCG)衡量。

命中率公式如式(8)所示

(8)

式中: |GT| 代表所有测试集合,分子是推荐列表中属于测试集合的数量。

NDCG基于列表排名位置折损因子体现,它的思想主要是位置在推荐列表越靠前的推荐内容,其相关度应该越高,具体表达式如式(9)所示

(9)

其中,累加项的分子部分是效用函数或叫做增益(Gain),分母是关于位置的一个折损因子,Z是一个归一化因子,表示理想的推荐列表的折损累计增益(discounted cumulative gain,DCG)。NDCG取值范围在0到1区间,分值越高代表推荐越好。N是列表排名个数,本文取前10个输出进行HR和NDCG评价,取N=10。

5.4 模型参数设置

每批次训练数据量(Batchsize)定为256,训练轮数(Epoch)为50。

在嵌入层,生成服从均值为0,方差为0.1的正态分布随机数初始化嵌入层权重,用户嵌入层输入维度为用户数量和电影嵌入层输入维度为电影数量,隐空间的维度K都为10。

在MLP层,使用BN层对训练数据进行归一化,多层神经网络各层神经元数量默认依次为64、32、16、8,丢弃率为0.2,MLP各层输出都使用Relu激活函数。

在输出层,BPR层输出值与MLP层输出值默认赋予 1∶1 的权重,直接拼接在一起产生新向量。使用sigmoid激活函数产生预测值,衡量预测值与真实值差距的损失函数使用交叉熵函数,学习率为0.001。该层权重初始化使用lecun uniform函数。优化器使用Adam[8]优化器,Adam优化器被广泛认为在不同情况下工作性能都比较优秀的优化器。

5.4.1 MLP层的隐藏层数与预测因子个数

更多隐藏层数能够加强神经网络提取信息能力,在合适范围内增加层数提升模型性能,但是超出范围会导致过拟合,导致神经网络学习能力降低;神经协同过滤模型的最后一层隐藏层决定了模型的性能,所以将其作为预测因子[2](predictive factors),使用 [0,16,32,64,128] 的中间各层神经元数量和 [8,16,32] 的预测因子数量进行了模型评估。所用数据集同为MovieLens-1M,训练50轮,实验结果见表1 和表2。

表1 不同隐藏层和不同神经元NDCG

表2 不同隐藏层和不同神经元HR

模型稳定性有待改进,训练前训练集NDCG和HR都低的情况下容易训练出低分值NDCG和HR,尝试别的优化器情况也不见好转。因此整个实验每组条件都是取多次出现结果并求平均值作为表现。在隐藏层为 [8,16,32,64], 虽然偶有低分表现,可是概率小得多。由表1和表2可以看到,随着隐藏层增加模型表现越来越好,但在五层隐藏层的时候开始出现性能下降。神经网络逐渐学习到有用的信息。预测因子并没有随着数量增加提升模型的性能,因此对比表1和表2,本文选择使用 [8,16,32,64] 作为隐藏层,不仅因为表现好,而且待更新参数比五层隐含层 [8,16,32,64,128] 少。

5.4.2 BPR排序信息和MLP层信息混合比例

在输出层,BPR排序信息和MLP层信息以一定权重结合形成新的向量。所用数据集同为MovieLens-1M,在训练50轮,得到表3结果。

由表3可以看到偏离1∶1越远的比例,相应实验结果的NDCG和HR都逐渐减小,最佳的比例在1∶1附近,本文选择1∶1作为BPR排序信息和MLP层信息混合比例。

表3 不同比例拼接得到的NDCG和HR

5.5 实验结果与分析

5.5.1 模型对比

本文选取了神经协同过滤(NCF)模型,贝叶斯个性化排序(BPR)模型,多层感知机(MLP)模型和广义矩阵分解(GMF)模型作为对照,主要的参数设置和神经网络结构与B-NCF模型相同。训练50轮,取不同算法在 MovieLens-100K 和MovieLens-1M数据集中多次表现的平均值,见表4和表5。

表4 不同模型在 MovieLens-100K分析比较

表5 不同模型在MovieLens-1M分析比较

由表4和表5可知,B-NCF模型平均能带来至少 4%HR 和20%NDCG提升,由于使用了BPR排序算法,NDCG 的提升相当明显。总体来说,GMF模型、BPR模型和MLP模型在两个数据集的表现差不多,推荐水平相当,NCF模型总体性能比BPR、MLP和GMF模型要好,B-NCF 模型是这几个模型中表现最好的,而且训练更新的参数量只比神经协同过滤模型多不到2%。综合来看,B-NCF 模型虽然HR和NDCG得到提升,可是没有牺牲更多的计算资源去提升推荐性能。

5.5.2 在不同数据集表现

图4和图5为训练50轮,B-NCF在数据集MovieLens-100K和MovieLens-1M的HR@10和NDCG@10曲线图(纵坐标起点是0.6)。

图4 在MovieLens-100K数据集的表现

图5 在MovieLens-1M数据集的表现

由图4和图5可以看到,在不同数据集,B-NCF模型的HR和NDCG都在0.65以上,保持着较高的水平,而且在训练轮数接近10的时候,HR和NDCG都趋向稳定,模型收敛速度很快,而且训练数据集越大,模型学习能力越强。

5.6 电影推荐仿真

本文挑选评分列表中的第一个用户给电影推荐系统进行推荐仿真,使用MovieLens-100K数据,该用户评分电影272部,是一位24岁的男性工程师,喜欢黑色(Film-Noir)电影,喜剧(Comedy)电影,动画(Animation)电影以及流行的好莱坞电影,基于该用户的各项推荐得分见表6(只截取排序得分最大的前5部电影)。电影推荐系统给该用户推荐结果见表7。

表6 各项得分情况

电影推荐系统给该用户推荐结果见表7。

表7 电影推荐结果

6 结束语

通过上述研究可以看到,从挖掘信息的深度来看,基于神经协同过滤模型的B-NCF模型,提高了推荐的命中率和归一化折扣累积增益,而且只增加了极少计算资源,在信息来源的广度上看,基于B-NCF模型的电影推荐系统还综合考虑了辅助信息来拓宽信息来源的多样化,使得电影推荐更加个性化。

本文研究重点是推出基于B-NCF模型的电影推荐系统,对于B-NCF模型的最优参数并没有做细致研究,辅助信息只选择了电影流行度和电影类型因子,更多的推荐因素可以得到更好的个性化推荐结果,本文不再展开讨论。B-NCF模型稳定性有待提高,初始训练集低NDCG和低HR容易训练出低NDCG和HR的推荐结果。可以通过筛选合适训练集,比如训练集初始HR和NDCG高于预设阈值才启动运算推荐,否则重新生成训练集,来减少出现低NDCG和HR的推荐情况。

今后的研究工作,会关注深度学习在推荐系统的各个方向的应用,比如注意力机制[10]在用户兴趣偏好上的应用,对抗生成网络[11]模拟产生推荐列表。

猜你喜欢
排序协同矩阵
家校社协同育人 共赢美好未来
排序不等式
蜀道难:车与路的协同进化
恐怖排序
“四化”协同才有出路
节日排序
三医联动 协同创新
初等行变换与初等列变换并用求逆矩阵
矩阵
矩阵