我正在尝试训练一个强化学习模型,以便使用^{
我的代码如下所示,使用的世界形状为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
,因此它应该选择一个离目标更近的点来最大化这个值。在
actor是一个Sequential
模型,从一个初始的Flatten
层开始。添加一些数量的(在本例中,actor_n = 3
)具有16个节点的Dense
层,然后是ReLU激活。最后,添加一个Dense
层,该层具有nb_actions
节点(在本例中,2
)和sigmoid激活。在
批评家从动作和观察的Input
层开始,观察是Flatten
ed。输出被定义为concatenate
d动作和平坦的观察输入。添加一些带有32个节点的Dense
层的数目(在本例中,critic_n = 3
)之后,ReLU激活。最后,使用线性激活函数添加带有1
节点的Dense
层。在
使用的随机进程是Ornstein–Uhlenbeck process,带有mu = 0
、sigma = 0.1
和{
{actor}(最后,在上面的代码中创建了另一个actor)。它是用一个^{0.01
,平均绝对误差度量。在
理论上,这个代理应该很快学会返回观察到的值将提供最高的回报。然而,有两个主要问题。在
偶尔,随机地,这会有用的。它将开始返回与所提供的观察结果非常接近的动作,获得范围为[-1, 0)
的奖励,这是可能的最佳回报。在
然而,这里需要注意的是“随机性”。通常,它会训练数万步,而不是学习这个简单的属性。偶尔,偶然的,它似乎起作用了。在
如果在找到最优策略之前取消训练,算法会反复猜测相同的错误值。我以前的机器学习经验让我有理由相信,即使在测试过程中,代理也应该尝试优化其策略,努力使回报最大化并迅速结束事件,而不是“放弃”并反复选择相同的值。在
我的环境似乎没有问题。因此,问题一定出在我的DDPG模型中。我的直觉告诉我,一定是有层次的东西,无论是演员还是评论家。然而,问题很可能与任何其他参数有关,包括随机过程或优化器中的参数。在
我如何着手解决这些问题?
目前没有回答
相关问题 更多 >
编程相关推荐