我在多线程环境中实现异步梯度下降时遇到了麻烦。
为每个线程描述我的代码的骨架
loop
synchronize with global param
< do some work / accumulate gradients on mini-batch >
apply gradient descent to the global network, specifically,
= self.optimizer.apply_gradients(grads_and_vars)
end
每个线程都有自己的优化器。
现在的问题是,在使用'use_locking = False'定义优化器时,它不起作用,由我的强化学习代理生成的奖励证明。
然而,当我设置'use_locking = True'时,它的工作方式是正确的;只是局部渐变没有正确应用于全局参数。
因此我想到的一些可能原因如下: 1.当一个线程正在更新全局参数时,当另一个线程访问全局参数时,前一个线程将取消所有剩余的更新。并且太多的线程同时访问这个全局参数,线程做了所有努力工作。 2.参考,How does asynchronous training work in distributed Tensorflow?,异步读取在循环顶部确定无误。但是,可能一旦线程完成应用渐变,它就会从全局参数中快速同步,以至于它不会从其他线程获取更新。
对于这个特定的循环实例,你能帮助我使用'use_locking'来帮助我真正发生的事情吗?
我在这个简单的例子上度过了几天。尽管设置use_locking = True确实可以解决问题,但它本质上不是异步的,而且速度也很慢。
感谢您的帮助。