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

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

神经协同过滤简介

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

广义矩阵分解算法(GMF)

GMF是广义矩阵分解的简写(generalized matrix factorization model) ,它模型具体描述为用户隐空间向量与物品隐空间向量的点积,然后进行加权和输出。如果我们令用户隐空间向量 p u p_{u} pu P T v u U P^{T}v_{u}^{U} PTvuU 物品隐空间向量 q i q_{i} qi Q T v i I Q^{T}v_{i}^{I} QTviI. GMF 由下面这个数学式给出
y u , i ^ = a o u t ( h T ( p u ⊙ q i ) ) \hat{y_{u,i}}=a_{out}(h^{T}(p_{u}\odot q_{i})) yu,i^=aout(hT(puqi))
在公式里 ⊙ \odot 是点积, a o u t a_{out} aout h h h 是输出层激活函数与加权和输出的权重。在GMF模型中,模型用sigmoid 方程 σ ( x ) = 1 / ( 1 + e − x ) \sigma(x) = 1/(1+e^{-x}) σ(x)=1/(1+ex) 作为激活函数 a o u t a_{out} aout ,通过训练数据优化对数损失(交叉熵)学习权重 h h 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,然后经过嵌入编码,再进行点积,最后通过一个全连接线性层加权输出。

你可能感兴趣的:(机器学习,算法,深度学习,人工智能,机器学习,python)