推荐系统 之 NeuralCF与PNN

1. NerualCF

        背景:协同过滤的矩阵分解,我们用隐变量去逼近了,如果从深度学习的角度去理解这个做法,就是下面这张图了,矩阵分解层的用户隐向量和物品隐向量完全可以看作一种Embedding的方法,最终的打分层就是两个隐向量进行内积操作后得到的value。下面的图是协同过滤引入隐向量的方法:

         如果我们用这个方法去进行训练/拟合,我们会发现模型往往是欠拟合的状态的,因为这个模型太简单了。所以我们要引出一个有表达能力的模型出来。于是我们将神经网络引入来代替矩阵分解的内积操作。

        NerualCF的结构:

        通过结构可以看到,我们是用一个神经网络去代替了协同过滤的内积操作。

        这样做的目的是

        1. 让用户向量和物品向量在模型里面自由发挥,可以达到更好的特征交叉效果,从而得到更多有价值的信息。

        2. 引入非线性特征,让模型的表达能力更强

2. GMF模型

        将 user 和 item 的 Embedding 做点积(对应元素相乘),得到一个和 Embedding 等长的向量,然后交给 logistics regression。这就是广义的矩阵分解模型(GMF)

        我们用公式表达出来就是:

\phi = h(p_u\odot q_i)

\hat{y_{u,i}} = sigmod(\phi)

         这里的隐向量进行对应元素相乘之后会有个权重, 也就是各个隐向量维度的重要性不一定相同了。 如果H是一个全1向量的话,那就是普通的协同过滤了。这句话非常非常重要,这是理解GMF的核心所在。其实也就是NeuralCF的结构。

3. MLP模型

        书上直接写到,再进一步,可以把通过不同互操作得到的特征向量给拼接起来,然后输入到多层感知机模型(全连接的网络)里面就可以了,这会让模型有更强的特征组合和非线性能力。

        也就是非常简单的将输入变成:

z_1 = \begin{bmatrix} p_u\\q_i \end{bmatrix}

\phi (z__{l-1}) = A_n(A_{n-1}(...(A_1(W\begin{bmatrix} q_u\\ p_i \end{bmatrix}+b))))

        然后最后也和GMF一样,给他整一个权值:\hat{y_{u,i}} = \sigma (h^T \phi_L(Z_{l-1}))

        

 4. NerualCF的最终结构(GMF+MLP)

        以上两个GMF和MLP都是不同的互操作来增加模型的复杂度,用了不同的方法去做特征交叉,现在我们最红的NeuralCF就是把这两个方法给融合起来!

         如图,最终我们将两个模型合起来:

        最后一步两边不都是对互操作后的隐向量加上一个权值再输出嘛,心在我们先把各自的互操作堆叠起来,然后再对两个堆叠后的向量做权值处理。

        因为我们上面得到的GMF和MLP两个都是向量,而且是embedding大小的向量

\hat{y_{u,i}} = \sigma(h^T\begin{bmatrix} \phi^{GMF}\\ \phi^{MLP} \end{bmatrix})

        这里的\sigma是 sigmod的函数,然后权重h^T其实就是一个将这拼接后的向量放在一个全链接层上,在网络训练的时候就自然会有权重的体现了。

        以上就是NerualCF的框架了,其实也不是非常难,就是将两个方法个组装起来而已。

5.PNN(Product Based Nerual Networks)
在这里插入图片描述

         左边就是一个DeepCrosing的结构,右边是一个PNN的结构,可以看出就是把stacking层换成了Product层,还有把后面的Multiple层(残差网络)改成了全链接。下面来看具体的:

        首先也是将输入转化为多种,一种是数值型特征,一种是类别型特征,现在先把类别型特征onehot编码转化成稠密的Embedding向量。

        然后就是Product层了。

        首先看这层里面是不是有一个Z和一个P,其实是我用下面这么多特征可通过两种不同的特征组合方式得到的两组特征向量。特征向量的大小(shape),就是当前这个隐藏层的有多少个神经元的数量了,我们设置为D。下面我们来看两种特征组合究竟是怎么操作的。

        首先看左边的Z,上图!

        这张图讲的就是,我们假设D就是6,然后有4个Embedding向量,里面维度是5。输出的是当前这种特征组合方式的特征向量,所以向量里面的元素肯定就是一个单独值嘛

        也就是:L_z = \left \{ L^1_z,L^2_z,L^3_z......L^D_z \right \} 这里面每一个元素都是一个单独的值

        那这个单独的值怎么来的呢?首先先将四个Embedding向量给堆成一个E矩阵(4*5),然后特征向量都会对应一个权值矩阵,也就是一个有D个权值矩阵:

L_z^n = \sum^4_{i=1}\sum^5_{k=1}W^n_{i,k} * E_{i,k}

        然后权值矩阵的每一个值和E矩阵的每一个值想乘,最终得出也是一个4*5的矩阵,然后两个维度进行求和,最终得出一个值,这个值就是L_z^{n}了。

        再看右边的P

        右边这个P还是有点东西的,总共有有两种,上面那个是简单的每一组特征都乘一个向量来做处理,现在我们要对特征进行两两处理了

        第一种是IPNN模型:

        P_{ij} = <f_i,f_j>,也就是我们对每两两Embdedding矩阵进行内积,也就是向量的对应元素相乘,结果就是一个数,我们有假设有N个特征向量,于是我们构建一个P矩阵,他的大小是N*N。           然后,咱们的输出L_p也是一个向量,也就是这个向量的value是一个单独的值

        于是这里就和上面的一样,L_p的维度是D维,然后有对应D个权值矩阵,权值矩阵的维度都是N*N,就这么拿P矩阵乘D次不同的权值矩阵,最后,就对得到一个特征向量了

        第二种是OPNN模型:

        P_{ij} = f_i*f_j^T,和IPNN一样,构建一个P矩阵,然后P矩阵的每一个元素都是Embedding特征i和j的外积,所以每一个元素其实是一个M*M的矩阵。

        当我们最后的目标都是一个D维的向量,于是我们要对P进行处理了

        P=\sum^N_{i=1}\sum^N_{j=1}f_i*f_j^T

        也就是我们要对每一个M*M维度的矩阵进行一个相加操作,注意噢是对应位置的元素进行相加,这样,我们会得到一个M*M维度的P矩阵(且对称)。

        然后我们拿这P矩阵和D个不同的权值矩阵(大小是M*M,对称的)去做点乘,然后做两个维度的累加,最后出来的也是一个D维的特征向量。

        再看后面的两个全连接层

        首先是第一层,我们以上的所有操作都是对类别型特征进行处理的,现在要把数值型特征给加进来了:

L_1 = Relu(L_z+L_p+b)

        然后是第二层,就是一个简单的全连接层了。

L_2 = Relu(W*L_1+b)

         最后由于这个是一个二分类问题,我们用sigmod函数去做一个激活,然后用交叉熵损失函数去做损失就好了

        以上就是PNN模型了,对特征的交叉又推进了一步,把DeepCrosing的stacking 换成了Product层,内积外积的操作更有针对性低强调了不同特征之间的交互,从而将特征的交叉特性发挥出来。

        书上有这么一句话,还不太理解对于叠加矩阵p,《深度学习推荐系统》提到:它的最终形式类似于让所有特征Embeddding向量通过一个平均池化层(Average Pooling)后,再进行外积操作。但这种操作要谨慎, 因为把不同特征对应维度平均, 是假设不同特征对应维度有类似的含义, 而如果是“年龄”和“地域”平均的话会因为不在同一个向量空间进行操作,两者平均起来会模糊掉许多有价值的信息。平均embedding的操作一般是针对同类embedding。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值