论文 CoCNN: Co-occurrence CNN for Recommendation 中文讲解

个人学术主页:http://zhouxiuze.com/

代码下载地址:https://github.com/XiuzeZhou/cocnn

包括两个版本:tensorflow 1.14.0 和 pytorch 1.6.0。

论文下载:http://zhouxiuze.com/pub/CoCNN.pdf

M. Chen, T. Ma, and X. Zhou, "CoCNN: Co-occurrence CNN for Recommendation", Expert Systems with Applications, Jun. 2022, 195, pp. 116595.

欢迎大家引用!

前言

当前,大部分推荐算法因为假设用户-用户、商品-商品之间都是独立同分布的,所以它们只是对用户-商品之间的交互进行建模,而忽略了商品和商品之间存在的关系。为了解决这个问题,我们提出了一个基于共现模式的推荐算法。我们假设商品总是成对出现的,即为商品共现。

1. 举个小例子,如上图所示:汤姆汉克斯主演的电影总是被某些用户同时观看,这就是商品的共现模式。我们为了学习这种模式,需要对用户-商品和商品-商品同时进行建模。

2. 同时,我们假设两个商品共同出现的次数越多,它们越相似。比如在观影记录中,“幸福终点站”和“阿甘正传”共现的次数比“幸福终点站”和“机器人瓦力”要多,我们则认为“幸福终点站”和“阿甘正传”之间更相似。

定义

我们假设现在有一个用户集合 \(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\) 同时有过交互记录。

CoCNN 结构

CoCNN 包括 4 个部分:输入层,嵌入层,CNN 层和预测层(输出层)。因为卷积核的不同,它的结构有两种形式,如下图所示:

(a) 3x3 卷积核的 CoCNN

(b) 2x2 卷积核的 CoCNN

输入和嵌入层:输入层是 one-hot 编码,嵌入层将该稀疏的编码转化成稠密的特征向量。

CNN 层:首先,将三个向量拼接成 3 行的矩阵:\(c=\left[q_i; p_u; q_j\right]\),然后进行卷积操作:
\(
{h}=ReLU\left({W_3}\ast{c}+{b_3} \right)
\)

预测层:预测用户 \(u\) 的比较偏好:
\(
\hat{y}_{uij}=\sigma \left({W}^T_p{h}_L+{b}_p \right)
\)

损失函数:采用均方差损失函数来计算损失:
\(
\mathcal L_{co}=-\sum_{u=1}^{n}\sum_{\left(i,j\right)\in {C}\cup{C}^{-}}{\left(y_{uij}-\widehat{y}_{uij}\right)^2}
\)

预测:当模型训练完毕,我们需要预测用户对单个商品的偏好,所以,我们输入 \((u,i,i)\),即设置 \(i=j\),到已训练的模型,就可以预测 \(\hat{y}_{ui}\)。然后按照预测分值进行排序向用户进行推荐。

接下来,为了提高模型的性能,我们将 CNN 直接对用户-商品进行建模:

它的基本结构和 CoCNN 类似,其损失函数定义如下:
\(
\mathcal L_{ui}=-\sum_{\left(u,i\right)\in {O}\cup{O}^{-}}{\left(r_{ui}-\widehat{r}_{ui}\right)^2}
\)

最终,我们将两个损失函数进行合并:
\(
\mathcal L=\mathcal L_{co}+\alpha \mathcal L_{ui}
\)

实验

我们用了三个数据集:MovieLens100K,MovieLens1M 和 Lastfm。评估指标是 \(NDCG\) 和 \(HR\),首先我们看一下整体实验的结果:

Data sets ItemPop NCF BPR NeuMF ONCF CoCNN
HR MovieLens100K 0.4163 0.6628 0.6801 0.6886 0.6991 0.7093
MovieLens1M 0.4638 0.6704 0.6932 0.7045 0.7030 0.7063
Lastfm 0.4822 0.7089 0.7044 0.7111 0.7204 0.7508
NDCG MovieLens100K 0.2407 0.3914 0.3949 0.4008 0.4066 0.4142
MovieLens1M 0.2694 0.4077 0.4123 0.4201 0.4220 0.4309
Lastfm 0.3378 0.4926 0.4923 0.5096 0.5133 0.5301

接下来,看看共现的实验效果:

(a) HR@10

(b) NDCG@10

从图中看出:CoCNN3>CoCNN2>CNN,这意味着大的卷积核比小的卷积核可以活得更多的特征信息。同时,共现 CNN 要比单独用 CNN 建模要好