我正在尝试实现嵌入层。嵌入将使用预先训练的手套嵌入进行初始化。对于可以在手套中找到的单词,它将被修复。对于那些没有出现在手套中的单词,它将随机初始化,并且可以训练。我如何在tensorflow中做到这一点?我知道整个张量都有一个tf.stop_gradient,这种情况有什么类型的stop_gradient api吗?或者,有什么解决方法吗?任何建议表示赞赏
答案 0 :(得分:11)
所以我的想法是使用mask
和tf.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_gradients
和opt.apply_gradients
,请在docs中解释。