NeuralCF

8/2/2021 NeuralCF

# 为什么说在矩阵分解后得到的隐向量的内积运算不足以可靠地预测评分?

矩阵分解是试图在协同过滤共现矩阵的基础上,使用更稠密的隐向量表示用户和物品,挖掘用户和物品的隐含兴趣和隐含特征, 在一定程度上弥补协同过滤模型处理稀疏矩阵能力不足的问题。具体做法就是把共现矩阵分解成用户矩阵Q和物品矩阵P相乘的形式,这时候如果预测某个用户u对某个物品i的打分, 直接就可以得到, 其中是用户u和物品i的隐向量,而学习隐向量的过程我们是先随机初始化两个参数矩阵Q和P, 然后根据已有评分的值求损失, 通过梯度下降一步一步的更新参数得到的。

上面这个隐向量的学习过程, 在深度学习中, 就可以看成是一个简单的神经网络表示, 用户向量和物品向量可以看成embedding的方法, 而最终的评分值(预测值), 就是用户向量和物品向量内积后的“相似度”。 而这步内积运算, 就可以看成一个神经单元里面的计算了。

但是这个模型由于结构太简单,计算也太简单, 使得输出层无法对目标进行有效的拟合。 在实际问题中, 会发现往往模型会出现欠拟合的状态

上图中, 左边的就是我们说的共现矩阵(user-item)矩阵, 观察这个矩阵,可以计算出,,之间的相似度。 会发现共线矩阵里面最相似, 其次是,最后是。 但是如果我们把 , , 用隐向量的方式表现出来, 右图, 其中的隐向量。 会发现挺相似, 而和的相似度就小一些(不如)。But, 如果此时我们想把画出来,由于最近,那么无论是虚线里面的哪种情况,都会发现的相似度要大, 这在左边是不成立的。 也就是说隐空间中,对于来说, 左边的这种相似关系没法具体在隐空间中表示出来。

直观的看,是隐向量计算相似度的时候存在问题,因为相似度是夹角衡量的,夹角关系在降维之后有可能发生了错乱,但是这间接的说明了单单使用内积不足以可靠的预测评分。所以为了更好地学习用户和商品的隐向量与评分之间的关系,基于深度学习网络,作者想出了用一个多层的神经网络来替换简单的内积运算来增强模型的学习能力,这个就是Neural CF的框架了。

# NeuralCF在矩阵分解模型的基础上,做了哪些改进?

NeuralCF用“多层神经网络+输出层”的结构替代了矩阵分解模型中的简单内积操作。

其中原始的矩阵分解使用内积让用户与物品交互,为了进一步让向量在各维度上进行充分交叉,可以通过“元素积”(两个长度相等的向量对应维度相乘得到另一个向量)的方式进行互操作,这是广义的互操作形式。

NeuralCF混合模型整合了原始NeuralCF模型和以元素积为互操作的广义矩阵分解模型,使得模型具有了更强的特征组合和非线性能力。

但由于NeuralCF是基于协同过滤的思想进行改造的,并没有引入更多其他类型的特征,这无疑损失了很多信息

NeuralCF模型实际上提出了一个模型框架, 基于用户向量和物品向量这两个embedding层, 利用不同的互操作进行特征的交叉组合, 并可以灵活进行不同互操作层的拼接。 这里可以看出深度模型构建推荐模型的优势—利用神经网络理论上能够拟合任意函数的能力, 灵活组合特征, 按需增加或者减少模型复杂度。

# 模型结构越复杂越好吗?特征越多越好吗?

并不是模型越复杂、特征越多越好。首先要防止过拟合的风险,然后往往需要更多的数据和更长的训练时间才能使得复杂的模型收敛,需要在模型的实用性、实时性和效果之间进行权衡。