数学建模艺术算法艺术

《现代推荐算法》神经协同过滤之GMF算法

2020-03-01  本文已影响0人  伊凡vnir

关注公众号 长歌大腿,发送“机器学习”关键字,可获取包含机器学习(包含深度学习),统计概率,优化算法等系列文本与视频经典资料,如《ESL》《PRML》《MLAPP》等。
《现代推荐算法》神经协同过滤之GMF算法

神经协同过滤简介

前面的文章介绍了协同过滤算法,主要分为基于用户的协同过滤算法与基于物品的协同过滤算法,同时指出,矩阵分解也属于广义的协同过滤算法。
那么之前的文章介绍的SVD,SVD++等等矩阵分解算法都是在传统矩阵分解上面进行的改进。随着神经网络的兴起,神经网络应用到协同过滤算法上,有研究者(何教授)提出了神经协同过滤算法,并将其分为GMF,MLP,NeuMF三种具体的网络结构。我们在本篇文章中介绍其中的GMF模型。

广义矩阵分解算法(GMF)

GMF是广义矩阵分解的简写(generalized matrix factorization model) ,它模型具体描述为用户隐空间向量与物品隐空间向量的点积,然后进行加权和输出。如果我们令用户隐空间向量p_{u}P^{T}v_{u}^{U} 物品隐空间向量 q_{i}Q^{T}v_{i}^{I}. GMF 由下面这个数学式给出
\hat{y_{u,i}}=a_{out}(h^{T}(p_{u}\odot q_{i}))
在公式里 \odot 是点积, a_{out}h 是输出层激活函数与加权和输出的权重。在GMF模型中,模型用sigmoid 方程 \sigma(x) = 1/(1+e^{-x}) 作为激活函数 a_{out} ,通过训练数据优化对数损失(交叉熵)学习权重 h .

代码实现

我们采用pytorch计算框架来示例GMF的网络结构部分。GMF网络类如下所示,

class GMF(nn.Module):
    def __init__(self,user_num, item_num, factor_num):
        super(GMF,self).__init__()
        self.embed_user_GMF = nn.Embedding(user_num,factor_num)
        self.embed_item_GMF = nn.Embedding(item_num,factor_num)
        self.predict_layer = nn.Linear(factor_num,1)
        self._init_weight_()

    def _init_weight_(self):
        nn.init.normal_(self.embed_item_GMF.weight,std=0.01)
        nn.init.normal_(self.embed_user_GMF.weight,std=0.01)

    def forward(self,user,item):
        embed_user_GMF = self.embed_user_GMF(user)
        embed_item_GMF = self.embed_item_GMF(item)
        output_GMF = embed_user_GMF*embed_item_GMF
        prediction = self.predict_layer(output_GMF)
        return prediction.view(-1)

先根据嵌入层维度等信息初始化网络,同时初始化权重为方差为0.01的正态分布(非必要)。
网络传播层如代码所示,输入为用户与物品的ID,然后经过嵌入编码,再进行点积,最后通过一个全连接线性层加权输出。

上一篇下一篇

猜你喜欢

热点阅读