首页 > 解决方案 > 如何使用 tf.scatter_sub 计算梯度?

问题描述

在 tensorflow 中实现 lambda-opt(KDD'19 上发布的一种算法)时,遇到了一个问题,用 tf.scatter_sub计算梯度。</p>

θ 指的是 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好像没有提供渐变?</p>

感谢您的帮助!</p>

如果你对这个算法感兴趣,可以搜索一下,不过这个问题不重要。

标签: tensorflowmachine-learningdeep-learningneural-networkgradient

解决方案


推荐阅读