如何在张量流中为张量的一些条目停止梯度

时间:2017-04-12 09:02:35

标签: tensorflow deep-learning

我正在尝试实现嵌入层。嵌入将使用预先训练的手套嵌入进行初始化。对于可以在手套中找到的单词,它将被修复。对于那些没有出现在手套中的单词,它将随机初始化,并且可以训练。我如何在tensorflow中做到这一点?我知道整个张量都有一个tf.stop_gradient,这种情况有什么类型的stop_gradient api吗?或者,有什么解决方法吗?任何建议表示赞赏

3 个答案:

答案 0 :(得分:11)

所以我的想法是使用masktf.stop_gradient来解决这个问题:

res_matrix = tf.stop_gradient(mask_h*E) + mask*E

其中在矩阵mask中,1表示我想要应用渐变的条目,0表示我不想应用渐变的条目(将渐变设置为0),{{1} }是mask_h的投诉(1翻转为0,0翻转为1)。然后我们可以从mask获取。这是测试代码:

res_matrix

答案 1 :(得分:1)

我建议你有两个不同的张量来保存你的数据:你的预训练数据的tf.constant,以及你要训练的新数据的tf.Variable,那么你可以将两者混合在一起并且同样是张力加入行动。

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

答案 2 :(得分:1)

我对单词嵌入知之甚少,但我对您的问题的理解是您有一个变量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。它在优化程序更新中根本不是 applied

如果您不熟悉opt.compute_gradientsopt.apply_gradients,请在docs中解释。