1.原因:
选择动作值只在-1 1之间取值
actor网络输出用tanh,将动作规范在[-1,1],然后线性变换到具体的动作范围。其次,tanh激活区是有范围的,你的预激活变量(输入tanh的)范围太大,进入了tanh的饱和区,会导致梯度消失,而且tanh输出的自然就靠近边界了
2.解决方案:
1、网络的输入输出都是归一化之后的,buffer里的{s,a,r,s_}都是同一个数量级的,
2、修改reward能指导网络正确选择动作进行输出
3.输入的数据要标准化或者归一化,然后学习率调小一点。
建议换算法,DDPG改成TD3改动很小,SAC对超参数没这么敏感,不要死磕DDPG,可以参考曾伊言:如何选择深度强化学习算法?MuZero/SAC/PPO/TD3/DDPG/DQN/等(