5

我正在尝试使用非负矩阵分解来构建推荐系统。使用scikit-learn NMF作为模型,我拟合了我的数据,导致了一定的损失(即重建错误)。然后我使用inverse_transform方法为新数据生成推荐。

现在我使用我在 TensorFlow 中构建的另一个模型做同样的事情。训练后的重建误差与之前使用 sklearn 的方法获得的误差接近。但是,潜在因素和最终建议都不是彼此相似的。

我知道的两种方法之间的一个区别是:在 sklearn 中,我使用的是坐标下降求解器,而在 TensorFlow 中,我使用的是基于梯度下降的 AdamOptimizer。其他一切似乎都一样:

  1. 使用的损失函数是 Frobenius 范数
  2. 在这两种情况下都没有正则化
  3. 使用相同数量的潜在维度对相同数据进行测试

我正在使用的相关代码:

1. scikit-learn 方法:

model =  NMF(alpha=0.0, init='random', l1_ratio=0.0, max_iter=200, 
n_components=2, random_state=0, shuffle=False, solver='cd', tol=0.0001, 
verbose=0)
model.fit(data)
result = model.inverse_transform(model.transform(data))

2.TensorFlow方法:

w = tf.get_variable(initializer=tf.abs(tf.random_normal((data.shape[0], 
2))), constraint=lambda p: tf.maximum(0., p))
h = tf.get_variable(initializer=tf.abs(tf.random_normal((2, 
data.shape[1]))), constraint=lambda p: tf.maximum(0., p))
loss = tf.sqrt(tf.reduce_sum(tf.squared_difference(x, tf.matmul(w, h))))

我的问题是,如果这两种方法生成的建议不匹配,那么我如何确定哪些是正确的?根据我的用例,sklearn 的 NMF 给了我很好的结果,但不是 TensorFlow 实现。如何使用我的自定义实现来实现相同的目标?

4

1 回答 1

2

优化器的选择对训练的质量有很大的影响。一些非常简单的模型(例如,我正在考虑 GloVe)确实可以与某些优化器一起使用,而其他一些则根本不可用。然后,回答您的问题:

  1. 我如何确定哪些是正确的?

评估与模型的设计一样重要,也很困难,即您可以尝试这两个模型和几个可用的数据集,并使用一些指标对它们进行评分。您还可以在真实案例应用程序上使用 A/B 测试来估计您的建议的相关性。

  1. 如何使用我的自定义实现来实现相同的目标?

首先,尝试为Tensorflow找到一个坐标下降优化器,并确保您实现的所有步骤与scikit-learn中的步骤完全相同。然后,如果您无法重现相同的内容,请尝试不同的解决方案(为什么不先尝试一个简单的梯度下降优化器?)并利用Tensorflow提供的强大模块化优势!

最后,如果您的实施提供的建议很糟糕,我建议您有错误。尝试与一些现有的代码进行比较。

于 2018-03-21T12:49:44.623 回答