我使用tensorflow实现了端到端的lambdaRank检索模型。有3个模块:rep_module,inter_module和L2R_module。嵌入(emb_mat)在L2R_module中定义,并作为参数传递给rep_module和inter_module: 因此,聚合的L2R模块将具有:
self.emb_mat = tf.get_variable("emb_mat",
shape=[self.vocab_size, self.emb_dim], dtype=tf.float32)
self.rep_mod = RepModule(...., emb_mat=self.emb_mat)
self.inter_mod = InterModule(..., emb_mat=self.emb_mat)
目标是让rep和inter模块共享emb_mat,并与这两个模块一起学习。这个L2R模块将输出一批分数:score =(Batch_size,1)
然后,我还有另一个更高级别的lambdaRank模块来手动计算渐变(我无法使用自优化器中的内置功能,因为我必须获取等级并将其与lambda等级中的值相乘)。我有一个_jacobian(y,x)函数,如下所示:
def _jacobian(self, y_flat, x):
"""
https://github.com/tensorflow/tensorflow/issues/675
for ranknet and lambdarank
"""
loop_vars = [
tf.constant(0, tf.int32),
tf.TensorArray(tf.float32, size=self.batch_size),
]
_, jacobian = tf.while_loop(
lambda j, _: j < self.batch_size,
lambda j, result: (j + 1, result.write(j, tf.gradients(y_flat[j], x))),
loop_vars)
return jacobian.stack()
它将计算y wrt x的每个元素的等级,并将它们重新组合在一起。 我可以得到除emb_mat以外的所有其他变量(模型参数)的所有分数的雅可比式分数。我的其他变量就像tf.layers ..变量
tf。变量'conv1 / conv1d / kernel:0'shape =(3,300,256)dtype = float32_ref,
,但无法计算emb_mat的梯度。
它返回类似:
TypeError: Failed to convert object of type <class 'list'> to Tensor. Contents: [<tensorflow.python.framework.ops.IndexedSlices object at 0x7f025e161f28>]
和
TypeError: Expected binary or unicode string, got <tensorflow.python.framework.ops.IndexedSlices object at 0x7f025e161f28>