在gym的mujoco环境中测试DDPG算法时,会出现Actor网络输出的每个动作值在-1到1之间(如果输出层用的激活函数是tanh),但mujoco并不是所有的环境的动作值都是在[-1,1]之间,因此需要将输出的动作值映射到mujoco环境的动作区间。
这其实就是数据的映射问题。首先我们要知道如何将数据归一化映射到任意区间:
假设:
a_n_max: 要映射的目标区间最大值
a_n_min: 要映射的目标区间最小值
a_max: 待映射数据的最大值
a_min: 待映射数据的最小值
a: 当前动作值
a_norm: 归一化映射后的值
a_norm = a_n_min +( (a_n_max - a_n_min)/(a_max - a_min))*(a - a_min)
而我们要做的正好是相反的过程,将归一化后的动作值映射到原本动作值,即将网络输出的动作值a_norm 转化为原本环境的动作值 a:
a = (a_norm - a_n_min) * ((a_max - a_min)/(a_n_max - a_n_min)) + a_min
具体实现的函数如下: