我是靠谱客的博主 内向汽车,最近开发中收集的这篇文章主要介绍DDPG或TD3算法训练时总是输出边界值问题记录,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近在使用stable-baselines3框架中的DDPG算法时,发现一个问题:只要算法探索步数达到learning_starts,一开始学习,actor网络很快就会输出动作边界值,然后就保持不变,一直输出同样的边界值。后来换了TD3,发现也会出现这个问题,于是就上网查找解决方案,发现很多人都有这个问题。下面我从自己的经验出发,结合网上其他人的分析,给出造成这个问题可能的原因以及解决方案:

1.如果你的actor网络输出使用tanh函数,那么一个很大的可能性就是预激活变量(输入tanh的)范围太大,进入了tanh的饱和区,会导致梯度消失,而且tanh输出的自然就靠近边界了(自己看下tanh的函数图就明白了)。

ps:首先尝试把激活函数变成Relu,查看是否是由于tanh造成的问题。如果不是,重点检查环境和奖励函数;如果是,参考下面的解决方案。

这种情况下,可能的解决方案有以下几种:

A.减少网络层数,比如把三层全连接改成一层全连接

B.调整隐藏层大小,比如把{256,256}改成{256,128},可以参考:

强化学习调参技巧一: DDPG算法训练动作选择边界值_分析解决_丨汀、的博客-CSDN博客_ddpg 输出边界值

C.建议看看网络参数是否有异常,或者太大。如果网络参数太大的话,看看在初始化网络的时候,能不能把初始参数调低一些,或者调一调其它的超参数,例如学习率什么的。 

D.加惩罚项,当预激活的值较大时(达到饱和)给一点惩罚,促进预激活变量活动在非饱和区

E.如果你的任务允许,可以把actor的激活函数换掉,不用tanh 

2. 没有进行归一化操作

解决办法:对网络的输入输出归一化,使得buffer里的{s,a,r,s_}都是同一个数量级的

3.reward设计的不合理,例如惩罚设置的太大,导致中间状态的evaluation普遍较低

解决方法:

A.减小reward的值,例如把reward的绝对值限制在[0,1]

B.增加约束,保证对状态的约束能覆盖所有情况

ps: 关于reward的设置没有任何捷径,基本你要结合自己的实验来设计

4.可能是训练时间还不够,还需要继续训练。因为在空间的上下边界切换的状态,可以猜测agent应该是尽量避免较大的负反馈,还没有开始选择最优。

5.针对stable-baselines3框架,可以通过改变learning_starts的大小,多试几次,说不定就可以解决边界值问题,因为我这样做成功过。至于原因,我觉得是采样过程的随机性,反正有点玄学。learning_starts不用设置太大,让算法快点完成前期采样进入学习,然后验证是否会出现边界值问题。

以上是汇总了自己的经验和别人的经验得到的,可以尝试,不保证一定有效,毕竟每个人的实际情况都不同。如果所有方案都试了,还是有这个边界值问题,也可以考虑换其他算法试试,不要在一棵树上吊死,可以参看:如何选择深度强化学习算法?MuZero/SAC/PPO/TD3/DDPG/DQN/等(2021-04) - 知乎

感谢以下文章的帮助:

DDPG算法actor网络的输出值固定在action的边界值这是啥原因,和actor用tanh有关吗? - 知乎

强化学习DDPG算法训练总是选择边界动作是什么原因造成的?-Python-CSDN问答

强化学习调参技巧一: DDPG算法训练动作选择边界值_分析解决_丨汀、的博客-CSDN博客_ddpg 输出边界值

强化学习过程中为什么action最后总会收敛到设定的行为空间的边界处? - 知乎

深度强化学习调参技巧:以D3QN、TD3、PPO、SAC算法为例(有空再添加图片) - 知乎

最后

以上就是内向汽车为你收集整理的DDPG或TD3算法训练时总是输出边界值问题记录的全部内容,希望文章能够帮你解决DDPG或TD3算法训练时总是输出边界值问题记录所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部