Python DDPG不收敛

Python DDPG不收敛,python,tensorflow,reinforcement-learning,Python,Tensorflow,Reinforcement Learning,我试图在tensorflow中实现深层确定性策略梯度算法,但该策略并没有收敛到任何好的地方。我正在测试cartpole问题 随着时间的推移,评论家损失减少到0,演员梯度也收敛到0,但奖励不会增加。这似乎是一个演员的“固定”政策,它推动一个方向的车,直到情节失败。我使用Ornstein-Uhlenbeck过程来添加噪声,sigma随时间衰减,初始角度是随机的,因此代理可以很好地探索状态空间 在演员身上做梯度上升和梯度下降似乎没有什么区别。一定是什么地方出了什么问题,但我不知道怎么找到它 这是顶级参

我试图在tensorflow中实现深层确定性策略梯度算法,但该策略并没有收敛到任何好的地方。我正在测试cartpole问题

随着时间的推移,评论家损失减少到0,演员梯度也收敛到0,但奖励不会增加。这似乎是一个演员的“固定”政策,它推动一个方向的车,直到情节失败。我使用Ornstein-Uhlenbeck过程来添加噪声,sigma随时间衰减,初始角度是随机的,因此代理可以很好地探索状态空间

在演员身上做梯度上升和梯度下降似乎没有什么区别。一定是什么地方出了什么问题,但我不知道怎么找到它

这是顶级参与者更新:

            predicted_actions = actor.get_actions(session, replay_states)
            critic_action_gradients = critic.get_action_gradients(
                session, replay_states, predicted_actions
            )
            gradient_magnitude = actor.update_weights(
                session, replay_states, critic_action_gradients
            )
            actor.update_target_network(session)
这是批评家中的
get\u action\u gradients

def get_action_gradients(self, session, states, actions):
    return [
        session.run(self.action_gradients, feed_dict={
            self.nnet_input_state: np.array([state], dtype=np.float32),
            self.nnet_input_action: np.array([action], dtype=np.float32),
        }) for state, action in zip(states, actions)
    ]
其中,
self.action\u梯度

    self.action_gradients = tf.gradients(self.output, self.nnet_input_action)
这是演员的更新权重:

def update_weights(self, session, replay_states, critic_action_gradients):
    # each row of actor_gradients is multiplied by the corresponding critic gradient
    # then take a column-wise average
    # shape of actor_gradients is len(replay_states) x 6, each column has the
    # shape of the corresponding network weight
    critic_gradients = np.array(critic_action_gradients).reshape((len(replay_states), 1))
    actor_gradients = np.array(self.get_param_gradients(session, replay_states))
    avg_gradients = (actor_gradients * critic_gradients).mean(axis=0)

    new_params = session.run(self.update_weights_ops, feed_dict={
        op: grad for op, grad in zip(self.gradient_placeholders, avg_gradients)
    })

    return sum(np.sum(x) for g in avg_gradients for x in g)
更新权重的图形操作包括:

    self.network_params = [self.weights_1, self.bias_1,
                           self.weights_2, self.bias_2,
                           self.weights_3, self.bias_3]
    self.param_gradients = tf.gradients(self.output, self.network_params)

    self.gradient_placeholders = []
    self.update_weights_ops = []
    for param in self.network_params:
        gradient_placeholder = tf.placeholder(shape=param.shape, dtype=tf.float32)
        update_op = param.assign_add(self.learning_rate * gradient_placeholder)

        self.gradient_placeholders.append(gradient_placeholder)
        self.update_weights_ops.append(update_op)

你有没有偶然发现?@MoneyBall不幸的是没有,我没有:(嗨,你做了什么成功的事吗?我正在尝试为一项人形任务做同样的事情,如果你想,我可以看看你的代码,如果你有在线版本控制工具的话。帮助你也可以帮我指出我的错误。你是在使用4个网络吗?本地和目标都是演员和评论家?然后使用
软更新
,即.polyak求平均值以更新目标网络,使其滞后于本地网络
新权重=self.tau*本地权重+(1-self.tau)*目标权重