预测电影偏好?如何利用自编码器实现协同过滤方法
作者:网友投稿 时间:2018-05-23 09:23
推荐系统使用协同过滤的方法,通过收集用户的偏好信息来预测特定用户的兴趣。协同过滤技术的基本假设是,如果用户 A 对某个问题与人 B 有相同的口味或意见,那么 A 就更有可能在其他问题上拥有与 B 的相同的意见。
本文将介绍如何根据用户的偏好、观看历史、相同评级和其他电影的其他用户的评价预测用户对电影的评分。

一、介绍
自动编码器是一种深度学习神经网络架构,可实现协同过滤领域最佳的性能。文章的第一部是理论概述,将会介绍简单的自动编码器及深度自编码器的基础数学概念。在第二部分中,我们将深入实际展示如何在 TensorFlow 中逐步应用这一技术。本文仅覆盖和评价模型中最重要的部分。
整个模型的输入渠道和预处理可以在相应的 GitHub 中查看:
https://github.com/artem-oppermann/Deep-Autoencoders-For-Collaborative-Filtering
二、深度自编码器
1. 自编码器
讨论深度自编码器之前,我们先来介绍它稍微简单些的版本。自编码器(Autoencoder)是一种人工神经网络,用于学习一组输入数据的表示(编码),通常用于实现降维。
在结构上,自编码器的形式是一个前馈神经网络,由输入层、一个隐藏层和一个输出层(图 1)构成。输出层与输入层的神经元数量相同,因此自编码器属于无监督学习,这意味着它不需要标记数据——只需要一组输入数据即可,而不是输入—输出对。

图 1. 典型的 AutoEncoder 架构
自编码器的隐藏层比输入层小,这使得模型可以通过学习数据中的相关性在隐藏层中创建数据的压缩表示。
输入层到隐藏层的转换被称为编码步骤,从隐藏层到输出层的转换称为解码步骤。我们也可以在数学上将这些转换定义为映射:
该映射是通过将输入数据向量乘以权重矩阵,添加一个偏差项并将所得到的向量应用于非线性运算,如 sigmoid,tanh 或整流线性单元来实现的。
2. 自编码器的训练
在训练期间,编码器接收输入数据样本 x 并将其映射到所谓的隐藏层或隐层表示 z 上。然后解码器将 z 映射到输出向量 x' 上,后者是(在最好的情况下)输入数据 x 的准确表示。需要注意的是,通常情况下准确地重建 x 是不可能的。
具有输出 x' 的训练包括应用随机梯度下降以最小化预定损失,例如均方误差:

3. 深度自编码器
简单自动编码器的扩展版是 Deep Autoencoder(图 2)。从图 2 中可以看出,它与简单的计数器部分唯一的区别在于隐藏层的数量。

图 2. 深度自编码器的架构
额外的隐藏层使自编码器可以从数学上学习数据中更复杂的底层模式。深度自编码器的第一层可以学习原始输入中的一阶特征(例如图像中的边缘)。第二层可以学习对应于一阶特征的外观中的图案的二阶特征(例如,根据哪些边缘倾向于一起发生——例如以形成轮廓或角检测器)。深度自编码器更深层的特性往往可以学习到更高阶的特性。
把所有东西放在一起:我们需要更多的层来处理更为复杂的数据——比如我们在协作过滤中使用的数据。
三、实现
如前文所述,你将学会预测用户对电影的评级。就此而言,我们将使用著名的 MovieLens 数据集
(https://grouplens.org/datasets/movielens/)。MovieLensis 是一个基于网络的推荐系统和推荐用户观看电影的在线社区。
更具体地说,我们将使用 ml_1m.zip 数据集,该数据集包含 6,040 个 MovieLens 用户制作的,约 3,900 部电影的 1,000,209 个匿名评级。我们需要的导入文件是 ratings.dat。该文件包含 1,000,209 行,全部格式如下:user_id :: movie_id :: rating:time_stamp。
例如 ratings.dat 中的第一行:
1::595::5::978824268
这意味着用户 1 给了 595 号电影打了五星评分。评分时间可以被忽略,因为在这里我们不会使用它。




