前言
最近想要进行对比实验,在写AtttRec的时候,发现要使用对损失函数,即来自BPR(贝叶斯个性化排序)。因此,先建立MF-BPR模型进行实验。在BPR的建立过程遇到很多问题,现在将整个模型的建模过程进行分享。模型源码可以在我的Githubhttps://github.com/ZiyaoGeng/Recommender-System-with-TF2.0
找到。
本文约2.9k字,预计阅读10分钟。
MF-BPR模型建立
1、首先定义模型输入的初始化参数:
-
feature_columns:输入的特征列,分为用户特征和物品特征列【包含特征名、特征最大值、embedding维度】;
-
embed_reg:embedding的正则化参数;
分别建立用户嵌入层和物品嵌入层(由于考虑到特征可能包括多个,如用户id、性别、年龄,物品id、种类等,所以用户、物品嵌入信息分别以列表的形式保存)。
初始化如下所示:
class BPR(Model):
def __init__(self, feature_columns, embed_reg=1e-6):
"""
BPR
:param feature_columns: A list. user feature columns + item feature columns
:param embed_reg: A scalar. The regularizer of embedding.
"""
super(BPR, self).__init__()
# feature columns
self.user_fea_col, self.item_fea_col = feature_columns
# field num
self.user_field_num = len(self.user_fea_col)
self.item_field_num = len(self.item_fea_col)
# user embedding layers [id, age,...]
self.embed_user_layers = [Embedding(input_dim=feat['feat_num'],
input_length=1,
output_dim=feat['embed_dim'],
embeddings_initializer='random_uniform',
embeddings_regularizer=l2(embed_reg))
for feat in self.user_fea_col]
# item embedding layers [id, cate_id, ...]
self.embed_item_layers = [Embedding(input_dim=feat['feat_num'],
input_length=1,
output_dim=feat['embed_dim'],
embeddings_initializer='random_uniform',
embeddings_regularizer=l2(embed_reg))
for feat in self.item_fea_col]
2、具体结构
(1)模型的输入为三元组的形式:(user_inputs, pos_inputs, neg_inputs)
;
(2)用户embedding、正、负样本embedding分别将对应的所有稀疏特征embedding平均池化后得到的;
(3)分别计算正、负样本得分;
「(4)在TF2.0中,Model类继承了tf.keras.layers.Layer」,因此包含add_loss
方法,因此通过add_loss
在模型结构中加入损失;
tf.keras.layers.Layer
:

(5)返回正负样本分数;
模型构建如下: