更改嵌入TensorFlow的大小(例如,在Recommendation Engine中创建新用户)

时间:2017-11-13 19:26:55

标签: python tensorflow recommendation-engine

我有一个基于TF-recomm的TensorFlow推荐系统。每个用户都有与她关联的1+numFactors个号码:numFactors的向量,以及单个号码的偏移量。每个任务还​​有一个偏差和numFactors分配的向量。 TF-recomm代码是

def inference_svd(user_batch, item_batch, user_num, item_num, dim=5):
    bias_global = tf.get_variable("bias_global", shape=[])
    w_bias_user = tf.get_variable("embd_bias_user", shape=[user_num])
    w_bias_item = tf.get_variable("embd_bias_item", shape=[item_num])
    bias_user = tf.nn.embedding_lookup(w_bias_user, user_batch, name="bias_user")
    bias_item = tf.nn.embedding_lookup(w_bias_item, item_batch, name="bias_item")
    w_user = tf.get_variable("embd_user", shape=[user_num, dim], initializer=tf.truncated_normal_initializer(stddev=0.02))
    w_item = tf.get_variable("embd_item", shape=[item_num, dim], initializer=tf.truncated_normal_initializer(stddev=0.02))
    embd_user = tf.nn.embedding_lookup(w_user, user_batch, name="embedding_user")
    embd_item = tf.nn.embedding_lookup(w_item, item_batch, name="embedding_item")
    infer = tf.reduce_sum(tf.multiply(embd_user, embd_item), 1)
    infer = tf.add(infer, bias_global)
    infer = tf.add(infer, bias_user)
    infer = tf.add(infer, bias_item, name="svd_inference")
    regularizer = tf.add(tf.nn.l2_loss(embd_user), tf.nn.l2_loss(embd_item), name="svd_regularizer")
    return infer, regularizer

我已经能够使这个代码工作,并且能够将它与REST-API链接起来。

我遇到的问题是当我收到新用户时。我知道自己想做什么:

  • bias_user添加一行,初始化为0
  • embd_user添加一行,初始化为0
  • 当用户对新项目进行评分时,我们会使用相同的图表,但freeze项目的权重(我可以使用var_list上的optimizer.minimize进行评分)

然而,重量和偏差的形状是提前宣布的。我在tensorflow(运行或部署)上看到的所有材料都允许权重发生变化,但似乎不允许网络增长。

如果我在numpy中实现了这一点,我只需将新行添加到相应的矩阵中。有两种方法可以做到这一点,例如创建新的图形和变量,但最好重新使用用于训练模型的图形(以确保一致性)。

我正在寻找一种“最佳实践”系统,用于处理更改嵌入式张量的大小,特别是对于在线系统,它必须快速提供预测(这可以防止昂贵的操作)。

1 个答案:

答案 0 :(得分:1)

在系统中添加新用户时遇到的根本困难是,您需要重新培训才能为新用户提供有意义的预测。即使您能够动态调整嵌入矩阵的大小,您将使用哪些值来描述新用户的参数?

考虑到这一点,你有几个选择。

  1. 保存图表的权重,然后创建一个调整后尺寸的新图表,并在包含新用户信息的数据上重新训练。正如你所说,在你的关键路径上这可能成本太高。
  2. 使用某种折叠式方法。例如,您可以使用与类似项目进行过互动的用户的平均嵌入来初始化新用户的嵌入。
  3. 使用没有此问题并且可以更自然地合并新用户的模型。
  4. 我的推荐是第三种选择。有些类型的模型在进行预测时直接采用用户交互的顺序(或集合),而不依赖于您提前声明用户数量。例如,您可以使用以下内容:

    1. AutoRec模型:一种简单的自动编码器模型,它将用户与之交互的项目集合作为输入。
    2. Session-based Recommendations with Recurrent Neural Networks:一种循环模型,用于在预测时将用户交互的顺序作为输入。
    3. 两种模型都可以自然地处理新用户而无需更改计算图;添加新项目需要重新培训。

      第一类模型的一个实现是here;对于第二节课,请查看我的推荐系统包Spotlight