Tensorflow:opt.compute_gradients() returns 值不同于 opt.apply_gradients() 的权重差异
Tensorflow: opt.compute_gradients() returns values different from the weight difference of opt.apply_gradients()
问题:在 TensorFlow 网络中以最有效的方式获取权重增量的最有效方法是什么?
背景:我已经将运算符连接如下(感谢这个):
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 对原始梯度做了更多的工作,但我不确定是什么,也不知道在哪里可以找到它的作用。
回到问题:如何以最有效的方式获得权重的增量?我是否卡住了 运行ning self.w1.eval(sess)
多次以获得权重并计算差异? tf.RMSPropOptimizer
函数中是否缺少某些内容。
谢谢!
您可以将权重添加到事物列表中以获取每个 运行 调用。然后您可以在 TensorFlow 之外计算增量,因为您将进行迭代。这应该是相当有效的,尽管它可能会产生额外的元素差异,但为了避免这种情况,您可能不得不深入优化器的内部并在应用更新之前找到它放置更新的位置并获取每个步骤。至少每次调用获取权重不应该对图表的一部分进行浪费的额外评估。
RMSProp 对每个权重的学习率进行复杂的缩放。基本上,它将权重的学习率除以该权重最近梯度幅度的 运行ning 平均值。
RMSprop 不会从参数中减去梯度,而是使用更复杂的公式,涉及以下组合:
- 一个动量,如果对应的参数不为0
- 一个梯度步骤,通过梯度的平方平均值的平方根非均匀地(在每个坐标上)重新缩放。
更多信息请参考these slides or this recent paper。
增量首先由 tensorflow 在插槽变量 'momentum' 中在内存中计算,然后更新变量(参见 the C++ operator)。
因此,您应该能够访问它并使用 delta_w1 = self.rmsprop.get_slot(self.w1, 'momentum')
构造一个增量节点。 (我还没试过。)
问题:在 TensorFlow 网络中以最有效的方式获取权重增量的最有效方法是什么?
背景:我已经将运算符连接如下(感谢这个
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 对原始梯度做了更多的工作,但我不确定是什么,也不知道在哪里可以找到它的作用。
回到问题:如何以最有效的方式获得权重的增量?我是否卡住了 运行ning self.w1.eval(sess)
多次以获得权重并计算差异? tf.RMSPropOptimizer
函数中是否缺少某些内容。
谢谢!
您可以将权重添加到事物列表中以获取每个 运行 调用。然后您可以在 TensorFlow 之外计算增量,因为您将进行迭代。这应该是相当有效的,尽管它可能会产生额外的元素差异,但为了避免这种情况,您可能不得不深入优化器的内部并在应用更新之前找到它放置更新的位置并获取每个步骤。至少每次调用获取权重不应该对图表的一部分进行浪费的额外评估。
RMSProp 对每个权重的学习率进行复杂的缩放。基本上,它将权重的学习率除以该权重最近梯度幅度的 运行ning 平均值。
RMSprop 不会从参数中减去梯度,而是使用更复杂的公式,涉及以下组合:
- 一个动量,如果对应的参数不为0
- 一个梯度步骤,通过梯度的平方平均值的平方根非均匀地(在每个坐标上)重新缩放。
更多信息请参考these slides or this recent paper。
增量首先由 tensorflow 在插槽变量 'momentum' 中在内存中计算,然后更新变量(参见 the C++ operator)。
因此,您应该能够访问它并使用 delta_w1 = self.rmsprop.get_slot(self.w1, 'momentum')
构造一个增量节点。 (我还没试过。)