CoNet,基于共现模式的推荐算法
论文 CoNet: Co-occurrence Neural Networks for Recommendation 中文讲解
个人学术主页:http://zhouxiuze.com/
代码下载地址:https://github.com/XiuzeZhou/conet
包括两个版本:tensorflow 1.14.0 和 pytorch 1.6.0。
论文下载:http://zhouxiuze.com/pub/conet.pdf
欢迎大家引用!
前言
当前,大部分推荐算法因为假设用户-用户、商品-商品之间都是独立同分布的,所以它们只是对用户-商品之间的交互进行建模,而忽略了商品和商品之间存在的关系。为了解决这个问题,我们提出了一个基于共现模式的推荐算法。我们假设商品总是成对出现的,即为商品共现。
1. 举个小例子,如上图所示。比如“哈利波特1”和“哈利波特2”总是被那些喜欢魔幻的用户同时观看。这就是商品的共现模式。我们为了学习这种模式,需要对用户-商品和商品-商品同时进行建模。
2. 同时,我们假设两个商品共同出现的次数越多,它们越相似。比如在观影记录中,“哈利波特1”和“哈利波特2”共现的次数比“哈利波特1”和“机器人瓦力”要多,我们则认为“哈利波特1”和“哈利波特2”之间更相似。
3. 更进一步,我们用注意力机制来学习用户的比较偏好。当我们单独对两个商品进行评分的时候给了相同的评分,比如当我们看过“哈利波特1”和“哈利波特2”都觉得很好看,评分的时候都给了 5 分。但是,当我们把它们两个拿出来进行比较的时候,心底总会觉得某个可能好些。因此,我们采用注意力机制,对这种心理偏好进行建模和学习。
定义
我们假设现在有一个用户集合 \(U=\left\{ u_1,u_2,\cdots,u_n \right\}\) 和一个商品集合\(I=\left\{i_1,i_2,\cdots,i_m \right \}\),其中 \(n\) 和 \(m\) 分别表示用户和商品的数目。\(R\) 是评分矩阵,其中 1 表示用户和商品之间存在交互,否则为 0。根据 \(R\), 我们定义矩阵 \(Y\):
\(
y_{uij}=
\left\{\begin{matrix}
1,& \text{如果 }\ r_{ui}=1 \ \text{且}\ r_{uj}=1\\
0,& 其他
\end{matrix}\right.,
\)
其中 1 表示用户 \(u\) 同时有过交互记录。
CoNet 结构
CoNet 包括 7 个部分:输入层,嵌入层,注意力模块,共现层,交互层,隐含层和预测层(输出层)。它的结构如下图所示:
输入和嵌入层:输入层是 one-hot 编码,嵌入层将该稀疏的编码转化成稠密的特征向量。
共现层:输入用户和他的两个商品的特征向量,然后通过注意力网络来计算它们之间的比较偏好:
\(
{v}_{ij}=\alpha_i {q}_{i}+(1-\alpha_i){q}_{j},
\)
\alpha_i=\frac{exp\left({h}_{ui} \right)}{exp\left({h}_{ui} \right) + exp\left({h}_{uj} \right)}
=\frac{1}{1+exp\left({h}_{uj}-{h}_{ui} \right)}
=\sigma\left({h}_{ui}-{h}_{uj} \right),
\) \(
{h}_{ui}=f_a \left({p}_{u},{q}_{i}\right),
\)
我们也可以简化模型,忽略注意力极致,直接取平均值:
\(
{v}_{ij}=\frac{{q}_{i} + {q}_{j}}{2}
\)
交互层:主要是为了对用户和他的共现特征在浅层进行交互建模:
\(
{h}_0=f_{it}\left({p}_{u},{q}_{i} \right)
\)
隐含层:这就是一个 MLP 网络,用来学习特征的深度非线性特征。
预测层:预测用户 \(u\) 的比较偏好:
\(
\hat{y}_{uij}=\sigma \left({W}^T_p{h}_L+{b}_p \right)
\)
损失函数:采用交叉熵损失函数来计算损失:
\(
\mathcal L=-\sum_{u=1}^{n}\sum_{\left(i,j\right)\in \mathbf{C}\cup\mathbf{C}^{-}}{y_{uij}log{\widehat{y}_{uij}}+\left(1-y_{uij}\right)log{\left(1-\widehat{y}_{uij}\right)}},
\)
预测:当模型训练完毕,我们需要预测用户对单个商品的偏好,所以,我们输入 \((u,i,i)\),即设置 \(i=j\),到已训练的模型,就可以预测 \(\hat{y}_{ui}\)。然后按照预测分值进行排序向用户进行推荐。
实验
我们用了三个数据集:MovieLens100K,MovieLens1M 和 Lastfm。评估指标是 \(NDCG\) 和 \(HR\),首先我们看一下整体实验的结果:
Data sets | ItemPop | NCF | BPR | NeuMF | DeepCF | CoNet | |
---|---|---|---|---|---|---|---|
HR | MovieLens100K | 0.4163 | 0.6628 | 0.6801 | 0.6886 | 0.6932 | 0.7063 |
MovieLens1M | 0.4638 | 0.6704 | 0.6932 | 0.7045 | 0.7014 | 0.7083 | |
Lastfm | 0.4822 | 0.7089 | 0.7044 | 0.7111 | 0.7251 | 0.7480 | |
NDCG | MovieLens100K | 0.2407 | 0.3914 | 0.3949 | 0.4008 | 0.4093 | 0.4182 |
MovieLens1M | 0.2694 | 0.4077 | 0.4123 | 0.4201 | 0.4222 | 0.4304 | |
Lastfm | 0.3378 | 0.4926 | 0.4923 | 0.5096 | 0.5185 | 0.5341 |
接下来,我们看一下注意力机制的效果:
红色曲线为注意力机制,蓝色为没加注意力的结果。
其实,可以理解注意力机制提供了更多的参数来拟合用户的比较偏好从而取得更好的结果。