如何停止tensorflow中某个张量入口的梯度

如何停止tensorflow中某个张量入口的梯度,tensorflow,deep-learning,Tensorflow,Deep Learning,我正在尝试实现一个嵌入层。嵌入将使用预先训练的手套嵌入进行初始化。对于可以在手套中找到的单词,它将被修复。对于手套中没有出现的单词,它将被随机初始化,并且可以训练。如何在tensorflow中执行此操作?我知道整个张量都有一个tf.stop_梯度,这种情况下有没有停止_梯度api?或者,有什么解决办法吗?非常感谢您的任何建议我建议您使用两种不同的张量来保存数据:一个用于预训练数据的tf.constant,一个用于待训练新数据的tf.Variable,然后您可以将这两种操作与串联操作以及类似的张量

我正在尝试实现一个嵌入层。嵌入将使用预先训练的手套嵌入进行初始化。对于可以在手套中找到的单词,它将被修复。对于手套中没有出现的单词,它将被随机初始化,并且可以训练。如何在tensorflow中执行此操作?我知道整个张量都有一个tf.stop_梯度,这种情况下有没有停止_梯度api?或者,有什么解决办法吗?非常感谢您的任何建议

我建议您使用两种不同的张量来保存数据:一个用于预训练数据的tf.constant,一个用于待训练新数据的tf.Variable,然后您可以将这两种操作与串联操作以及类似的张量连接操作混合使用


由于tf.constant无法训练,您不必担心停止渐变。

我对单词嵌入不太了解,但我对您的问题的理解是,您有一个变量
v
,您只想训练它的某些(已知)条目。您可以通过使用“遮罩”(即与
v
形状相同的常数张量)操纵梯度来实现这一点,该常数张量的值为1(可训练条目),否则为0

v = your_variable()
loss = your_loss() #some loss that uses v
mask = your_mask_as_explained_above()
opt = tf.train.GradientDescentOptimizer(learning_rate=0.1)

# Get list (length 1 in our example) of (gradient, variable)-pairs from the optimizer and extract the gradient w.r.t. v
grads_and_vars = opt.compute_gradients(loss, [v])
v_grad = grads_and_vars[0][0]

# Multiply the gradient with the mask before feeding it back to the optimizer
sgd_step = opt.apply_gradients([(v, v_grad*mask)])
但是,根据问题的复杂性,这可能不是一个有效的解决方案,因为在每个步骤中都会计算完整的梯度w.r.t.
v
。它只是没有在优化器更新中应用


如果您不熟悉
opt.compute_gradients
opt.apply_gradients
,在中有一个解释。

因此想法是使用
mask
tf.stop_gradients
来解决此问题:

res_matrix=tf.stop_梯度(mask_h*E)+mask*E

其中,在矩阵
mask
中,1表示我想对哪个条目应用梯度,0表示我不想对哪个条目应用梯度(将梯度设置为0),
mask\u h
mask
的变量(1翻转为0,0翻转为1)。然后我们可以从
res\u矩阵中获取。以下是测试代码:

import tensorflow as tf
import numpy as np

def entry_stop_gradients(target, mask):
    mask_h = tf.abs(mask-1)
    return tf.stop_gradient(mask_h * target) + mask * target

mask = np.array([1., 0, 1, 1, 0, 0, 1, 1, 0, 1])
mask_h = np.abs(mask-1)

emb = tf.constant(np.ones([10, 5]))

matrix = entry_stop_gradients(emb, tf.expand_dims(mask,1))

parm = np.random.randn(5, 1)
t_parm = tf.constant(parm)

loss = tf.reduce_sum(tf.matmul(matrix, t_parm))
grad1 = tf.gradients(loss, emb)
grad2 = tf.gradients(loss, matrix)
print matrix
with tf.Session() as sess:
    print sess.run(loss)
    print sess.run([grad1, grad2])

这样,我将不得不做很多预处理。这会让我的代码看起来有点难看。我将尝试使用聚集和分散以及停止梯度,看看是否会工作。真的希望有一个功能来支持这一点。谢谢你的回复,我想你的解决方案会奏效的。我刚刚提出了另一个想法,我在下面发布了它。你可能想更新它,因为有些函数已经更新了。有关可用的代码段,请参见。