首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TensorFlow中使用停止梯度?

如何在TensorFlow中使用停止梯度?
EN

Stack Overflow用户
提问于 2018-01-17 08:07:04
回答 2查看 0关注 0票数 0

我在想怎么用stop_gradient在TensorFlow中,我要将单词嵌入到CBOWword2vec模型,现在用stop_gradient生成损失函数w.r.t.的梯度,我只想得到值,而不是反向传播。

目前,我使用的代码:

代码语言:javascript
复制
lossGrad = gradients.gradients(loss, embed)[0]
real_grad = lossGrad.eval(feed_dict)

现在有点晚了但我是这样解决的。我只想对一些变量进行优化,而不是对所有变量进行优化。我认为防止优化某些变量的方法是使用stop_grad-但我从来没有找到办法让它发挥作用.。也许有办法,但对我有效的是调整我的optimizer仅对变量列表进行优化。因此,与其:

代码语言:javascript
复制
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss)

我用:

代码语言:javascript
复制
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss, var_list=[variables to optimize over])

这防止了opt中未更新的变量。var_list希望它对你也有用!

EN

回答 2

Stack Overflow用户

发布于 2018-01-17 16:26:40

tf.gradients(loss, embed)计算张量的偏导数loss关于张量embedTensorFlow通过反向传播来计算这个偏导数,因此评估tf.gradients(...)执行反向传播。但是,计算该张量并不执行任何变量更新。

tf.stop_gradient()是一种运算,它充当正向的恒等函数,但阻止累积的梯度沿反方向流过该算子。它并不完全阻止反向传播,而是阻止单个张量对为表达式计算的梯度作出贡献。

票数 0
EN

Stack Overflow用户

发布于 2018-01-17 17:26:44

代码语言:javascript
复制
import tensorflow as tf
import numpy as np

w1 = tf.get_variable("w1", shape=[5, 1], initializer=tf.truncated_normal_initializer())
w2 = tf.get_variable("w2", shape=[5, 1], initializer=tf.truncated_normal_initializer())
w3 = tf.get_variable("w3", shape=[5, 1], initializer=tf.truncated_normal_initializer())
x = tf.placeholder(tf.float32, shape=[None, 5], name="x")


a1 = tf.matmul(x, w1)
a2 = tf.matmul(x, w2*w3)
a2 = tf.stop_gradient(a2)
loss = tf.reduce_mean(tf.square(a1 - a2))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
gradients = optimizer.compute_gradients(loss)
train_op = optimizer.apply_gradients(gradients)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档