基于卷积神经网络的协同过滤算法在影片推荐中的应用研究
作者: 张海飞 崔军纳 葛金鼎
摘要:文章运用深度学习算法中的卷积神经网络,利用MovieLens数据集,实现了基于协同过滤的影片推荐系统。系统运行表明,该方法实现的推荐系统可以有效缓解“冷启动”问题。
关键词:影片推荐;协同过滤;卷积神经网络
中图分类号:TP18 文献标识码:A
文章编号:1009-3044(2022)17-0073-05
1简介
推荐系统[1]已经成功应用到商品推荐中,并逐步渗透到了文化领域,丰富了人们的文化生活。在推荐系统还未萌发的时候,用户使用传统的搜索引擎,在获取数据时,如果需求很明确,比如需要找一个电影,但是用户只知道这个电影的名称或导演等信息,搜索出的信息很片面。传统的搜索引擎的弊端暴露了:当用户自己也不清楚自己需要寻找的信息的具体内容,搜索得到的结果可能和用户想要的结果相差很大,用户获得的体验较差[2]。在推荐系统诞生之后,系统开发人员对获取的数据进行研究,这些数据的共同点指向特定的一类群体,数据的不同点指向每一个用户,通过合适的推荐算法,生成相应的推荐列表,会更加契合用户的需求。本文运用卷积神经网络,基于MovieLens数据集,设计并实现了基于协同过滤的影片推荐系统,以满足人民日益增长的文化娱乐需求。
2相关工作
协同过滤(Collaborative Filtering,CF)[3]和推荐系统的概念最早在20世纪90年代被提出,国内外的推荐系统迅速发张,但是这时候的系统并不具备为用户生成推荐列表的能力,必须通过复杂的数据库查询语句构造推荐列表推送给用户。不久,第一个能够完成自主推荐的新闻系统GroupLens[4]诞生了。1997年,推荐系统(Recommender System,RS)一词被Resnick等人提及。自此,推荐系统逐渐走入正轨,被世人广泛应用,也逐步成为较为热门的研究领域,各式各样的推荐算法,不同分类的模型,陆续来到了人们的视野中。经常沉淀,目前主流的算法涉及以下各个方面:
基于内容的推荐算法[5]的本质是提取用户的历史记录,依据用户频繁浏览过并且喜欢的内容,生成推荐列表,向用户推荐与商品信息较为相似的内容[6]。
协同过滤算法的基本方式就是对于数据的挖掘、对历史数据的分析和用户的偏好的分析得出的结论,找寻到用户的存在和相同兴趣的用户群,然后根据预测用户可能存在的喜欢的电影序列进行推送,以和用户同类型的受众群里喜欢的电影推荐列表为基础进行的推荐模式,因而这个算法存在的冷启动[7-8]问题,不能够为新的用户提供有效的推荐信息。而基于项目的协同过滤算法是在设计和用户的喜好推荐上进行类似商品的推荐模式,根据其计算的本质进行相关相似度的推荐方法,生成相似度较高的矩阵方式,来为广大的用户群体推荐电影。邓明通等[9]通过对用户偏好多样性的计算来实现推荐,有效地缓解了冷启动问题,提高了推荐信息的多样性。
3相关算法和模型
3.1协同过滤算法
协同过滤算法是推荐系统常用的算法。自提出以来引起了各大学术领域包括行为科学、管理科学和计算数学等领域的广泛关注,越来越多的专家学者参与到算法的研究[10]中,同时大型的互联网网站如:YouTube、Facebook 等公司都使用深度学习[11]对协同过滤算法进行相关的设计研究,进行成功的引用,丰富自己的信息网站。传统的协同过滤算法可以细分为以下两个方面:
1)基于用户的协同过滤算法
这个算法的原理是先确定所有的用户群体,再根据目标群体,从所有的用户群体中寻找与之相似的用户群体,根据用户群体里的喜好项目逐一遍历展示给目标用户。要实现推荐主要通过这个算法的以下三个步骤:
①通过收集的用户信息的分析,生成一个评分矩阵,其中包括用户ID、项目ID、评分这三个部门。
②利用评分矩阵,计算用户的相似性矩阵。
③为目标用户推荐项目,主要是依据与目标用户最相近的用户群所喜欢的项目。
比如在一个电影推荐系统当中,通过对用户的历史记录来分析数据样本进行推荐,用户a对ABC电影给予了高分平均,用户b对CDE给予了高分评价,用户c对ACF给予了高分评价,电影推荐系统能根据用户对于数据的相似性来判断分析,得出了用户a与用户c的性格喜爱方式类型,最终给用户a推荐电影F。
2)基于项目的协同过滤算法
这个算法的原理在用户群体中寻找目标用户消费过的产品,将这些产品遍历给用户群体。基于项目的协同过滤算法分以下三步进行推荐:
①根据整理的信息,生成包含用户ID、项目ID和评分三部分的特征矩阵。
②根据包含这三部分信息的特征矩阵,结合算法生成相似性矩阵。
③逐一遍历相似性矩阵,根据需求,适当的选择推荐给用户的内容数量。
再比如,在电影推荐系统当中,通过对数据样本的历史记录的分析得知a、b、c三个用户都对A电影打出来高评价,用户a、b同时对B电影打出来高评价,用户a对C电影打出了高评价,用户b对D电影有高评价,因此电影AB的相似度就很高,用户c喜欢A电影,因此根据系统的判断把B电影推荐给用户c。
上述的假设过程就是常见的协同过滤算法的级别推荐方式,通过这一方式能够较快地向用户推荐相关电影信息,但是协同过滤算法存在两个缺点,对这个算法的改进目前仍然处于探索阶段。
1)存在扩展性问题,随着电影数量和用户数量的增加,一定会影响推荐算法的效率,对于实时性效率比较高的商务网站,基于协同过滤的推荐系统存在严重的扩展性问题。
2)存在冷启动问题,如果有新用户注册,没有相应的历史数据对其进行分析,导致模型无法找到相似的用户或商品,也就不能推荐适合的内容,其中冷启动问题表示的是在没有大量数据的情况下,如何进行有效的推荐。
3.2卷积神经网络
卷积神经网络(CNN)[12]是一种包含了卷积计算的方法,是深度学习算法技术的代表之一,卷积神经网络的运用方式,可以进行监督学习和非监督学习进行构建结构,其核心的五层结构为数据输入层、卷积计算层、激励层、池化层和全连接层。
数据输入层主要是对原始数据进行处理操作,对无用的信息进行过滤,有效的信息进行有序的排布,对数据进行去均值、归一化和PAC降维等处理,通过对数据的处理,可以更好地划分层次结构。
卷积计算层是卷积神经网络最为重要的部分,是对前面获取到的数据进行计算处理,拆解的过程,其中较为关键的操作,是对局部关联和窗口滑动,对其中的深度、步长和填充值进行相应的获取,通过对矩阵的映射计算,得出相应的数值,同时卷积计算层还有很高的共享性,能够把计算出的相关数值,同传分析,分享到各层当中,同时计算用户和电影的信息数据,计算矩阵向量可以用来之后的推荐。
激励层主要的功能是把卷积计算层计算出的相关数据,进行结构的非线性映射,其主要的特点是能快速地对相关数据进行展现,梯度求值较为简单,但其本身数据较为脆弱易被更改,不利于长期保存。
池化层就是相对于输入层存在的层次关系,因为输入层输入的数据较为庞大,存储较为复杂且占用大量的空间,因此设计的池化层就是用来解决这一问题,池化层主要的功能就是进行数据图片的压缩,压缩相关数据便于存储。
全连接层其主要功能是在层次间的连接当中,通过全连接层进行数据的快速传输,方便进行数据的传递,位于卷积神经网络隐含层的最后部分,并只向其他全连接层传递信号。
通过输入层进行数据的读取,把获取的数据通过输入层录入,再通过卷积计算层进行数据的计算,计算出相应的矩阵值,通过激励层实现数据结构的非线性映射实现图层,再通过池化层把庞大的数据进行压缩,实现数据的推荐,上述的层次结构都是通过全连接层实现的,这便是完整的卷积神经网络的基本实现方式。
4 基于卷积神经网络协同过滤的影片推荐
4.1数据处理
本项目使用MoviesLens数据集[13],该数据集存储了电影评分,包含了来自6000名用户对4000部电影的100万条评分数据。
用户数据由五部分组成,主要是用户ID、性别、年龄、职业ID和邮编。从图1可以看出,邮编是地区的邮政编码,不是用户特征字段,不需要使用。用户数据user.dat文件中以“::”连接每个数据。收集的数据包含各个年龄段中各行各业的人们,年龄段主要分为年龄在18岁以下、年龄在18~24岁之间、年龄在25~34岁之间、年龄在35~44岁之间、年龄在45~49岁之间、年龄在50~55岁之间、年龄在56岁以上,涉及的行业包含学术/教育工作者、艺术家、文员/行政等二十个方面的。用户数据预处理前的数据格式如图1所示。
影片数据集中收集到的电影可以分为十六个类别,由动作片、冒险片、动画片、儿童片等组成,由电影ID、电影名称和电影风格三个字段组成,数据之间的连接方式依然通过“::”连接,影片数据预处理前数据如图2所示。
评分数据由用户ID、电影ID、评分、时间戳四部分组成,评分数据中数据的排序以用户ID为主,电影ID为辅进行排序。评分数据预处理后的数据如图3所示。
因为数据存在差异性,要根据数据的特点进行不同的处理:用户ID、职业ID和电影ID是不用改变的;性别字段:需要数据库中的F和M字符转换成数值0和1;年龄字段可以将年龄分为七大类,将七大类分别转成7个连续0—6的数值;电影分类字段,需要转换成数字,首先组成一个由电影分类和唯一标识这个电影分类的数字的字典,将每部电影的分类字段转换成相应的列表,因为每部电影可能不止一个类别。电影的名称字段与电影类别做相似处理。电影名称和电影类别的长度需要统一,为了方便处理,长度不足的部分用‘<PAD>’对应的数字进行填充。预处理完成之后的用户数据、电影数据、评分数据如图4所示。
3.2 实验准备
实验的目的是通过计算训练出用户特征值和电影特征值,进行推荐处理分析使用,分析数据集中的相关字典,发现其中一些字段信息较为特殊,对这些不同于其他字段,且不方便存储的信息通过one hot编码方式进行转化存储,如用户ID、电影ID等字段,这种编码表示的是由0和1组成的数据集合。在存储数据时,时常遇到稀疏性问题,输入的时间较长,维度也急剧膨胀,这是急需解决的问题,因此通过相关数据的预处理方式,将这些字段转化成数字,用这些数字当作嵌入矩阵的索引,网络的第一层使用了嵌入层,维度是(N,32)和(N,16)。
电影类型的处理要多一步,有时一部电影有多部电影类型,这样从嵌入矩阵索引出来是一个(n,32)的矩阵,将这个矩阵求和,变成(1,32)的向量。从嵌入层索引特征以后,将每个特征值通过全连接层传入,再将输出传入到全连接层,最终得到(1,200)的用户特征和电影特征两个特征向量。对于电影名称的处理比较特殊,从嵌入矩阵中得到电影名对应的各个单词的嵌入向量,名称长度有一定限制,这里过滤器大小使用时,就选择2、3、4、5长度。然后对文本嵌入层使用滑动2、3、4、5个单词尺寸的卷积核做卷积和最大池化。最后进行Dropout 操作,全连接层输出。
3.3 实验环境
1)硬件设备
处理器:Intel(R) Core(TM)i7 -8750H CPU @ 2.20GHz 2.21 GHz。
内存:8GB。
2)软件环境
操作系统:Microsoft Windows10 操作系统(64位)。
开发语言:Python 3.7。
编码工具:JetBrainsPyCharm 2018.1.3。