前言
之前我们已经介绍了贝叶斯个性化排序(Bayesian Personalized Ranking, BPR),并基于BPR矩阵分解进行推荐实战。同传统矩阵分解一样,BPRMF也有神经网络的版本。此方法在刘建平老师的博客上已有介绍,但其评价指标和数据集划分与本系列不同。因此,本文在其基础上进行修改,方便与本系列方法一同进行比较。
如果你对本系列(未写完,持续更新中)感兴趣,可接以下传送门:
【推荐算法】从零开始做推荐(一)——认识推荐、认识数据
【推荐算法】从零开始做推荐(二)——推荐系统的评价指标,计算原理与实现样例
【推荐算法】从零开始做推荐(三)——传统矩阵分解的TopK推荐
【推荐算法】从零开始做推荐(四)——python Keras框架 利用Embedding实现矩阵分解TopK推荐
【推荐算法】从零开始做推荐(五)——贝叶斯个性化排序矩阵分解 (BPRMF) 推荐实战
【推荐算法】从零开始做推荐(六)——贝叶斯性化排序矩阵分解 (BPRMF) 的Tensorflow版
核心算法
以下内容以刘建平老师的博客为基准进行实现。
损失函数
arg max θ l ( θ ) = ∑ ( u , i , j ) ∈ D l n σ ( x ‾ u i − x ‾ u j ) + λ ∣ ∣ θ ∣ ∣ 2 , σ ( x ) = 1 1 + e − x \mathop{\arg\max_{θ}}\mathcal{l}(θ)=\sum_{(u,i,j)\in D} ln \sigma(\overline{x}_{ui}-\overline{x}_{uj})+\lambda||\theta||^2,\\ \sigma(x) = \frac{1}{1+e^{-x}} argθmaxl(θ)=(u,i,j)∈D∑lnσ(xui−xuj)+λ∣∣θ∣∣2,σ(x)=1+e−x1
求解算法
此处写的是Tensorflow的计算图,与刘老师不一样的地方在于,此处修改了参数(与传统BPRMF的参数设定成一致),并将损失函数完全按上文提及的定义。最大化损失等于最小化损失的负数,用梯度下降进行训练。
def bpr_mf(user_count,item_count,hidden_dim):
u = tf.placeholder(tf.int32,[None])
i = tf.placeholder(tf.int32,[None])
j = tf.placeholder(tf.int32,[None])
user_emb_w = tf.get_variable("user_emb_w", [user_count + 1, hidden_dim],
initializer=tf.random_normal_initializer(0, 0.001))
item_emb_w = tf.get_variable