MorvanZhou / Reinforcement-learning-with-tensorflow

Simple Reinforcement learning tutorials, 莫烦Python 中文AI教学
https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/
MIT License
8.83k stars 5k forks source link

传统policy gradient是否存在数据关联性问题? #61

Closed Junshuai-Song closed 6 years ago

Junshuai-Song commented 6 years ago

Deep Q-learning方法中,说sample数据之间不是相互独立的,不符合监督学习假设,所以训练时引入经验回放等减弱数据之间关联;

那么基础policy gradient方法中,训练actor的数据是不是也存在数据不相互独立的问题?觉得在网上似乎没什么人在pg中讨论这个问题,不知道你怎么看? 如果存在,那么PPO的提出(除了可以控制两次更新差别不那么大,网络不崩),其off-policy的训练方式,类似经验回放,是不是也有助于减弱这种数据关联性?

先谢过哈

MorvanZhou commented 6 years ago

首先, PPO是on-policy,不是off-policy, 而且PPO是建立在on-policy的假设上,不能做off-policy。on-policy和off-policy都有各自的好处和坏处。 off-policy: sample efficiency,训练速度一般会比on-Policy快,但是因为data distribution不停变化,参数更新可能会受到久远之前的data distribution影响。(所以DQN有个target net,用来stabilize这种变化) on-policy: 只能用最近收集的data train,因为只能在最近的data distribution上train。优势是可以用RNN。因为没有sample efficiency, 所以提出了多agent并行的做法来收集更多的数据。

MorvanZhou commented 6 years ago

PG的算法中,有个DPG和DDPG,就是用PG来做off-policy。像A3C, PPO都是基于PG做on-policy的假定。

Junshuai-Song commented 6 years ago

PPO是off-policy吧? 原文[1]中算法1有句伪代码:Optimize surrogate L wrt theta, with K epochs and minibatch size M<=NT 用old_theta采样出来的路径,更新实时的theta,所以涉及important sampling那个修正系数; 包括李宏毅老师强化学习课程[2]中1/2节介绍也是从pg-> from on-policy to off-policy -> PPO 这么介绍过来的?

另外一点关于policy gradient中数据关联的问题我在知乎也提问了,参见[3],应该说Actor-Critic中更合适一点,每个轨迹中单步都作为一个样本,那这些样本之间是不是也存在顺序关联的问题?

[1] Proximal Policy Optimization Algorithms.pdf [2] https://www.bilibili.com/video/av24667855/?p=2 [3] https://www.zhihu.com/question/282856940/answer/428443172

Junshuai-Song commented 6 years ago

@MorvanZhou

MorvanZhou commented 6 years ago

[2] 中,从31:57秒开始,有介绍使用现在pi收集出来的这些data来train pi。我觉得李宏毅老师说的off-policy和我理解的off-policy有点不一样。他可能是强调用这个data重复train很多次就是off-policy了。我的理解是off-policy要使用很久远之前的数据train,data distribution可能不是一样的。 [3] 是的,存在数据相关性,是的critic训练不太好,整体就训练不太收敛。

Junshuai-Song commented 6 years ago

[2] 好的! [3] 中这种数据关联是不是也会使得Actor训练不太好? @MorvanZhou

MorvanZhou commented 6 years ago

@songjs1993 对,[3]数据关联让C不太好,A也就不太好了

LiDuan1111 commented 5 years ago

@MorvanZhou 您好,有个问题想请教您一下,Policy gradient 的公式推导中,其实最后是采取多个轨迹来计算梯度并取平均,而现在我们大多是在一个回合结束后,就开始更新参数。那么,如果我想几个回合之后再来更新策略,应该怎么做? 我的想法是在每次回合结束时计算梯度,然后将几个回合的梯度相加再求平均,之后再将求平均之后的梯度用于更新参数,采用AdamOptimizer.apply_gradients(zip(gradients,network_paras))来更新参数,函数里的gradients我先placeholder,要更新参数的时候再把几个回合的平均梯度feed给它。 可是,这样做会出现如下问题:(问题就出现在我把用于更新参数的梯度先plceholder) TypeError: Tensor objects are not iterable when eager execution is not enabled. To iterate over this tensor use tf.map_fn. 请问您有没有什么建议或看法?

MorvanZhou commented 5 years ago

@LiDuan1111 你可能是apply_gradients 的使用有错, 按照tensorflow API的解释, grads_and_vars: List of (gradient, variable) pairs as returned by compute_gradients(). 可能不能用zip来包装gradients network_paras

LiDuan1111 commented 5 years ago

@MorvanZhou 对的,这个问题已经解决了~