这篇文章和hdqn,我个人感觉差别还是很明显的。
最明显的是我没有感受到时间维度的差异,也就是什么提供goal的时间维度小,施行者时间维度大,这一个特点。
我花了三天吧(前两天感觉没有集中精神),把文章代码都读了几遍。
除了文章中的dilated lstm,我不大明白是怎么实现的外(文章中说和cw lstm的idea一样,还列出了dilated convelution的paper,所以我感觉是为了更好的形成长期记忆,避免忽略细节(这个是paper中dc的优点),所以索性当作正常的lstm吧,毕竟只是结构的差异),其他的大概都明白了。
首先给出整个网络的结构图:
这个里面主要分为三个部分:一个是感知Net,一个是Manager,一个是Work
感知主要是为了把原始的空间信息提取特征出现的。(个人理解)
Manager提供目标,Work采取行动。
首先得说一下,这个框架的整体结构是A3C的,一个gobal的policy(也就是包括以上三个net),然后一堆local的policy,
第一步:先clone global的参数,
第二步:各个local policy 去collect经验(一个rollout)
每个rollout包括
(Obs,reward(环境返回的),s(也就是Manager的内部状态,用的(2)式),g(目标(global),act,m_value(manager估计的value),h(3,5)式产的),还有一个r,这个r,当这一个rollout是因为正常结束而终止的时候,等于0,否则也就等于manager估计的这个value值(弥补未完成步骤的奖励估计))。
第三步:收集完了需要处理这些信息,处理成
(o,act,h,r(infinte discount value,也就是我们平时计算的从当前到结束获得的收益),g_sum(c step步的global的集合,从当前起,将c步之前的global加入这个list中,主要是为了embedding global用的),i_reward(内部奖励,用于worker的loss),s_diff(c step之后的状态与现在的状态向量相减,主要适用于衡量与当前global的cos距离,用于计算manager的loss))以后计算loss)
第四步:计算完了传给global,对global的parm计算梯度并bp,更新global。然后再进行第一步。
其中几个loss的设计,papaer给出的:
global的loss如上。
内部奖励的计算公式如上
worker的loss如上
还有两个value function。这里会出现很多stop_gradient,因为manager和work是没有直接的bp的。
loss转化为代码:
这里还有一个很有意思的点:
就是global embedding:主要就是想让manager的global直接影响到最后的action的选择,所以对global进行了映射。
原文如下:
代码:
。