在我的DDPG实现中,我尝试将噪声添加到actor的参数中以进行探索,并在选择动作后恢复参数。但是,该代理无法以预期的方式对参数进行降噪处理,从而导致操作中的参数爆炸。
我按以下方式定义噪声/降噪运算符(应该与定义update_target_op
的方式几乎相同,但是,update_target_op
的效果很好,但是噪声/降噪运算符却不能)
def _noise_params(self):
with tf.variable_scope('noise'):
noise_sigma = tf.get_variable('noise_sigma', initializer=self.init_noise_sigma,
trainable=False)
# noise decay
noise_decay_op = tf.assign(noise_sigma, self.noise_decay * noise_sigma, name='noise_decay_op')
param_noise_pairs = []
for var in self.actor_critic.actor_perturbable_variables:
noise = tf.truncated_normal(tf.shape(var), stddev=noise_sigma)
param_noise_pairs.append((var, noise))
with tf.control_dependencies([noise_decay_op]):
noise_op = list(map(lambda v: tf.assign(v[0], v[0] + v[1], name='noise_op'), param_noise_pairs))
denoise_op = list(map(lambda v: tf.assign(v[0], v[0] - v[1], name='denoise_op'), param_noise_pairs))
return noise_op, denoise_op
并在代理选择操作时运行它们
def act(self, state):
# if I comment out sess.run(self.noise_op) and sess.run(self.denoise_op), the parameters will behave normally
self.sess.run(self.noise_op)
state = state.reshape((-1, self.state_size))
action = self.sess.run(self.actor_critic.actor_action, feed_dict={self.actor_critic.state: state})
self.sess.run(self.denoise_op)
return np.squeeze(action)
其中self.noise_op==noise_op
和self.denoise_op==denoise_op
。下图是张量板的快照,在其中我们可以看到actor中异常大的参数。
为什么会这样?我该如何解决?
这是我在github上的代码:https://github.com/xlnwel/ddpg-bipedal