【问题标题】:DDPG lerning problem with Tensorflow 2 implementationTensorflow 2 实现的 DDPG 学习问题
【发布时间】:2019-12-24 15:25:28
【问题描述】:

我正在尝试使用 tensorflow 2 实现 DDPG。 问题在于它不会学习:即使在添加了一些噪音和一些利用与探索因素之后,代理似乎每次都停留在一个通用方向上,只是改变了它的强度。

这是我的 Actor 神经网络:

    d1 = self.dense(states, weights[0], weights[1])
    d1 = tf.nn.relu(d1)
    d2 = self.dense(d1, weights[2], weights[3])
    d2 = tf.nn.relu(d2)
    d3 = self.dense(d2, weights[4], weights[5])
    d3 = tf.nn.tanh(d3)
    return d3*self.action_bounds

这是它的训练功能:

def train(self, states, critic_gradients):
    with tf.GradientTape() as t:
        actor_pred = self.network(states)

    actor_gradients = \
        t.gradient(actor_pred, self.weights, -critic_gradients)
    actor_gradients = list(map(lambda x: x/self.batch_size, actor_gradients))

    self.opt.apply_gradients(zip(actor_gradients, self.weights))

critic_gradients 是由critic 类获取的。

评论网和演员的网差不多:

def _network(self, states, actions, weights, axis):
    x = tf.concat([states, actions], axis=axis)
    d1 = self.dense(x, weights[0], weights[1])
    d1 = tf.nn.relu(d1)
    d2 = self.dense(d1, weights[2], weights[3])
    d2 = tf.nn.relu(d2)
    d3 = self.dense(d2, weights[4], weights[5])
    d3 = tf.nn.relu(d3)
    return d3

使用权重: self.shapes = [ [self.state_size+self.action_size, 64], [64], [64, 32], [32], [32, 1], [1] ]

Critic 训练在均方误差函数损失上具有简单的最小化函数。

我不知道错误是在主要的(我在主要论文之后写的)还是在类中。 需要注意的一点是,我用一个简单的数据集测试了critic 的网络并且它收敛了。 我不知道如何尝试actor网络,我只是在使用带有Pendulum环境的Gym。

【问题讨论】:

    标签: tensorflow neural-network reinforcement-learning


    【解决方案1】:

    您没有提供完整的算法代码。 检查DDPG paper 了解网络架构和超参数,因为它在论文中证明相同的算法配置对于不同的问题和环境非常有效。 确保正确使用目标网络、体验回放、探索...

    • 目标网络使学习稳定。对于 Critic 网络更新,您实际上应该使用来自 Target Actor 和 Target Critic 网络的结果,并使用来自回放缓冲区的数据样本基于 Q-learning 计算 TD-error。

    • 对于 off-policy 算法,如 DDPG,只需在动作中直接添加噪声即可解决探索问题。您可以根据环境选择噪声函数(再次参考纸上并检查 Ornstein-Uhlenbeck 噪声函数)。

    【讨论】:

    • 问题出在实现上。这是我的新仓库。演员上方的梯度上升似乎不起作用github.com/bebbo203/DDPG