深度确定性策略梯度算法,越训练效果越差

通常RL中某个episode获得比较高的分数有两种情况,一种是确实已经收敛到最优策略,这种情况下分数波动不会太大;另一种是运气好,在探索的过程中某次分数上去了。可以预见第二种情况后续分数在会下跌,并且通常情况下会跌到比之前还差(然后再慢慢回升)。
因为远大于正常值的reward信号会给值函数网络(value-based methods)或者策略网络(policy-based methods)产生极大的扰动,使参数位置严重偏离原来的位置,一定程度上破坏了之前的训练成果,使得后续表现更差。
几个建议:
- 参考DDPG原论文模型参数和tricks
- 考虑尝试将网络的loss和梯度(最值/均值/norm)打印出来,观察是否有异常。(考虑使用clip reward/loss/gradients)
- 拓展上一点,其实训练过程中应该打印更多重要的训练信息(各层activation输出,loss,gradients和weights的均值最值norm值等等等),甚至是把训练画面render出来。单单盯着reward基本上就是就像看一个黑盒子,得到的信息就是模型能不能work而已。
- DRL本来就是很难优化的问题,局部的不稳定也是常见,耐心多跑一会看看全局趋势。
附上John Schulman一个tallk的slide: http://joschu.net/docs/nuts-and-bolts.pdf
【深度确定性策略梯度算法,越训练效果越差】 里面有很多比较具有参考价值的的DRL tuning skills,题主可以看一下。

■网友
自己也遇到过同样的问题。下面说一下自己的一点经验,不对的地方还请大家多多指教。我在训练的初始阶段是加入比较大的人工引导、执行模型的输出和探索较小,随着迭代次数的增加,人工引导逐渐减小、探索和模型的输出逐渐增多。这时我发现探索和模型输出的概率在0.6时已经效果不错了,但从0.6开始模型的效果开始逐渐下降,越训练越不好。我认为主要的原因是随着人工引导的减小,探索和模型输出的动作越来越多,导致buffer中不好的动作越来越多,从而使得模型更容易学到不好的动作。我尝试的解决办法是使用多个不同的buffer,比如说我设置了3个,一个用来正常的存储每一个执行的动作,再设置一个buffer专门用来存储执行得非常好的动作,在我的应用场景中,控制停止非常的重要,因此我也设置了一个一个buffer专门用来存储停止的非常好的动作。在训练的时候,专门用来存储好的动作的buffer可以从中选取batch size的1/4,停得非常好的buffer也是一样1/4,剩下的batch size的2/4是从正常的buffer里面提取的。这样的话就能保证每次训练的时候都能保证有一定比例的非常好的动作,不至于让模型走上歧途。实验证明效果变好了很多。希望对你也有帮助。总之有一种感觉,就是你在好的环境中就能学好,在不好的环境中就学坏的感觉。

■网友
我也遇到同样的问题


    推荐阅读