A3C

中央大脑 Global_net 以及 4个(一般多少个CPU就多少个Worker)worker, 每个 worker都是独立做一个 AC算法, A3C其实就是一个并行计算的AC,只是在某些时候需要同步障, 同步的时候,有 push和pull动作,分别向 Global_net输出自己训练的东西, 以及从Global_net拿 更新后的神经网络参数

Global_net只包含Global_net的参数, 它本身并不做训练,但它有优化器,可以根据worker提供过来的梯度值,更新global_net中的参数,更新完这个参数后(每轮更新受限于learning_rate,当然,这也是为何要通常要300-500step才更换一次网络权值,因为一次step对网络权值的更新受限于learningrate太小了,等积累到较大一点的改变之后,再整体将eval-net的权值更新到target-net中), 再把修正后的global_net中的参数(注意,每个worker积累到一定的),通过pull操作assign给worker. local worker和global brain之间,主体的actor-critic网络结构一样,通过push和pull更新和共享权值。

值得注意的是: 每个worker在迭代step达到UPDATE_GLOBAL_ITER整数倍的时候,都会触发 push操作,即拿着自己的a和c的gradient更新 global_net中的a和c的params。 并且随后就将 global_net的这种参数更新及时地回馈给本worker。 这意味着,global_net中的参数,不断地且一个一个地依次接收worker们的梯度, 然后自己朝着这个方向,不断地做一个learning_rate步长的参数更新,然后将这个更新及时且不同地反馈给各个worker.  比如worker1先交代自己的梯度方向, global按这个方向走了一个learningrate的参数更新步长(步子很小,所以不用担心global过于拟合worker1,不必担心global朝着worker1走得太远, 因为worker1和global交互后,由于同步障的coordinate,它必须等到4个worker都做完这轮交互才能往下进展); 那么当global朝着worker1贴近1点点之后, 这个时候worker3的loss训练完了,将自己的梯度方向告诉global, global紧接着按照worker3的方向做参数更新,然后把更新后的参数值传给worker3让它继续experience。 这样, 其实在每一轮worker和global的交互中,每个worker拿到的global的参数其实是不一样的!(都是交互的当时,global的最新参数),但这种worker间的不一致性,恰好可以继续打乱experience之间的相关性,保持每个worker的独特经历,这才有意思,这才符合真正的人类社会智能!

PS: 至于每个worker如何驱动自己不停地exploration,那就是通过q-learning中的 由初始状态s, 然后使用本worker的ACNet的 choose_action,有了a, 就执行env.step,获得下一个observation s_, 然后s_继续调用choose_action又会有下一个a...  这样循环起来,每个worker就会不停地获得experience.


你可能感兴趣的:(A3C)