概述
最近在使用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算法训练时总是输出边界值问题记录所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复