我想知道如何stop_gradient
在 tensorflow 中使用,文档对我来说并不清楚。
我目前正在使用stop_gradient
CBOW word2vec 模型中的词嵌入来产生损失函数的梯度。我只想获得价值,而不是进行反向传播(因为我正在生成对抗性示例)。
目前,我正在使用代码:
lossGrad = gradients.gradients(loss, embed)[0]
real_grad = lossGrad.eval(feed_dict)
但是当我运行它时,它无论如何都会进行反向传播!我做错了什么,同样重要的是,我该如何解决这个问题?
澄清:为了澄清“反向传播”,我的意思是“计算值和更新模型参数”。
更新
如果我在第一个训练步骤之后运行上面的两行,那么在 100 个训练步骤后我得到的损失与我不运行这两行时不同。我可能从根本上误解了 Tensorflow。
我尝试set_random_seed
在图形声明的开头和每个训练步骤之前都使用设置。多次运行之间的总损失是一致的,但在包括/排除这两条线之间却不一致。因此,如果不是 RNG 导致了差异,也不是训练步骤之间模型参数的意外更新,您知道什么会导致这种行为吗?
解决方案
Welp,这有点晚了,但这是我解决它的方法。我只想优化一些但不是全部变量。我认为防止优化某些变量的方法是使用stop_grad
- 但我从来没有找到一种方法来实现这一点。也许有一种方法,但对我有用的是将我的调整optimizer
为仅优化变量列表。所以而不是:
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss)
我用了:
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss, var_list=[variables to optimize over])
这阻止opt
了更新不在var_list
. 希望它也适合你!