推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

本文论文题目:《CFGAN: A Generic Collaborative Filtering Framework based on Generative Adversarial Networks》
本文论文下载地址:https://dl.acm.org/citation.cfm?doid=3269206.3271743

1、背景

使用GAN来进行推荐,之前已经有过IRGAN和GraphGAN的方法。

关于IRGAN,可以参考文章:https://www.jianshu.com/p/d151b52e57f9

对于GraphGAN,论文本身针对于链接预测问题,可以扩展到推荐系统中,其最主要的贡献在于将图表示成宽度优先的树,并提出了graph softmax的方法,感兴趣的同学可以阅读下原文:https://arxiv.org/abs/1711.08267

但是这两种方法都存在discrete item index generation的问题。我们首先来解释一下,什么是discrete item index generation。

discrete item index generation
对于IRGAN和GraphGAN来说,生成器G是基于概率,生成一个单独的项目ID或者ID列表,并通过强化学习中策略梯度的方式进行训练。在判别器的“指导”下,随着训练的进行,生成器G将生成与真实情况完全相同的项目ID。但是,这对判别器来说并不友好,同一个物品,它有可能既被标记为真实数据(real),又被标记为生成数据(fake),如下图的i3:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

这样如果将其送进判别器进行判别,判别器将会产生困惑,使得判别器性能下降,之后在策略梯度迭代的过程中,判别器将向生成器提供错误的信号,自己的性能也开始降低。下面的实验结果展示了这一点:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架
推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

现象如图所示:在初始的几次迭代过程中,判别器与生成器的性能都逐渐提升,但随着实验的进行,判别器的性能突然降低,产生这样的原因便是同一物品被标记为不同类别的情况。在这种情况下,G和D之间的竞争过程也失去了原本的意义,推荐效果也存在局限。

2、模型框架

针对上面的问题,作者从原始的GAN出发。提出了一种vector-wise的训练方式。

我们都知道,最开始的GAN是用于图像生成的,G生成的是图像的向量,D直接判断这些向量是否是真实的图片。当G生成的是向量时,该向量可能非常与真实向量所接近,但与真实向量一模一样的概率却非常小,因此D被迷惑的概率也是非常小的。

在CFGAN中,G生成的是向量是什么呢?这里我们称其为购买向量purchase vector。这个也很好理解,假设我们有基于隐式反馈得到的用户-物品购买矩阵,那么从用户角度来说,购买向量便是矩阵中的一行,若用户与物品有过购买(其实不一定是购买,也可以认为是有过交互,不过本文统一认为为1的地方是用户对物品有过购买行为),该位置为1,如果没有购买,该位置是空(不是0),从物品角度来说,购买向量便是矩阵中的一列,若物品被用户购买过,该位置为1,如果没有购买过,该位置是空(不是0)。

因此,下面我们首先介绍从用户角度出发的CFGAN模型的设计,然后可以迁移到从物品角度出发的CFGAN框架。

2.1 整体框架

CFGAN的整体框架如下:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

生成器G的设计
生成器的输入包含两部分,一是用户向量c,另一个是噪声向量z。经过生成器的多层神经网络后,输出用户购买向量。向量中每一个值代表用户与物品交互的概率。非常巧妙的是,这里对输出的购买向量增加了一个mask。即图中下面的部分:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

mask向量eu中,用户交互过的地方为1,没有交互过的地方为0,为什么要加入mask呢?首先,为0的地方并不代表用户不喜欢,其次,用户没有购买过的物品,在乘上0之后,其实是训练的时候丢掉了这些节点,因为乘上0之后,梯度永远为0,是不会反向传播回去的;同时,如果把真实购买向量对应位置设置为0的话,判别器在这些地方也是没有损失的。这与传统的矩阵分解方法是非常类似的,即用用户购买过的地方去训练,随后预测用户对未购买过的物品的评分。

判别器D的设计
判别器将用户真实的购买向量和G生成的购买向量进行混合,尽可能地将真实向量识别成real,将生成的向量识别成fake。这里同样需要输入用户向量c。

模型训练
生成器的损失函数为:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

判别器的损失函数为:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

2.2 框架改进

ok,你是否觉得上述的模型讲的很有道理,近乎完美了呢?答案是否定的。咱想想看,如果生成器想要骗过判别器,非常简单就可以做到。因为没有交互过的物品经过mask之后会变成0,那么生成器只要生成全1的向量不就可以了嘛。所以说,只用用户购买过的物品,是不够的,还得通过负采样的技术,增加一定的负样本。即在每次训练迭代过程中,我们随机选择每个用户的未购买过物品的一部分,将其假设为负样本, 然后在训练生成器生成购买向量的时候,使其对应的负样本的值接近0。那么如何结合负采样技术,论文中提出了三种方式:zero- reconstruction regularization (named CFGAN−ZR)、partial-masking (named CFGAN−PM)、hybrid of the two (named CFGAN−ZP)。接下来,我们分别介绍三种方式:

CFGAN−ZR

ZR的方式,就是通过负采样得到一定比例的负样本,对于这些负样本,我们希望预测的分数越接近于0越好。此时G的优化目标变为:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

可以看到,对于ZR方式,前面部分的损失函数是没有变动的,即我们没有对mask进行修改。后面相当于增加了一个正则项,避免全1的结果出现。

CFGAN−PM

PM的方式,就是对mask进行修改,放开一些用户没有购买过的物品,这样,D在计算损失的时候会把这部分为交互过的部分加入,同时可以反向传播回G中,因此G不仅学习到在用户在购买过的物品上要得到接近1的输出,还会学习到在没有购买过的部分物品上要得到接近0的输出。此时G和D的损失函数变为:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

CFGAN−ZP

ZP的方式便是上面两种方式的结合,G的损失函数变为:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

完整的CFGAN-ZP的过程如下:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

2.3 迁移到物品角度

迁移到物品角度,非常简单,G的生成目标变为生成物品的购买向量,D的目标变为判别物品的真实购买向量和G生成的物品购买向量。结合负采样的话,同样分为ZR、PM和ZP三种方法。

这样,我们其实一共得到了六种方法,从用户角度出发,我们有uCFGAN_ZR,uCFGAN_PM,uCFGAN_ZP,从物品角度出发,我们有iCFGAN_ZR,iCFGAN_PM,iCFGAN_ZP。后面我们将对比这六种方法的实验效果。

3、模型实验

模型实验主要关注于三个问题:
1)CFGAN模型应用于推荐任务,效果如何?
2)CFGAN模型使用时,最佳的参数设置为多少?
3)与目前state-of-the-art方法比较,CFGAN能够带来多大的提升?

实验选取的数据集包括以下四个:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

接下来,我们看下结果。

3.1 模型的有效性

该部分的实验效果如下:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

对比我们之前看到的IRGAN和GraphGAN的效果,CFGAN相较于IRGAN准确率提升了72.6%,较GraphGAN提升了104.3%。

3.2 超参数设置对于模型的影响

这里主要的超参数包括ZR和PM方式中,负样本的比例,以及ZR方式中,正则项系数α。结果如下:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

3.3 与目前主流推荐方法的比较

这里选取的推荐方法有ItemPop、BPR、FISM、CDAE、IRGAN和GraphGAN。而CFGAN选择iCFGAN−ZP方式。对比结果如下:

推荐系统遇上深度学习(三十八)--CFGAN:一种基于GAN的协同过滤推荐框架

可以看到,CFGAN在各个数据集上,都有明显的效果提升。

4、总结

本文介绍了一种通过GAN来进行推荐任务的新思路,与之前结合强化学习的思路如IRGAN和GraphGAN不同,CFGAN更接近于GAN模型,G生成的是用户或者物品的购买向量,D的梯度可以反向传播回给G。该方法解决了IRGAN和GraphGAN中存在的discrete item index generation问题,取得了非常好的实验效果。值得大家阅读!