我如何用Keras训练一个DDPG,根据它的观察值来回送点?

2024-04-18 22:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试训练一个强化学习模型,以便使用^{}将某个点反馈给我。在

我的代码如下所示,使用的世界形状为20x20。在

import numpy as np
import rl.core as krl


class EchoEnv(krl.Env):

    def __init__(self):
        self.shape = np.array([20, 20])
        self.desired = np.random.rand(*self.shape.shape)

    def step(self, action):

        action = np.clip(action, 0, 1) * self.shape
        self.action = action

        observation = self.desired

        dx = action - (self.desired * self.shape)
        distance_to_goal = np.sqrt((dx**2).sum())

        done = distance_to_goal < 1

        reward = -distance_to_goal

        # observation, reward, done, info
        return observation, reward, done, {}

    def reset(self):
        self.desired = np.random.rand(*self.shape.shape)
        return self.desired

每次迭代,提供的observation是当前的随机self.desired值。(代理应学习立即返回此值。done值表示所选点是否在合理的误差范围内。提供的奖励是-distance,因此它应该选择一个离目标更近的点来最大化这个值。在

^{pr2}$

actor是一个Sequential模型,从一个初始的Flatten层开始。添加一些数量的(在本例中,actor_n = 3)具有16个节点的Dense层,然后是ReLU激活。最后,添加一个Dense层,该层具有nb_actions节点(在本例中,2)和sigmoid激活。在

批评家从动作和观察的Input层开始,观察是Flattened。输出被定义为concatenated动作和平坦的观察输入。添加一些带有32个节点的Dense层的数目(在本例中,critic_n = 3)之后,ReLU激活。最后,使用线性激活函数添加带有1节点的Dense层。在

使用的随机进程是Ornstein–Uhlenbeck process,带有mu = 0sigma = 0.1和{}。在

{actor}(最后,在上面的代码中创建了另一个actor)。它是用一个^{}优化器编译的,它的学习率是0.01,平均绝对误差度量。在


理论上,这个代理应该很快学会返回观察到的值将提供最高的回报。然而,有两个主要问题。在

学习不一致

偶尔,随机地,这会有用的。它将开始返回与所提供的观察结果非常接近的动作,获得范围为[-1, 0)的奖励,这是可能的最佳回报。在

然而,这里需要注意的是“随机性”。通常,它会训练数万步,而不是学习这个简单的属性。偶尔,偶然的,它似乎起作用了。在

输出不变

如果在找到最优策略之前取消训练,算法会反复猜测相同的错误值。我以前的机器学习经验让我有理由相信,即使在测试过程中,代理也应该尝试优化其策略,努力使回报最大化并迅速结束事件,而不是“放弃”并反复选择相同的值。在


我的环境似乎没有问题。因此,问题一定出在我的DDPG模型中。我的直觉告诉我,一定是有层次的东西,无论是演员还是评论家。然而,问题很可能与任何其他参数有关,包括随机过程或优化器中的参数。在

我如何着手解决这些问题?


Tags: to模型self节点defnpactiondense