首页 文章

Tensorflow:opt.compute_gradients()返回与opt.apply_gradients()的权重差异不同的值

提问于
浏览
4

Question: 在TensorFlow网络中以最有效的方式获得权重增量的最有效方法是什么?

Background :我已将操作员连接起来如下(感谢SO question):

self.cost = `the rest of the network`
self.rmsprop = tf.train.RMSPropOptimizer(lr,rms_decay,0.0,rms_eps)
self.comp_grads = self.rmsprop.compute_gradients(self.cost)
self.grad_placeholder = [(tf.placeholder("float", shape=grad[1].get_shape(), name="grad_placeholder"), grad[1]) for grad in self.comp_grads]
self.apply_grads = self.rmsprop.apply_gradients(self.grad_placeholder)

现在,为了提供信息,我运行以下内容:

feed_dict = `training variables`
grad_vals = self.sess.run([grad[0] for grad in self.comp_grads], feed_dict=feed_dict)

feed_dict2 = `feed_dict plus gradient values added to self.grad_placeholder`
self.sess.run(self.apply_grads, feed_dict=feed_dict2)

run(self.apply_grads) 的命令将更新网络权重,但是当我计算起始和结束权重( run(self.w1) )的差异时,这些数字与 grad_vals[0] 中存储的数字不同 . 我认为这是因为RMSPropOptimizer对原始渐变做了更多,但我不确定是什么,或者在哪里找出它的作用 .

回到这个问题:如何以最有效的方式获得我的体重增量?我多次运行 self.w1.eval(sess) 以获得权重并计算差异?是否有 tf.RMSPropOptimizer 功能缺少的东西 .

谢谢!

2 回答

  • 3

    RMSprop不会从参数中减去梯度,但使用更复杂的公式,包括以下组合:

    • 一个动量,如果相应参数不为0

    • 梯度步骤,通过梯度平方平均值的平方根非均匀地(在每个坐标上)重新缩放 .

    有关更多信息,请参阅these slidesthis recent paper .

    首先在插槽变量'momentum'中通过tensorflow在内存中计算delta,然后更新变量(请参阅the C++ operator) .
    因此,您应该能够访问它并使用 delta_w1 = self.rmsprop.get_slot(self.w1, 'momentum') 构建增量节点 . (我还没试过 . )

  • 0

    您可以将权重添加到事物列表中以获取每个运行调用 . 然后你可以计算TensorFlow之外的增量,因为你将有迭代 . 这应该是合理有效的,尽管它可能会产生额外的元素差异,但是为了避免你可能不得不在优化器的内核中进行攻击,并在应用它之前找到它放置更新的位置并获取每一步 . 每次调用获取权重不应该至少对图的一部分进行浪费的额外评估 .

    RMSProp对每个权重的学习率进行了复杂的缩放 . 基本上,它将权重的学习率除以该权重的近期梯度的运行平均值 .

相关问题