前言
一般来说,推荐可以看作是一个匹配问题,即为合适的用户匹配合适的项目。但是,由于用户和项之间存在巨大的语义鸿沟,几乎不可能在初始表示空间中直接匹配用户和项。为了解决这个问题,已经研究了很多方法,通常可以分为两类:
- 基于表示学习的CF方法
- 基于匹配函数学习的CF方法。
基于表示学习的CF方法尝试将用户和项映射到一个公共表示空间中。在这种情况下,用户和该空间中的物品之间的相似性越高,意味着它们的匹配越好。基于学习的CF方法尝试直接学习复杂的匹配函数,该函数将用户-物品对映射到匹配分数。虽然这两种方法都得到了很好的发展,但它们都存在两个根本的缺陷,即点积的表达能力有限,以及分别无法捕获低秩关系。
本文提出了一个名为DeepCF (Deep Collaborative Filtering的缩写)的通用框架,以结合这两种方法的优点并克服这些缺陷。在四个公开数据集上的广泛实验证明了所提议的DeepCF框架的有效性。
论文链接:https://arxiv.org/abs/1901.04704v1
github:https://github.com/familyld/DeepCF
1.背景
除了学习更好的用户和物品表示,DNNs非常适合学习复杂的匹配函数,因为它们能够近似任何连续函数。例如,提出了神经协同过滤(NCF)框架下的NeuMF,该框架将用户嵌入和条目嵌入的串联作为多层感知器(MLP)模型的输入进行预测。利用DNNs的高容量和非线性来学习用户-物品表示与匹配分数之间的复杂映射关系。在这种情况下,用MLP代替传统矩阵分解方法中的点积。然而,MLP在捕获低级别关系方面非常低效。事实上,在传统的矩阵因子分解方法中使用点积来估计匹配分数是人为地限制模型来学习一种低等级的相似性关系,根据人类经验,这种低等级关系被认为与匹配分数呈正相关。虽然使用MLP直接学习匹配函数赋予了模型很大的灵活性,但如果不引入人类经验,学习过程可能效率低下。这也是为什么NeuMF需要将MLP与一个浅矩阵分解模型结合在一起。
根据上面的讨论,我们可以看到实现协同过滤的方法有两种。一种是基于表示学习,另一种是基于匹配函数学习。为了克服这两种方法的不足,进一步提高CF方法的性能,我们将它们合并到所提议的DeepCF框架中。特别是,我们首先使用这两种类型的CF方法来获得输入user-item对的不同表示。由于这两种方法具有不同的优点,并且从不同的角度学习表示,因此可以将用户-物品对学习到的表示连接起来,从而得到更强、更健壮的用户-物品对联合表示。为了计算匹配分数,我们将这个联合表示传递到一个完全连接的层中,使模型能够对特征分配不同的权重。此外,由于现实世界中隐含数据的数量远远大于隐含数据的数量,设计能够处理隐含反馈数据的推荐算法就显得尤为重要,成为推荐系统的研究热点之一。因此,本文主要研究内隐反馈。
综上所述,基于表示学习和基于匹配函数学习的协同过滤方法都得到了广泛的研究并被证明是有效的。这两种方法虽然都有优点,但都有弱点,即点积的表达性有限,以及在捕获低秩关系方面的弱点。因此本文的工作致力于指出结合两种协同过滤方法的优点来克服这些缺点的重要性。在本文中提出了一个综合这两种方法的总体框架,使模型在保持有效学习低秩关系的同时,具有极大的学习匹配函数的灵活性。
2. DeepCF
2.1Problem Statement
假设系统中存在
M
M
M名用户和
N
N
N种物品,也可以构建用户物品交互矩阵
Y
∈
R
M
×
N
Y \in \mathbb{R}^{M \times N}
Y∈RM×N,如下所示
由于该矩阵仅仅是用户物品的交互矩阵,因此不像评分矩阵那样直观,只能间接反映用户偏好。作者指出了这种交互矩阵反应信息的两点问题:
- 无法直接反应出用户对物品的具体满意程度
- 当矩阵元素为0时可能并不意味着用户不喜欢该物品,有可能是因为再次系统中物品数量过多导致没有访问到
为了解决上述产生的问题,作者提出了两种解决方法:
- 一种方法是将所有未观察到的交互作用视为弱的消极实例
- 另一种方法是从未观察到的交互作用中抽取一些消极实例
在此篇文章中作者采用第二种方法
推荐系统的问题通常被转换成评分预测问题,被预测的评分之后被用来对物品进行排名最后执行top推荐。由此类似地,为了解决带隐式反馈的推荐问题,作者将其表示为一个估计交互矩阵 Y Y Y中缺失值的交互预测问题。以此来估计未被注意到的交互是否会发生。作者提出近似认为用户物品交互矩阵近似服从伯努利分布
其中
p
u
i
p_{ui}
pui 代表
y
u
i
y_{ui}
yui 为1的概率,此外
p
u
i
p_{ui}
pui 还可以表示用户
u
u
u 与物品
i
i
i 匹配的概率,在这种情况下
p
u
i
=
1
p_{ui}=1
pui=1 代表用户与物品相匹配,相反为0的情况下为不匹配。相较于而不是建模
y
u
i
y_{ui}
yui,那是离散的和二进制的,取而代之的是方法模型
p
u
i
p_{ui}
pui。通过这种方式,转换二值分类问题,即交互预测问题,到一个匹配的分数预测问题。
2.2 Learning the Model
基于此,模型可以表示为
y
^
u
i
=
f
(
u
,
i
∣
Θ
)
\hat{y}_{ui}=f(u,i|\Theta)
y^ui=f(u,i∣Θ)
其中
y
^
u
i
\hat{y}_{ui}
y^ui 代表
y
u
i
y_{ui}
yui 的预测也就是用户与物品的匹配概率,
Θ
\Theta
Θ 代表模型的参数,
f
f
f 代表利用模型参数进行预测分数的映射函数。因此接下来的问题主要为
- 如何定义函数 f f f
- 如何估计参数 Θ \Theta Θ
2.2.1 Objective Functions
这这里作者提出了两种目标函数分别是point-wise loss和 pair-wise loss
Pointwise Approach
Pointwise类方法,其L2R框架具有以下特征:
- 输入空间中样本是单个doc(和对应query)构成的特征向量
- 输出空间中样本是单个doc(和对应query)的相关度;
- 假设空间中样本是打分函数;
- 损失函数评估单个doc的预测得分和真实得分之间的差异。
Pairwise Approach
Pairwise类方法,其L2R框架具有以下特征。
- 输入空间中样本是(同一query对应的)两个doc(和对应query)构成的两个特征向量。
- 输出空间中样本是pairwise preference
- 假设空间中样本是二变量函数
- 损失函数评估doc pair的预测preference和真实preference之间差异。
在本文中主要关注于Pointwise loss
上面提到了将交互预测问题转换为了分数预测问题,将具体模型带入则可以得到
其中
Y
+
\mathcal{Y}^+
Y+ 代表所有在
Y
Y
Y中观察到的交互,相对的
Y
−
\mathcal{Y}^-
Y− 代表未观察到的交互即消极实例进而损失函数为
2.3 The Proposed Framework
在本节中,首先介绍基于表示学习的CF方法和基于匹配函数学习的CF方法的一般过程。然后详细介绍了这两种方法及其MLP实现。最后,说明如何在提出的DeepCF框架中融合这两种方法,以及如何学习最终的模型。
2.3.1 The General Process
传统过程可以分为两个大块,分别是Representation Function和Matching Function。这两个过程的开始都是从数据库中提取数据,比喻用户和物品的ID、历史交互行为信息和其他有价值的数据。这些都可以被用来构建初始化的用户
u
u
u 和物品
i
i
i。之后用
v
u
U
v_u^U
vuU 和
v
i
I
v_i^I
viI 来代替表示。之后CF模型计算
p
u
=
f
(
v
u
U
)
p_u = f(v_u^U)
pu=f(vuU) 和
q
i
=
g
(
v
i
I
)
q_i = g(v_i^I)
qi=g(viI) 即用户和物品的潜在表示
2.3.2 Representation Learning
对于representation learning-based CF方法,模型更加注意于表示函数的学习,而对于匹配函数通常是没有参数的形式例如点乘或余弦相似度。模型希望将用户和物品能够映射到相同维度的空间以进行直接的比较。不同的方法区别在于学习潜在特征表示的函数不同,从最初的线性嵌入方法到近期的多层感知机
在本文中将用户与物品的交互矩阵
Y
Y
Y作为输入,用户表示为
y
u
∗
y_{u*}
yu∗,物品表示为
y
∗
i
y_{*i}
y∗i,在函数的选择上,本文选择了多层感知机,具体公式可以表示为
其中
W
x
W_x
Wx ,
b
x
b_x
bx ,
a
x
a_x
ax分别代表权重矩阵,偏置矩阵和第
x
x
x 层感知机的**,
a
(
⋅
)
a(\cdot)
a(⋅) 代表非线性**函数,在本文中选用
R
e
L
U
ReLU
ReLU。与现有方法不同的是,匹配函数部分被定义为
W
o
u
t
W_{out}
Wout ,
σ
(
⋅
)
\sigma(\cdot)
σ(⋅),
p
u
p_u
pu,
q
i
q_i
qi分别代表,输出的权重矩阵,sigmoid**函数,用户和物品的潜在特征表示。模型仍然专注于捕捉用户和物品之间的低等级关系,但更有表现力,因为潜在维度的重要性可以是不同的,映射可以是非线性的。称为CFNet-rl。
2.3.3 Matching Function Learning
普通的Matching Function Learning方法通常在特征学习方面使用简单的线性嵌入层,在本文中使用多层感知机该学习匹配函数,并且使用交互矩阵
Y
Y
Y 来代替ID作为输入,匹配函数的学习过程可以总结为
a
0
a_0
a0作为初始的输入是由用户和物品前在学习的结果相连构成的,称为 CFNet-ml
2.3.4 CFNet
将上述的两个过程结合在一起,构成模型的最终形态
将两个过程的学习结果相连,之后经过**函数得到最终的概率预测结果
2.3.5 学习策略和预训练策略
DeepCF框架要最小化的目标函数是二元交叉熵函数。为了优化模型,使用了小批量Adam。批大小固定为256,学习率为0.001。模型参数以高斯分布随机初始化(均值为0,标准差为0.01),负实例 Y − \mathcal{Y}^- Y− 在每次迭代中均从未观察到的交互作用中均匀采样。
初始化对深度学习模型的收敛性和性能具有重要意义。利用预先训练好的模型对集成模型进行初始化,可以显著提高收敛速度,提高最终性能。由于CFNet由两个组件组成,即CFNet-rl和CFNet-ml,可以对这两个组件进行预培训,并使用它们初始化CFNet。CFNet-rl和CFNetml是使用Adam从头开始培训的,而带有预训练的CFNet是由普通的SGD优化的。这是因为Adam需要之前更新的参数的动量信息,而CFNet在进行预训练时没有保存这些信息。