如何使用tf.scatter_sub计算梯度?

时间:2020-01-16 05:11:30

标签: tensorflow machine-learning deep-learning neural-network gradient

在张量流中实现lambda-opt(在KDD'19上发布的算法)时,遇到了一个问题,要使用 tf.scatter_sub 来计算梯度。

θ是指docid的嵌入矩阵。 公式是

θ(t + 1)=θ(t)-α*(grad + 2 *λ*θ),

delta = theta_grad_no_reg.values * lr + 2 * lr * cur_scale * cur_theta
next_theta_tensor = tf.scatter_sub(theta,theta_grad_no_reg.indices,delta)

然后我将θ(t + 1)用于某些计算。最后,我想计算相对于λ而不是θ的梯度。

但是渐变为无。

我写了一个这样的演示:

import tensorflow as tf

w = tf.constant([[1.0], [2.0], [3.0]], dtype=tf.float32)
y = tf.constant([5.0], dtype=tf.float32)

# θ
emb_matrix = tf.get_variable("embedding_name", shape=(10, 3),
                    initializer=tf.random_normal_initializer(),dtype=tf.float32)
# get one line emb
cur_emb=tf.nn.embedding_lookup(emb_matrix,[0])
# The λ matrix
doc_lambda = tf.get_variable(name='docid_lambda', shape=(10, 3),
                             initializer=tf.random_normal_initializer(), dtype=tf.float32)
# get one line λ
cur_lambda=tf.nn.embedding_lookup(doc_lambda, [0])

# θ(t+1) Tensor("ScatterSub:0", shape=(10, 3), dtype=float32_ref)
next_emb_matrix=tf.scatter_sub(emb_matrix, [0], (cur_emb *cur_lambda)) 
# do some compute with θ(t+1) Tensor ,not Variable
next_cur_emb=tf.nn.embedding_lookup(next_emb_matrix,[0])

y_ = tf.matmul(next_cur_emb, w)
loss = tf.reduce_mean((y - y_) ** 2)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
grad_var_list=optimizer.compute_gradients(loss)
print(grad_var_list)
# [(None, <tf.Variable 'embedding_name:0' shape=(10, 3) dtype=float32_ref>), (None, <tf.Variable 'docid_lambda:0' shape=(10, 3) dtype=float32_ref>)]

渐变也为“无”。似乎 tf.scatter_sub op不提供渐变?

感谢您的帮助!

如果您对此算法感兴趣,可以进行搜索,但是对于这个问题并不重要。

0 个答案:

没有答案