代码之家  ›  专栏  ›  技术社区  ›  Fernando

深度Q-学习修正

  •  0
  • Fernando  · 技术社区  · 6 年前

    @编辑:

    s、 a,r,s'完成

    代表

    深度Q学习 算法,代理处于 s 采取一些行动 (遵循 政策),观察奖励 r 到达下一个州

    代理人的行为如下:

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

    通过贪婪地观察状态下的最大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
    

    [prediction,target]被馈送到某个nnet以进行权重更新。所以这个网络有一个状态 s 作为输入,输出具有维数的q值向量 n\U操作

    现在,假设我的州行动是如此的喧闹,以至于这种方法根本不起作用。所以,不是输出一个维数的向量 ,我的nnet输出是一个值,表示“状态质量”(该状态有多理想)。

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

    # 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_)
    

    关于第二种算法,我有一些问题:

    b) 这是什么算法?它在强化学习中适合什么?

    这看起来可能令人困惑,但算法实际上是有效的。我可以提供额外的细节,如果需要的话,谢谢!

    1 回复  |  直到 4 年前
        1
  •  0
  •   Dennis Soemers    6 年前

    现在,假设我的州行动是如此的喧闹,以至于这种方法根本不起作用。所以,不是输出一个维数的向量 n\U操作 ,我的nnet输出是一个值,表示“状态质量”(该状态有多理想)。

    # 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 .

    论政策 算法而不是 关闭策略 算法(标准Q-学习是关闭策略,因为它学习贪婪策略,同时通过非贪婪策略生成经验)。我在上面提到的大多数问题的答案也详细讨论了这一区别。