我有一个基于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
中实现了这一点,我只需将新行添加到相应的矩阵中。有两种方法可以做到这一点,例如创建新的图形和变量,但最好重新使用用于训练模型的图形(以确保一致性)。
我正在寻找一种“最佳实践”系统,用于处理更改嵌入式张量的大小,特别是对于在线系统,它必须快速提供预测(这可以防止昂贵的操作)。
答案 0 :(得分:1)
在系统中添加新用户时遇到的根本困难是,您需要重新培训才能为新用户提供有意义的预测。即使您能够动态调整嵌入矩阵的大小,您将使用哪些值来描述新用户的参数?
考虑到这一点,你有几个选择。
我的推荐是第三种选择。有些类型的模型在进行预测时直接采用用户交互的顺序(或集合),而不依赖于您提前声明用户数量。例如,您可以使用以下内容:
两种模型都可以自然地处理新用户而无需更改计算图;添加新项目需要重新培训。