Python生成器而不是类对象作为强化学习环境

时间:2018-05-11 00:25:44

标签: python reinforcement-learning

使用强化学习环境的典型方式如下:

env = Environment()
while not env.done:
    state = env.state
    action = choose_action(state)
    env.step(action)
results = env.results

但这样不会更加pythonic:

env = Environment()
for state in env:
    action = choose_action(state)
    env.step(action)
else:
    results = env.results

它有什么不同?我可以看出两个原因。

  • 更少的代码:在后一个示例中,我们不需要担心env.done或跟踪我们所处的状态,生成器会在我们自动离开的地方找到
  • 轻松复制:我们可以轻松复制每个州的发电机,以评估不同的策略

我们循环遍历对象我们在循环中进行变异,但是由于引入了生成器.send()方法,这不是可以接受的吗?

2 个答案:

答案 0 :(得分:1)

“强化学习”范式包括在环境中反复执行一个动作,该动作反过来又会返回一个新状态(还有奖励,一些信息和一个布尔值,告诉您情节是否完成)。

围绕环境的所有可能状态与RL的<精神>精神不一致。这是一个示例来说明我的意思:

假设机器人必须给一杯咖啡分级。在每毫秒,机器人都会收到来自其内部摄像头的图像。那么,状态空间就是其相机可以返回的可能图像的状态,对吗?这样做

for state in env:
    action = choose_action(state)
    env.step(action)

意味着先后看到世界可以给他的所有可能的图像,机器人将做出相应的动作,这显然是。您希望他按照他从先前状态中看到的内容采取行动,以做出新的一致动作。

因此,明确定义此代码的动态性更有意义:

while not env.done:
    state = env.state
    action = choose_action(state)
    env.step(action)
results = env.results

实际上,这意味着,只要机器人没有抓住杯子,他就应该观察环境并采取行动。然后,他查看新状态并根据新状态进行新操作,依此类推。

答案 1 :(得分:0)

当然可以接受。 使用发电机是优雅的,但你没有被迫在任何地方坚持它们。实际上我认为while片段是最清晰的,因为推送状态会增加一些开销,并且Python中的可变性通常很昂贵。

然而,既然你的问题,而不是一个问题更像是编码风格和个人意见的问题,那么就会有不同的意见,我无法真正解决这个问题。

我会避免可变性并坚持while