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 回答
RMSprop不会从参数中减去梯度,但使用更复杂的公式,包括以下组合:
一个动量,如果相应参数不为0
梯度步骤,通过梯度平方平均值的平方根非均匀地(在每个坐标上)重新缩放 .
有关更多信息,请参阅these slides或this recent paper .
首先在插槽变量'momentum'中通过tensorflow在内存中计算delta,然后更新变量(请参阅the C++ operator) .
因此,您应该能够访问它并使用
delta_w1 = self.rmsprop.get_slot(self.w1, 'momentum')
构建增量节点 . (我还没试过 . )您可以将权重添加到事物列表中以获取每个运行调用 . 然后你可以计算TensorFlow之外的增量,因为你将有迭代 . 这应该是合理有效的,尽管它可能会产生额外的元素差异,但是为了避免你可能不得不在优化器的内核中进行攻击,并在应用它之前找到它放置更新的位置并获取每一步 . 每次调用获取权重不应该至少对图的一部分进行浪费的额外评估 .
RMSProp对每个权重的学习率进行了复杂的缩放 . 基本上,它将权重的学习率除以该权重的近期梯度的运行平均值 .