Tensorflow:为什么向参数添加噪声会导致它们爆炸?

时间:2018-10-06 03:20:50

标签: tensorflow reinforcement-learning

在我的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_opself.denoise_op==denoise_op。下图是张量板的快照,在其中我们可以看到actor中异常大的参数。

为什么会这样?我该如何解决?

enter image description here 这是我在github上的代码:https://github.com/xlnwel/ddpg-bipedal

0 个答案:

没有答案