深度Q学习修改

时间:2018-10-04 22:25:35

标签: python machine-learning deep-learning reinforcement-learning

@编辑:

我正在尝试使用卷积nnet来创建一个玩俄罗斯方块游戏的代理,该卷积nnet将板状态+当前块作为输入。根据我的阅读,我刚刚证实,深度Q学习并不是很好。

@end编辑

假设代理正在学习玩游戏的策略,其中每个游戏步骤都可以表示为

  

s,a,r,s'完成

代表

  

状态,动作,奖励,下一个状态,游戏结束

Deep Q-learning 算法中,代理处于 s 状态,并采取了某些 a 动作(在 epsilon之后-greedy 策略),观察奖励 r 并进入下一个状态 s'

代理的行为如下:

# returns an action index
get_action(state, epsilon)
   if random() < epsilon
       return random_action_index
   else
      return argmax(nnet.predict(state))

通过贪婪地观察状态 s'中的最大Q值来更新参数,因此我们有了

# action taken was 'a' in state 's' leading to 's_'
prediction = nnet.predict(s)
if done
   target = reward
else
   target = reward + gamma * max(nnet.predict(s_))

prediction[a] = target

[预测目标]被馈送到某些nnet进行体重更新。因此,此nnet获得状态 s 作为输入,并输出维度为 n_actions 的q值向量。这对我来说很清楚。

现在,假设我的状态动作如此杂乱,以至于这种方法根本行不通。因此,我的nnet输出不是输出维度为 n_actions 的向量,而是一个单一值,表示“状态质量”(该状态的理想程度)。

现在我的经纪人是这样的:

# returns an action based on how good the next state is
get_action(state, epsilon):
    actions = []
    for each action possible in state:
         game.deepcopy().apply(action)
         val = nnet.predict(game.get_state())
         action.value = val
         actions.append(action)

    if random() < epsilon
        return randomChoice(actions)
    else
        return action with_max_value from actions

我的[预测目标]如下:

# action taken was 'a' in state 's' leading to 's_'
prediction = nnet.predict(s)
if done
   target = reward
else
   target = reward + gamma * nnet.predict(s_)

我对第二种算法有一些疑问:

  

a)有时候不贪婪地行事有意义吗?

直觉上不,因为如果我处于不良状态,那可能是由于不良的随机动作,而不是因为先前状态为“不良”。 Q学习更新将调整错误的动作,但是第二个算法将错误地调整先前的状态。

  

b)这是哪种算法?强化学习在哪里适合?

     

c)对于俄罗斯方块,状态几乎永远不会重复,那么在这种情况下我该怎么办?这是深度q学习失败的原因吗?

这看起来可能令人困惑,但是该算法确实有效。如有必要,我可以提供其他详细信息,谢谢!

1 个答案:

答案 0 :(得分:0)

  

现在,假设我的状态动作如此杂乱,以至于这种方法根本行不通。因此,我的nnet输出不是输出维度为 n_actions 的向量,而是一个单一值,表示“状态质量”(该状态的理想程度)。

     

现在我的经纪人是这样的:

# returns an action based on how good the next state is
get_action(state, epsilon):
    actions = []
    for each action possible in state:
         game.apply(action)
         val = nnet.predict(game.get_state())
         action.value = val
         actions.append(action)

    if random() < epsilon
        return randomChoice(actions)
    else
        return action with_max_value from actions

首先简要说明一下该伪代码:我认为这不起作用,因为您没有模拟不同动作对游戏状态副本的影响,而只是模拟了游戏状态直接。您可能需要先创建游戏状态的单独副本,然后在不同副本上运行一次每个动作。

无论如何,通常认为这种算法在强化学习设置中是不可能的。在RL中,我们通常在没有“模拟器”或“转发模型”或类似条件的前提下进行操作。通常,我们假设我们有一个位于真实环境中的代理,可以在其中产生可以用来学习的经验。在这种假设下,我们无法实现那种for each action possible in state循环,该循环模拟如果我们要在同一游戏状态下执行不同的动作,将会发生什么情况。假设我们首先必须选择一个动作,执行该动作,然后从该特定的经历轨迹中学习; 我们无法再“返回” ,想象我们选择了一个不同的动作,并且还可以从该轨迹中学习。

当然,在实践中通常可以这样做,因为我们实际上确实有一个模拟器(例如机器人模拟器或游戏等)。 RL中的大多数研究仍然假设我们没有这样的模拟器,因为这导致最终可能在“现实世界”情况下使用的算法(例如,现实世界的物理机器人)。实施您上面描述的想法实际上意味着您正在朝着搜索算法(例如蒙特卡洛树搜索)而不是强化学习算法发展。这意味着您的方法仅限于您有可用的模拟器(例如游戏)的场景。


  

a)有时候不贪婪地行事有意义吗?

即使您包括了遍历所有动作并模拟其所有效果的类似于搜索的过程,但我想如果您想收敛于好的政策,您仍然必须进行某种形式的探索,因此您将拥有有时不贪婪地行动。是的,看起来这将导致您的算法收敛到与传统的“最优策略”解释不同的东西。如果您的epsilon值很低,那么这并不是太大的问题。在实践中,它可能会成为一种稍微“安全”的策略。另请参见my answer to this other question

  

b)这是哪种算法?强化学习在哪里适合?

除了我上面关于该搜索实际上如何朝搜索算法而非RL算法领域发展的讨论之外,在我看来,这也将是一种 on-policy 算法,而不是关闭策略算法(标准的Q学习是关闭策略的,因为它了解贪婪策略,同时通过非贪婪策略产生经验)。我上面上面链接的问题的大多数答案也详细讨论了这种区别。