好的,所以我可能完全走错了路。我想要做的是在tensorflow中实现Bayesian Personalized Ranking。
如果您不熟悉BPR,实际的培训程序依赖于在线更新,有点像SGD。
我遇到的问题如下。我需要定义自己的损失函数,如下:
def objective(data, lam, item_biases, latent_items, latent_users):
user, rated_item, unrated_item = data
rated_item_bias = item_biases[rated_item]
unrated_item_bias = item_biases[unrated_item]
rated_latent_item = latent_items[rated_item]
unrated_latent_item = latent_items[unrated_item]
latent_user = latent_users[user]
rated_pred = rated_item_bias + tf.dot(rated_latent_item, latent_user)
unrated_pred = unrated_item_bias + tf.dot(unrated_latent_item, latent_user)
difference = rated_pred - unrated_pred
obj = tf.sigmoid(difference)
obj += lam * tf.reduce_sum(rated_item_bias**2)
obj += lam * tf.reduce_sum(unrated_item_bias**2)
obj += lam * tf.reduce_sum(rated_latent_item**2)
obj += lam * tf.reduce_sum(unrated_latent_item**2)
obj += lam * tf.reduce_sum(latent_user**2)
return obj
请注意,此代码可能有错误的tf类型等,但这不是我关注的问题。如您所见,我有一些可训练的参数(即item_biases
,latent_items
和latent_users
)是张量流变量。我有一些lam
超参数。我有我的数据。数据本身不是传统数据。相反,它们是索引(对应于[user, seen item, unseen item]
三元组),我需要从参数中解压缩这些索引。
所以我的完整数据集可能是这样的:
1 50 6
11 23 24
4 24 5
...
,每行可能是一段数据。不幸的是,我不确定如何在tf框架中“输入”这样的数据。我最初的想法是让data
成为tf.placeholder
变量,因为我会在训练时将各种值加入其中。但是,当然,如果data
是Tensor,我不能只是将它解压缩,就像它是某种元组一样。
我该怎么办?
答案 0 :(得分:1)
通常超级参数不作为张量输入,因为您在模型之外修改它们并且它们在训练期间是恒定的。这也意味着它们会在您可能执行的任何模型导出中被写为常量,以防止您在参数和模型不匹配时发生的事故。我通常将它们作为标志传递给模型。
另一种常见模式是将输入数据作为张量字典(通常是占位符)。这允许您为不同的输入设置不同的形状。
如果需要,您还可以对张量进行切片。例如,data[:, 3]
将使用数据批次中每个条目的第三个值创建张量。