《现代推荐算法》神经协同过滤之GMF算法
2020-03-01 本文已影响0人
伊凡vnir
关注公众号 长歌大腿,发送“机器学习”关键字,可获取包含机器学习(包含深度学习),统计概率,优化算法等系列文本与视频经典资料,如《ESL》《PRML》《MLAPP》等。
《现代推荐算法》神经协同过滤之GMF算法
神经协同过滤简介
前面的文章介绍了协同过滤算法,主要分为基于用户的协同过滤算法与基于物品的协同过滤算法,同时指出,矩阵分解也属于广义的协同过滤算法。
那么之前的文章介绍的SVD,SVD++等等矩阵分解算法都是在传统矩阵分解上面进行的改进。随着神经网络的兴起,神经网络应用到协同过滤算法上,有研究者(何教授)提出了神经协同过滤算法,并将其分为GMF,MLP,NeuMF三种具体的网络结构。我们在本篇文章中介绍其中的GMF模型。
广义矩阵分解算法(GMF)
GMF是广义矩阵分解的简写(generalized matrix factorization model) ,它模型具体描述为用户隐空间向量与物品隐空间向量的点积,然后进行加权和输出。如果我们令用户隐空间向量 为 物品隐空间向量 为 . GMF 由下面这个数学式给出
在公式里 是点积, , 是输出层激活函数与加权和输出的权重。在GMF模型中,模型用sigmoid 方程 作为激活函数 ,通过训练数据优化对数损失(交叉熵)学习权重 .
代码实现
我们采用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,然后经过嵌入编码,再进行点积,最后通过一个全连接线性层加权输出。