使用飞桨探索电影推荐
本章我们探讨基于深度学习模型实现电影推荐系统,同时利用用户特征、电影特征和用户对电影的评分数据。
在开始动手实践之前,我们先来分析一下数据集和模型设计方案。
数据集介绍
个性化推荐算法的数据大多是文本和图像。比如网易云音乐推荐中,数据是音乐的名字、歌手、音乐类型等文本数据。抖音视频推荐中,数据是视频或图像数据。也有可能同时使用图像和文本数据,比如YouTuBe的视频推荐算法中,会同时考虑用户信息和视频类别、视频内容信息。
本次实践我们采用ml-1m电影推荐数据集,它是GroupLens Research从MovieLens网站上收集并提供的电影评分数据集。包含了6000多位用户对近3900个电影的共100万条评分数据,评分均为1~5的整数,其中每个电影的评分数据至少有20条。该数据集包含三个数据文件,分别是:
- users.dat,存储用户属性信息的txt格式文件。
- movies.dat,存储电影属性信息的txt格式文件。
- ratings.dat, 存储电影评分信息的txt格式文件。
另外,为了验证电影推荐的影响因素,我们还从网上获取到了部分电影的海报图像。现实生活中,相似风格的电影在海报设计上也有一定的相似性,比如暗黑系列和喜剧系列的电影海报风格是迥异的。所以在进行推荐时,可以验证一下加入海报后,对推荐结果的影响。 电影海报图像在posters文件夹下,海报图像的名字以"mov_id" + 电影ID + ".png"的方式命名。由于这里的电影海报图像有缺失,我们整理了一个新的评分数据文件,新的文件中包含的电影均是有海报数据的,因此,本次实践使用的数据集在ml-1m基础上增加了两份数据:
- posters/ , 包含电影海报图像。
- new_rating.txt, 存储包含海报图像的新评分数据文件。
用户数据、电影数据和评分数据包含的特征样例如下表所示。
用户特征 | UserID | Gender | Age | Occupation |
---|---|---|---|---|
样例 | 1 | F【M/F】 | 1 | 10 |
电影特征 | MovieID | Title | Genres | PosterID |
---|---|---|---|---|
样例 | 1 | Toy Story | Animation| Children’s|Comedy | 1 |
评分特征 | UserID | MovieID | Rating |
---|---|---|---|
样例 | 1 | 1193 | 5【0~5】 |
其中部分数据并不具有真实的含义,而是编号。年龄编号和部分职业编号的含义如下表所示。
年龄编号 | 职业编号 |
---|---|
- 1: “Under 18” - 18: “18-24” - 25: “25-34” - 35: “35-44” - 45: “45-49” - 50: “50-55” - 56: “56+” | - 0: “other” or not specified - 1: “academic/educator” - 2: “artist” - 3: “clerical/admin” - 4: “college/grad student” - 5: “customer service” - 6: “doctor/health care” - 7: “executive/managerial” |
海报对应着尺寸大约为180*270的图片,每张图片尺寸稍有差别。
图7:1号海报的图片
从样例的特征数据中,我们可以分析出特征一共有四类:
- ID类特征:UserID、MovieID、Gender、Age、Occupation,内容为ID值,前两个ID映射到具体用户和电影,后三个ID会映射到具体分档。
- 列表类特征:Genres,每个电影会有多个类别标签,内容是对应着几个ID值的列表。
- 图像类特征:Poster,内容是一张180*270的图片。
- 文本类特征:Title,内容是一段英文文本。
因为特征数据有四种不同类型,所以构建模型网络的输入层预计也会有四种子结构。
如何实现推荐
如何从上述数据中实现推荐系统呢?首先思考下,推荐系统究竟需要什么?
如果能将用户A的原始特征转变成一种代表用户A喜好的特征向量,将电影1的原始特征转变成一种代表电影1特性的特征向量。那么,我们计算两个向量的相似度,就可以代表用户A对电影1的喜欢程度。据此,推荐系统可以如此构建:
假如给用户A推荐,计算电影库中“每一个电影的特征向量”与“用户A的特征向量”的余弦相似度,根据相似度排序电影库,取 Top k的电影推荐给A。
图8:推荐系统设计
这样设计的核心是两个特征向量的有效性,会决定推荐的效果。
如何获得有效特征
那么,怎么获取两种有效代表用户和电影的特征向量?
首先,我们要明确什么是“有效”?对于用户评分较高的电影,电影的特征向量和用户的特征向量应该高度相似,反之则相异。
我们已经获得到大量评分样本,以此可以构建一个训练模型如下图所示。根据用户对电影的评分样本,学习出用户特征向量和电影特征向量的计算方案(红色箭头)。
图9:训练模型
第一层结构:特征变换,原始特征集合变换为两个特征向量。
第二层结构:计算向量相似度。为确保结果与电影评分可比较,两个特征向量的相似度从【0~1】缩放5倍到【0~5】。
第三层结构:计算Loss,计算缩放后的相似度【0~5】与用户对电影的真实评分【0~5】的“平方误差”。
以在训练样本上的Loss最小化为目标,即可学习出模型的网络参数,这些网络参数本质上就是从原始特征集合到特征向量的计算方法,如红色箭头所示。根据训练好的网络,我们可以计算任意用户和电影向量的相似度,进一步完成推荐。
从原始特征到特征向量之间是怎样设计的?
基于上面的分析,推荐模型的网络结构初步设想如下。
图10:推荐模型的网络结构设想
将每个原始特征转变成Embedding表示,再合并成一个用户特征向量和一个电影特征向量。计算两个特征向量的相似度后,与训练样本(已知的用户对电影的评分)做损失计算。
但不同类型的原始特征应该如何变换?网络设计的细节是怎样的?我们将在后续几节结合代码实现逐一探讨,包括四个小节:
- 数据处理。将MovieLens的数据处理成神经网络理解的形式。
- 模型设计。设计神经网络模型,将离散的文字数据映射为向量。
- 配置训练参数并完成训练,提取并保存训练后的数据特征。
- 利用保存的特征构建相似度矩阵完成推荐。