CoCNN:共现 CNN 推荐算法
论文 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 建模要好